TCP/IP 传输协议的 TCP 协议是面向连接的,也就是传输数据之前,必须建立可靠的连接。建立连接的过程中,需交换信息(如选取哪种协议、协议版本等),这个过程称为握手 handshaking。
握手过程中会协商后续通信使用的参数,如传输速率、编码方式、校验,以及其他协议选取、硬件支持的功能等。握手是两个实体之间的通信,但在 TCP/IP 中握手常指 TCP 的三次握手。
1. 三次握手
TCP 中的数据传输、连接建立与终止都由特定控制参数管理,控制参数有以下这些:
参数 | 用途 |
---|---|
SYN | 用于启动和建立连接时,同步设备之间的序列号。0到2^32 - 1的随机数。 |
ACK | 向另一端确认已经收到 SYN,数值为收到 SYN 增一。 |
SYN-ACK | 确认之前收到了 SYN,数值为自定义值。 |
FIN | 终止连接。 |
RST | 重置连接。 |
建立 TCP 连接需要三次握手:
- 客户端想要连接服务端时,向服务端发送 SYN message。Message 还包含 sequence number(32位的随机数),ACK 为0,window size、最大 segment 大小。例如,如果 window size 是 2000 bits,最大 segment 大小是 200 bits,则最大可传输 segments 是 10 data。
- 服务端收到客户端 synchronization request 后,回复客户端 SYN 和 ACK。ACK 数值是收到的 SYN 加一。例如客户端发送的 SYN 是 1000,则服务端回复的 ACK 是 1001。如果服务端也想建立连接,回复中还会包括一个 SYN,这里的 SYN 是另一随机数,与客服端的 SYN 不相同。这一阶段完成时,客户端与服务端的连接已经建立。
- 收到服务端的 SYN 后,客户端回复 ACK,ACK 值是 SYN 值加一。这一过程完成后,服务端与客户端的连接也建立了起来。
TCP 连接的双方通过三次握手确定 TCP 连接的初始序列号、窗口大小以及最大数据段,这样通信双方就能利用连接中的初始序列号保证双方数据段的不重不漏,通过窗口大小控制流量,并使用最大数据段避免 IP 协议对数据包分片。
换个角度看为什么需要三次握手?客户端和服务端通信前要进行连接,三次握手就是为了确保自己和对方的收发能力是正常的。
- 第一次握手:客户端发送、服务端接收网络包,服务端可以得出:客户端发送能力、服务端接收能力是正常的。
- 第二次握手:服务端发送、客户端接收网络包。从客户端的视角来看,我接收到了服务端发送的响应数据包,说明服务