
【简答题】试用具体例子说明为什么在运输连接建立时要使用三次握手。说明如不这样做可能会出现什么情况。
三次握手是TCP协议建立连接的核心机制,其本质是通过三次交互确认双方收发能力正常并同步初始序列号,从而避免无效连接和数据传输错误。以下通过具体场景说明其必要性及简化为两次握手的风险。
TCP连接需确保通信双方均具备收发数据的能力,且能就初始序列号达成一致(序列号用于后续数据排序、去重和确认)。三次握手通过“请求-应答-再确认”的三步交互实现这一目标:
客户端发送SYN:“我想连接你,我的初始序列号是X”(验证服务器接收能力);
服务器回复SYN-ACK:“我收到了,我的初始序列号是Y,确认你的序列号X”(验证客户端发送能力+服务器接收/发送能力);
客户端发送ACK:“我收到了你的序列号Y,确认连接建立”(验证服务器发送能力)。
经过三次交互,双方确认彼此“能收能发”,且明确了对方的序列号起点,为可靠传输奠定基础。
若简化为两次握手(仅客户端发送SYN、服务器回复SYN-ACK即建立连接),可能导致已失效的连接请求报文段被服务器误认,建立无用连接,造成资源浪费。具体场景如下:
正常流程:客户端A向服务器B发送连接请求(SYN),因网络拥堵,该请求在中间节点滞留(如路由器缓存)。
超时重发:A未收到B的确认,超时后重新发送SYN,B正常接收并建立连接,双方传输数据后关闭连接。
失效请求到达:此时,滞留的第一个SYN报文段突然被送达B。若为两次握手,B会误认为A要建立新连接,立即发送SYN-ACK并分配资源(如缓存、端口),等待A发送数据。
资源浪费:但A此时并无连接需求(已完成一次通信并关闭),会忽略B的SYN-ACK。B却会一直维持该“半连接”,等待超时后才释放资源,导致服务器端口、内存等资源被无效占用。
三次握手通过客户端的第三次确认(ACK)解决了失效请求问题:
当B收到滞留的SYN后,仍会发送SYN-ACK(包含自身序列号);
A收到后,发现该SYN-ACK与自身当前状态不符(未发送新的连接请求),会回复RST报文(重置连接);
B收到RST后,立即释放资源,不会建立无效连接。
此外,三次握手期间,双方通过SYN和SYN-ACK交换初始序列号(如A的X和B的Y),确保后续数据传输时,双方能基于一致的序列号起点进行确认和排序(例如B收到A的数据段后,可通过“确认号=X+数据长度”告知A已接收的范围)。
两次握手仅能验证“客户端发送能力”和“服务器接收能力”,无法验证“服务器发送能力”和“客户端当前状态”,易受网络延迟导致的“失效请求”攻击;三次握手通过多一轮交互,既完成了收发能力的双向验证,又同步了关键的序列号信息,同时避免了无效连接占用资源。这一设计体现了TCP协议在“可靠性”与“效率”间的精准平衡——看似冗余的第三次握手,实则是保障网络资源不被滥用的关键防线。
思考:如果网络中不存在“滞留的失效请求”,两次握手是否可行?(提示:序列号同步仍需三次交互,否则双方无法确认对方已接收自己的初始序列号。)