TCP(Transmission Control Protocol)是互联网中最核心、最可靠的传输协议。TCP的三次握手是建立连接的“开场仪式”,它确保了双方都能发送和接收数据,是TCP可靠性的基础。

技术解析

TCP的三次握手(Three-Way Handshake)是为了在客户端和服务端之间建立一个可靠的、全双工(Full-Duplex,即双方都能发送和接收)的连接。

核心报文与状态流转图

报文发送方接收方核心内容目的SYN客户端服务器携带SYN=1 (请求同步序列号),携带Seq=X (客户端的起始序列号)客户端询问连接,并告诉服务器:“我要开始给你发数据了,从X号开始。”SYN-ACK服务器客户端携带SYN=1 (请求同步),携带ACK=1 (确认收到),Ack=X+1 (确认序列号),Seq=Y (服务器的起始序列号)服务器同意连接,确认收到了X,并告诉客户端:“我也要给你发数据了,从Y号开始。”ACK客户端服务器携带ACK=1,Ack=Y+1 (确认序列号)客户端确认收到了Y,连接正式建立。连接状态变化

这个流程可以图解如下:

+----------+ +----------+

| Client | | Server |

+----------+ +----------+

| CLOSED | | LISTEN | (服务器已准备就绪,监听端口)

| | |

| (1) SYN, Seq=X --------------------> | (接收SYN) SYN_RCVD |

| | (进入 SYN_SENT 状态) | |

| SYN_SENT | <--------------------- SYN-ACK, Ack=X+1, Seq=Y (2) |

| | (接收SYN-ACK) ESTABLISHED | |

| | | (发送SYN-ACK) |

| ESTABLISHED <----------------------- ACK, Ack=Y+1 (3) | ESTABLISHED |

| (发送ACK) | (接收ACK) ESTABLISHED |

+----------+ +----------+

为什么需要三次握手?

1. 第一次握手 (SYN): 服务器知道客户端有发送能力。2. 第二次握手 (SYN-ACK): 客户端知道服务器有接收能力,且服务器有发送能力。3. 第三次握手 (ACK): 服务器知道客户端有接收能力。

三次握手确保了双方都确认了自己和对方的发送与接收能力是正常的,从而建立了一个可靠的全双工连接。

故事场景:建立秘密加密电话线

假设两位外交官(Client 和 Server)需要建立一条安全可靠的电话线来沟通机密事项。

初始状态:双方电话都挂着(CLOSED / LISTEN)。

第一步:Client 发出对话请求 (SYN)

动作:外交官A(Client)首先打电话给B。内容:A:“你好!我想和你开始对话(SYN),我从我的第X页机密文件开始讲起(Seq=X)。”结果:B收到了A的请求,B知道A想和他说话。

第二步:Server 同意请求,并询问 Client 是否准备接收 (SYN-ACK)

动作:B收到后,立刻回复A。内容:B:“我收到你的请求了,我同意对话(SYN)。你确认收到了我的回复(ACK)吗?同时,我也要开始给你发送信息了,我从我的第Y页文件开始讲起(Seq=Y)。”结果:A收到了B的回复,A确认:B能听到A的声音,B也能对A说话。

第三步:Client 确认 Server 可以说话 (ACK)

动作:A收到B的回复后,再次回复B。内容:A:“我收到了你的回复,我确认可以接收你从第Y页开始的文件(Ack=Y+1)。我们现在可以正式开始对话了。”结果:B收到了A的最终确认。B确认:A也能听到B的声音。

为什么是三次而不是两次?

如果是两次握手 (SYN -> SYN-ACK):

A知道B能发送和接收。但B只知道A能发送(第一次握手)。B无法确认A是否能够接收B的回复。如果A只是一个“信号发射塔”,B回复了半天A也收不到,这个连接就是不完整的。第三次握手就是Client给Server的最终承诺:“我能听到你,咱们开始吧!”,从而保证了连接的可靠性。

防止“历史遗留请求” (The Old Segment Problem):

假设A发出一个连接请求后,因为网络拥堵,这个请求在网络中滞留了很久。A等待超时后,关闭连接。过了一会儿,A又发出了第二个请求,并成功建立了连接并结束了。但是,第一个滞留的、已经失效的旧请求突然又抵达了服务器。

如果是两次握手,服务器会直接认为连接有效,浪费资源。有了第三次握手,当旧请求抵达服务器时,服务器发出SYN-ACK。但此时客户端A发现这个序列号和状态是错乱的,会直接拒绝(或发送RST包),从而避免了错误或冗余连接的建立。

故事总结:

握手步骤数据包Client 状态Server 状态第一次SYN确认Client能发Server接收到A想聊天的意图第二次SYN-ACK确认Server能收/能发Server等待Client的最终确认第三次ACK确认Client能收连接建立 (双方准备就绪)本质确保双方的发送和接收通道都正常工作。结论:

TCP的三次握手是一个基于确认(ACK)的机制,核心在于消除不确定性。第三次握手是防止旧的请求报文在网络中延迟后,被服务器误认为是新的连接请求,同时也最终验证了客户端的接收能力,保障了连接的可靠性。

Copyright © 2088 飚骑盟主竞技场 - 竞速游戏活动中枢 All Rights Reserved.
友情链接