JTangming / blog

My repository on GitHub.
Other
53 stars 0 forks source link

HTTP/S/2 & WebSocket 阅读笔记 #20

Open JTangming opened 5 years ago

JTangming commented 5 years ago

阅读范围:

JTangming commented 5 years ago

网络分层模型和TCP/IP协议族

协议的战争: osi、tcp/ip

TCP/IP 的分层管理 TCP/IP 协议族分为4层:应用层、传输层、网络层和数据链路层 作用:

OSI 是由国际标准化组织ISO提出的 Open System Interconnection Reference Model,它的layer 7如下: 两者关系图谱如下: TCP/IP 的分层

JTangming commented 5 years ago

TCP

TCP/IP 也常被称为“因特网协议套件”,IP 即 Internet Protocol(因特网协议),负责联网主机之间的路由选择和寻址;TCP 即 Transmission Control Protocol(传输控制协议),负责在不可靠的传输信道之上提供可靠的抽象层。

三次握手和四次挥手

TCP 提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接,采用4次挥手来关闭一个连接。

TCP 可以看成是一种字节流,它会处理 IP 层或以下的层的丢包、重复以及错误问题。

三次握手和四次挥手的状态转换如下图: handshake

三次握手:

三次握手的最终结论是:客户端和服务端都确认了各自以及对方的接收、发送能力是正常的。

四次挥手

参照上图,其流程与三次握手类似,差别是在服务端回包的时候,服务端发出的 FIN\ACK 是分开的。这是因为收到客户端发出的 FIN 包,服务端及时回应 ACK;服务端发 FIN 包要在所有数据响应完成后发出,所以 FIN\ACK 是分开的。

需要理解的几个概念

报文信息

tcp-format

字段 长度 含义
Source Port 16比特 源端口,标识哪个应用程序发送。
Destination Port 16比特 目的端口,标识哪个应用程序接收。
Sequence Number 32比特 序号字段。TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
Acknowledgment Number 32比特 确认号,是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。
Data Offset 4比特 数据偏移,即首部长度,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,以32比特(4字节)为计算单位。最多有60字节的首部,若无选项字段,正常为20字节。
Reserved 6比特 保留,必须填0。
URG 1比特 紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
ACK 1比特 确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。
PSH 1比特 标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付。
RST 1比特 重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。
SYN 1比特 同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。
FIN 1比特 发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。
Window 16比特 窗口:TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端正期望接收的字节数。窗口最大为65535字节。
Checksum 16比特 校验字段,包括TCP首部和TCP数据,是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
Urgent Pointer 16比特 紧急指针,只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
Options 可变 选项字段。TCP协议最初只规定了一种选项,即最长报文段长度(数据字段加上TCP首部),又称为MSS。MSS告诉对方TCP“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”。

新的RFC规定有以下几种选型:选项表结束,无操作,最大报文段长度,窗口扩大因子,时间戳。

  • 窗口扩大因子:3字节,其中一个字节表示偏移值S。新的窗口值等于TCP首部中的窗口位数增大到(16+S),相当于把窗口值向左移动S位后获得实际的窗口大小。
  • 时间戳:10字节,其中最主要的字段是时间戳值(4字节)和时间戳回送应答字段(4字节)。
  • 选项确认选项:
Padding 可变 填充字段,用来补位,使整个首部长度是4字节的整数倍。
data 可变 TCP负载。
JTangming commented 5 years ago

HTTP 协议

请求和响应报文的构成: http-request-headers http-resp-headers

stateless

HTTP 是一种不保存状态,即无状态协议(stateless)。它自身不具备保存之前发送过的请求或响应的功能,为了实现保持状态的功能,引入了 Cookie 技术。

持久连接

最初每进行一次 HTTP 通信就要断开一次 TCP 连接;随着 HTTP 普及且传输数据越来越大,引入了持久连接(HTTP Persistent Connections,即 HTTP keep-alive 或 HTTP connection reuse)。特点是:只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。

管线化

在持久化连接的基础上,引入管道化方式发送请求,即可以同时并行发送多个请求,而不需要一个接一个等待响应。

JTangming commented 5 years ago

https

http 有哪些不足:

图文并茂介绍:

相关细节可以再阅读阮一峰老师的 SSL/TLS协议运行机制的概述

SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

JTangming commented 4 years ago

WebSocket

WebSocket 由多个标准构成: WebSocket API 是 W3C 定义的,而 WebSocket 协议(RFC 6455)及其扩展则由 HyBi Working Group(IETF)定义。

WebSocket 可以实现客户端与服务器间双向、基于消息的文本或二进制数据传输。WebSocket 连接远远不是一个网络套接字,因为浏览器在这个简单的 API 之后隐藏了所有的复杂性,而且还提供了更多服务: • 连接协商和同源策略; • 与既有 HTTP 基础设施的互操作; • 基于消息的通信和高效消息分帧; • 子协议协商及可扩展能力。

WebSocket 是浏览器中最通用最灵活的一个传输机制,其极简的 API 可以让我们在客 户端和服务器之间以数据流的形式实现各种应用数据交换(包括 JSON 及自定义的 二进制消息格式),而且两端都可以随时向另一端发送数据。 不过,自定义数据交换协议的问题通常也在于自定义。因为应用必须考虑状态管理、 压缩、缓存及其他原来由浏览器提供的服务。设计限制和性能权衡始终会有,利用 WebSocket 也不例外。简单来说,WebSocket 并不能取代 HTTP、XHR 或 SSE,而为了追求最佳性能,关键还是要利用这些机制的长处。

JTangming commented 4 years ago

http 2.0

HTTP2 采用二进制格式传输

取代了 HTTP1.x 的文本格式,二进制格式解析更高效。关键之一就是在应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。 binary-framing

在二进制分帧层中, HTTP2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码。

多路复用

代替了 HTTP1.x 的序列和阻塞机制,所有的相同域名请求都通过同一个 TCP 连接并发完成。在 HTTP1.x 中,并发多个请求需要多个 TCP 连接,浏览器为了控制资源会有 6-8 个 TCP 连接都限制。

HTTP2 中

Header Compression

HTTP2 使用了专门为首部压缩而设计的 HPACK 算法。

服务端推送(Server Push)

Reference