TCP 三次握手过程分析
传输控制协议 (TCP) 旨在用作分组交换计算机通信网络中,以及这些网络的互连系统中的主机之间的高度可靠的主机到主机协议。
建立 TCP 连接
最简单的三次握手如下所示:
TCP A TCP B
0. CLOSED LISTEN
1. SYN-SENT --> <SEQ=100><CTL=SYN> --> SYN-RECEIVED
2. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
3. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED
4. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED
在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。
- 初始状态: 主机 A(客户端) 处于
CLOSED
状态,主机 B(服务器) 处于LISTEN
状态。 - 第一次握手:发起连接请求,客户端发送 SYN 包 (SYN = X) 到服务器,并进入
SYN_SEND
状态,等待服务器确认;服务器收到 SYN 包并进入SYN_RECV
状态。 - 第二次握手:服务器需要确认客户的 SYN(ACK = X + 1),同时自己也发送一个 SYN 包 (SYN = Y),组合后即 SYN + ACK 包;客户端收到 SYN + ACK 包并进入
ESTABLISHED
状态。 - 第三次握手:客户端向服务器发送确认包 ACK(ACK = Y + 1);服务器收到 ACK 包并进入
ESTABLISHED
状态,完成三次握手。 - 完成三次握手后,客户端与服务器开始传送数据。
实例:
No. Time Source Destination Info
1 0.000000 192.192.4.29 192.192.4.28 58079→6633 [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=64
2 0.000219 192.192.4.28 192.192.4.29 6633→58079 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 WS=128
3 0.001705 192.192.4.29 192.192.4.28 58079→6633 [ACK] Seq=1 Ack=1 Win=5888 Len=0
注:其中 SYN, ACK 为 wireshark 解析的相对值。
第一次握手:192.192.4.29 发送标志位 SYN 为 1,随机产生的 Seq=0(相对值 1) 的数据包到 192.192.4.28,192.192.4.28 由标志位 SYN=1 知道 192.192.4.29 要求建立连接。标志位详情:
Flags: 0x002 (SYN)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...0 .... = Acknowledgment: Not set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..1. = Syn: Set
.... .... ...0 = Fin: Not set
标志位里面只同步位置位,也就是在做请求(SYN)。
第二次握手:192.192.4.28 收到请求后要确认连接信息,向 192.192.4.29 发送 Ack 号 =1(相对值 1), 标志位 SYN=1, 标志位 ACK=1 随机产生的 Seq=0(相对值 2) 的包。标志位详情:
Flags: 0x012 (SYN, ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..1. = Syn: Set
.... .... ...0 = Fin: Not set
标志位里面有确认位和同步位置位,也就是在做应答(SYN + ACK)。
第三次握手:192.192.4.29 收到应答后检查 ack number 是否正确,以及标志位 ACK 是否为 1,若正确,192.192.4.29 会再发送 Ack 号 =1(相对值 2), 标志位 ACK=1,192.192.4.28 收到后检查 ack number 是否正确,标志位 ACK=1 则连接建立成功。标志位详情:
Flags: 0x010 (ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
标志位里面只有确认位置位,也就是在做再次确认(ACK)。
一个完整的三次握手过程就是请求–>应答–>再次确认。
连接过程状态图:
参考
《TCP/IP 详解 卷1:协议》