HTTP简介
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。
HTTP属于TCP/IP协议族内部的一个子集,TCP/IP协议族按层次分别应用层、传输层、网络层和数据链路层,HTTP协议就处于应用层。

URL
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
URL是一种特殊的URI,是URI的子集。URI用字符串标识某一互联网资源,而URL表示资源的地点。

简单的HTTP协议
HTTP协议用于客户端和服务器之间的通信。HTTP协议规定,请求从客户端发出,最后服务器响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接受到请求之前不会发送响应。

请求报文:由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。

响应报文:由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。

请求方法:
- GET :请求访问已被URI识别的资源。如果请求的资源是文本→原样返回;请求的是程序(例如CGI)→返回输出结果。
- POST:传输实体的主体。向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
- HEAD:获取报头,类似于get请求,只是不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等。
- PUT:从客户端向服务器传送的数据取代指定的文档的内容(安全性低,需要配合验证或者REST架构使用)。
- DELETE:按请求URI删除指定的资源(安全性低,一般不用,需要配合验证或者REST架构使用)。
- CONNECT :与代理服务器通信时使用隧道协议进行TCP通信。
- OPTIONS:用来查询指定URI资源支持的方法。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的。(容易引发XST攻击,通常不会用到此方法)
- LINK和UNLINK:被HTTP/1.1废弃,此处不提
GET和POST的比较:
\ | GET | POST |
---|---|---|
请求 | 在 GET 请求的 URL 中发送 | 在 POST 请求的 HTTP 消息主体中发送 |
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
对数据长度的限制 | URL 的长度是受限制的(URL 的最大长度是 2048 个字符) | 无限制 |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制。也允许二进制数据 |
安全性 | GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET,此外还容易造成CSRF攻击 | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中 |
可见性 | 数据在 URL 中对所有人都是可见的 | 数据不会显示在 URL 中 |
注意点:
- GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接,例如
www.baidu.com?username=XiaoA&password=123456
,如果数据是英文字母/数字,原样发送,如果是+号,转换为空格(这里是坑,需要注意,有时候服务器get拿到字符串需要把空格转成+号再交给业务代码操作),如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。 - GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
状态码:
状态码的类别:
- 1xx:指示信息--表示请求已接收,正在处理
- 2xx:成功--表示请求已被成功接收、理解、接受、处理完毕
- 3xx:重定向--要完成请求必须进行更进一步的操作
- 4xx:客户端错误--请求有语法错误或请求无法实现
- 5xx:服务器端错误--服务器处理请求出错
常见状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
HTTP工作原理(当输入一个网址后,发生了什么?)
:
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址
- 浏览器根据该 IP 地址和默认端口 80,和服务器建立TCP套接字连接。
- 通过TCP套接字,浏览器(客户端)发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器。
- 服务器接受请求并返回HTTP响应
- 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接(四次挥手);若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。
- 客户端浏览器解析HTML内容并显示。
HTTP的特点:
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,一般使用cookie解决。
- 支持B/S及C/S模式。
HTTP1.0、HTTP1.1 、HTTP2.0、HTTPS:
网上总结的很好直接放链接了嘿嘿
https://blog.csdn.net/summy_J/article/details/76578239
https://www.jianshu.com/p/be29d679cbff
https://www.jianshu.com/p/11c2614ef3f2
感想总结:
- 《图解HTTP》非常棒,辅以画图讲解,通俗易懂
- 关于http的坑也不少,写网络api时出现过各种bug,例如那个+号会自动转换为空格,那天让我debug了好久!
网友评论