HTTP协议
最近在做WEB开发,对HTTP的一些认识和学习进行总结
文章目录
一、协议特点
1.1、支持客户端/服务端模式
是一种请求/响应模式的协议。
1.2、简单快速
当客户端向服务端请求时,只需要传输请求方法和路径,就能访问。
1.3、灵活
HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
1.4、无连接
每请求一次,就释放一次连接,每次连接只能处理一个请求,优点就是实现简单,不会一直占用资源。这是针对HTTP1.0来说的,后续版本出现了长链接,以解决效率问题。当HTTP协议头部中字段Connection:keep-alive表示支持长链接。
1.5、无状态
指对于事务处理没有记忆能力,意味着后续处理如果需要前面的信息,则必须重传,从而可能导致传输的数据量较大。但这同时也以为这不需要前面信息时可以更快地响应。于是session和cookie应运而生。
二、TCP连接
2.1、TCP三次握手
- 第一次握手:客户端发送带有SYN标志的数据包到服务端;客户端确认自己发送正常。
- 第二次握手:服务端发送带有SYN/ACK标志的数据包到客户端:客户端确认自己发送、接收正常,确认对方发送、接收正常;服务端确认自己接收正常,对方发送正常。
- 第三次握手:客户端发送带有ACK标志的数据包到服务端:客户端确认自己发送、接收正常,确认对方发送、接收正常;服务端确认自己发送、接收正常,对方发送、接收正常。
需要三次握手才能让双方确认自己和对方都是正常的。
2.2、TCP报文包
TCP头信息+TCP数据体
TCP头信息包含了以下6种控制位:
- URG: urgent data,这是一条紧急信息;
- ACK:确认已收到
- PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据
- RST:表示要求对方重新建立连接
- SYN:表示请求建立一个连接
- FIN:表示通知对方本端要关闭连接了
三、断开连接(HTTP版本、四次挥手和HTTPS)
3.1、HTTP版本
3.1.1 HTTP1.0
每一次请求,会建立一个TCP连接,完成响应后,TCP连接断开,下次请求时会重新建立TCP连接。
3.1.2 HTTP1.1
一次请求/响应完成后,允许不断开TCP连接,后续的请求/响应直接使用这个TCP连接,而不再建立新连接。即长连接,一次TCP连接允许多次HTTP会话。浏览器在请求时请求头会携带一个参数:Connection:keep-alive,表示浏览器要求与服务器建立长链接,服务器也可以设置是否愿意建立长连接。
3.1.3 HTTP2.0
- 同域名的所有通信都在单个连接完成,更高效,避免频繁建立TCP连接;
- 单个连接可以承载任意数量的双向数据流;
- 多路复用的流。数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装。
- HPACK,HTTP/2头部压缩,使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送。
二进制协议
前三点说明:HTTP1.1虽然可以建立长连接,但是为了实现高并发,不得不使用多个TCP连接的方式,但不同浏览器对于多开的数量有限制。在HTTP2.0中,引入了流的概念,可以在一条 TCP中乱序流水线的发送和接收流,再在终点组装header和data。
3.2、四次挥手
- 客户端发出连接释放报文,并且停止发送数据
- 服务端收到连接释放报文,发出确认报文。
- 服务端将最后的数据发送完毕,向客户端发送连接释放报文
- 客户端收到服务器的连接释放报文后,发出确认,客户端等待2MSL后关闭;服务器收到客户端发出的确认后进入关闭状态。
3.3、HTTPS
HTTPS为了解决HTTP以明文方式进行数据传输,不提供任何形式的数据加密问题而诞生。HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS协议主要是两种作用:一种是建立一个信息安全通道,来保证数据传输的安全,另一种就是确认网站的真实性。
与HTTP的区别:
- HTTPS协议需要到CA申请证书。
- HTTP是超文本传输协议,是明文传输,HTTPS则是具有安全性的SSL/TLS加密 传输协议。
- HTTP默认端口是80,HTTPS默认端口是443.
- HTTP连接是无状态的;HTTPS是由SSL/TLS+HTTP协议构建的可进行加密传输、 身份认证的网络协议,比HTTP协议更安全。
3.3.1 CA证书
加密原理:
第一层:HTTPS是为了实现加密通信,本质上是双方都持有一个对称加密的密钥,然后进行安全通信。但是对于第一次传输的对称密钥,无论是从服务端到客户端或者是相反,在传输中都有被篡改的风险,因此采用加密传输。
第二层:为了避免被篡改,使用非对称加密传输对称秘钥。那么就需要将公钥传给客户端,让客户端可以解密得到对称密钥。但是公钥在网络中明文传输,也有被攻击的风险,因此引入第三方机构。
第三层:引入CA证书机构,让服务端把公钥传输给CA证书机构,让CA用CA的密钥加密,然后返回加密结果。
为什么不能直接使用非对称加密?
第一,中间人可以在服务端和客户端交换公钥时,替换公钥。
第二,截获客户端消息,篡改后用服务器的公钥加密后发往服务器,服务器将收到错误的消息。
第三,非对称加密更耗资源。
3.3.2 SSL和TLS
SSL:安全套接字层,位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。由SSL记录协议和SSL握手协议组成。
TLS: 传输层安全协议,是HTTP和TCP协议之间的一层,通常TLS发生在TCP三次握手之后,此时进行TLS四次握手,然后再进行HTTP通信。
下图是一个nginx配置ssl证书的例子
TIPS:
- 文本协议和二进制协议
文本协议:由一串ASCLL码字符组成的数据,包括数据,大小写字母,百分号,还有回车、换行和空格等。文本协议便于理解,解析复杂。
二进制协议:二进制协议是一串字节流,通常包含消息头和消息体,消息头的长度固定,并且包含了消息体的长度。二进制协议字段较固定,传输高效,解析高效,不便于调试。
参考:
- https://blog.csdn.net/qq_35642036/article/details/82788421?utm_source=app&app_version=4.18.0&code=app_1562916241&uLinkId=usr1mkqgl919blen《HTTP与HTTPS的区别,详细介绍》
- https://blog.csdn.net/weixin_42709563/article/details/106433654?utm_source=app&app_version=4.18.0&code=app_1562916241&uLinkId=usr1mkqgl919blen 《一文搞懂HTTP协议(带图文)》