HTTP协议详解
一、基本特性
- 基础信息:
超文本传输协议,应用层,基于TCP/IP的通信协议,默认80端口 - 特性:
- 1 HTTP 是无连接的: HTTP客户端,即浏览器发出请求后,客户端等待响应。服务器处理该请求并发送回响应,然后客户端断开连接。客户端和服务器仅在当次请求中互相了解,至于上一次是否有连接或者连接的信息是无从得知的。
- 2 HTTP是独立于媒体的: 这意味着,只要客户端和服务器都知道如何处理数据内容,任何类型的数据都可以通过HTTP发送。客户端和服务器都需要使用适当的 MIME 类型 指定内容类型。
- 3 HTTP是无状态的: 如上所述,HTTP 是无连接的,这是 HTTP 是无状态协议的直接结果。服务器和客户端仅在当前请求期间彼此知道,之后他们俩彼此忘记。由于协议的这种性质,客户端和浏览器都无法在整个网页的不同请求之间保留信息。
- HTTP请求构成
- 1 请求行
举个例子,谷歌浏览器检查network复制过来的1
2
3
4
5Request URL: https://www.cnblogs.com/ajax/wechatshare/getconfig?url=https%3A%2F%2Fw.cnblogs.com%2Frickiyang%2Fp%2F13138574.html
Request Method: GET
Status Code: 200
Remote Address: 101.37.113.127:443
Referrer Policy: no-referrer - 2 请求头
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17:authority: www.cnblogs.com
:method: GET
:path: /ajax/wechatshare/getconfig?url=https%3A%2F%2Fw.cnblogs.com%2Frickiyang%2Fp%2F13138574.html
:scheme: https
accept: application/json, text/javascript, */*; q=0.01
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
cache-control: no-cache //控制缓存,这里是不使用缓存
cookie: _ga=GA1.2.903872557.1617762465; __gads=ID=539c3a3e492284af:T=1617848011:S=ALNI_MZj7lhU_fTAc1DcwwbX1jJpMyo6uQ; UM_distinctid=178f350fa35495-0383aa838dfed7-33687008-1aeaa0-178f350fa369d1; CNZZDATA1264404098=1000513726-1618985257-https%253A%252F%252Fwww.google.com.hk%252F%7C1619659910; .AspNetCore.Antiforgery.b8-pDmTq1XM=CfDJ8L-rpLgFVEJMgssCVvNUAjtoaL8rG8xCwsEHc-XDEA-9RK4dl6lSwYE7Xq9kXMgXKo5xzeThUdP-FsBv7AIUu4hS1UVLV-CQrbiSrVUBGUYt1TfkO8yPGA4EFYwIuU7tOFE0WQxL3S6TpoyFUX4c5lQ; CNZZDATA1260761432=1123216222-1625560293-https%253A%252F%252Fwww.google.com.hk%252F%7C1625560293; _gid=GA1.2.887776284.1625734040 //携带的cookie
pragma: no-cache
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
x-requested-with: XMLHttpRequest - 3 请求体
url: https://w.cnblogs.com/rickiyang/p/13138574.html - 4 响应头
1
2
3
4
5content-encoding: gzip//编码方式
content-type: text/html; charset=utf-8//报文媒体类型
date: Sat, 10 Jul 2021 04:14:50 GMT
strict-transport-security: max-age=2592000; includeSubDomains; preload
vary: Accept-Encoding - 状态码
类别 说明
1XX Informational(信息性状态码)
2XX Success(成功状态码)
3XX Redirection(重定向)
4XX Client Error(客户端错误状态码)
5XX Server Error(服务器错误状态码)
2XX 成功
200 :OK 一切正常,对GET和POST请求的应答文档跟在后面。
3XX 重定向
301 :Moved Permanently 客户请求的文档在其他地方,新的 URL 在 Location 头中给出,浏览器应该自动地访问新的 URL。
302 :Found 类似于 301,但新的 URL 应该被视为临时性的替代,而不是永久性的。
(
301,302区别:
301:缓存很久,a不可访问,会把b内容缓存到b网页
302:不缓存(除非指定了要缓存),抓取b网页内容保存为a网址
302可能的危害:网址劫持,小网站做一个302到一个大网站,可能网址显示的是大网站地址,内容却是小网站的。
)
304 :Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供 If-Modified-Since 头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
4XX 客户端错误
404 :Not Found 无法找到指定位置的资源。这也是一个常用的应答。
5XX 服务器端错误
500:Internal Server Error 服务器故障。
503:Service Unavailable 服务器处于超负载或正在停机维护。
粗体的状态码比较常见,其余的需要了解。
- HTTP版本发展
- 1 0.9—只传输静态页面,只有请求行,返回的只有数据(ASCII码),基本只有HTML文件。
- 2 1.0—需要交互、图片、视频、动态生成等
特性:
HTTP/1.0 版本是一种无状态、无连接的应用层协议。
浏览器与服务器每次请求都要建立连接,服务器处理完毕立刻断开连接。即浏览器与服务器之间只保持很短的连接时间。
队头阻塞。HTTP/1.0规定下一个请求必须在前一个请求响应到达之后才能发送。即如果前一个请求响应一直不达到那么下一个请求也不会发送,后面的一直被阻塞。 - 3 1.1
解决了1.0的两个问题—是否可以不用每次都重新建立连接;请求是否可以并行化,不用被阻塞。
特性:
首先是长连接。HTTP/1.1增加了一个 Connection 字段,通过设置 Keep-Alive 可以保持 HTTP 连接不断开,避免了每次客户端与服务器请求都要重复建立释放建立TCP连接,提高了网络的利用率。如果客户端想关闭 HTTP 连接,可以在请求头中携带 Connection: false来告知服务器关闭请求。
其次是 HTTP/1.1支持请求管道化(pipelining)。基于 HTTP/1.1 的长连接,使得请求管线化成为可能。管线化使得请求能够“并行”传输。举个例子来说,假如响应的主体是一个 html 页面,页面中包含了很多 img,这个时候 keep-alive 就起了很大的作用,能够进行“并行”发送多个请求。
在HTTP/1.1 中增加 Host 请求头字段。我们可以在一台 WEB 服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟 WEB 站点。
HTTP/1.1 还提供了与身份认证、状态管理和 Cache 缓存等机制相关的请求头和响应头。
HTTP/1.1 支持断点续传。
但实际上并未解决阻塞问题,因为还是按照请求顺序返回数据,仍可能阻塞。 - 4 2.0
二分帧与多路复用:把请求和响应分成很多二进制编码的帧,在一个TCP链接里复用,重新组装,可以达到并行请求的效果
流优先级控制,先请求的优先处理
允许服务器在客户端缓存中填充数据,服务器推送
头部压缩
HTTP与HTTPS
HTTP为明文传输,如果中间有人获取了这个明文那么可能就会有安全事故,所以出现了HTTPS—安全套接字层超文本传输协议
为了数据传输的安全,https在http的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密
https协议的主要作用可以分为两种:
建议一个信息安全通道,来保证数据传输的安全
确定网站的真实性。
https是443端口
缺点:
https协议会使加载时间变得较长点,增加数据开销和功耗
https过程:(非对称加密)
首先客户端通过URL访问服务器建立SSL连接。
服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。
客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
服务器利用自己的私钥解密出会话密钥。
服务器利用会话密钥加密与客户端之间的通信。
5.总结整个过程:
1.服务器向CA机构获取证书(假设这个证书伪造不了),当浏览器首次请求服务器的时候,服务器返回证书给浏览器。(证书包含:公钥+申请者与颁发者的相关信息+签名)
2.浏览器得到证书后,开始验证证书的相关信息,证书有效(没过期等)。(验证过程,比较复杂,详见上文)。
3.验证完证书后,如果证书有效,客户端是生成一个随机数,然后用证书中的公钥进行加密,加密后,发送给服务器,服务器用私钥进行解密,得到随机数。之后双方便开始用该随机数作为钥匙,对要传递的数据进行加密、解密。