服务器也会随机生成一个序列号 seq=K,这是服务器的 “身份编号”。
此时,服务器进入 SYN_RCVD 状态。这一步的作用就像是服务器在告诉客户端:“我收到你的哀求了,这是我的身份编号 K 。”
第三次握手:客户端确认毗连
客户端在收到服务器的响应报文后,会对其中的确认号 ack=J+1 进行校验。校验通过后,客户端发送一个 ACK=1 的报文,而且确认号 ack=K+1。至此,双方都进入 ESTABLISHED 状态,正式建立起了双向通信通道。
这一步的作用就像是客户端在向服务器证实:“我能收到你的消息,现在我们可以正式通信了。”
三、为什么必须是三次握手?
三次握手的计划并非偶尔,它蕴含着深刻的意义,主要表现在以下几个方面:
防止历史毗连干扰
在复杂的网络环境中,数据包的传输大概会受到各种因素的影响,导致延迟或丢失。如果客户端曾经发送过的旧 SYN 报文因为网络延迟在一段时间后才到达服务器,而此时服务器如果没有有用的机制来判断,就大概会错误地建立毗连。而三次握手机制通过序列号的比对,能够轻松识别出这些无效哀求,从而拒绝建立毗连,确保了毗连的准确性和有用性。
资源浪费规避
尽管三次握手机制为网络通信提供了坚实的保障,但在实际应用中,仍然存在一些安全威胁,其中最为典范的就是 SYN Flood 攻击。
攻击原理
攻击者使用 TCP 三次握手的机制漏洞,伪造大量虚假的 IP 地点,向服务器发送 SYN 报文。服务器在收到这些 SYN 报文后,会按照正常的流程返回 SYN-ACK 报文,并等待客户端的第三次握手 ACK 报文。然而,由于这些 IP 地点是伪造的,服务器永远也收不到 ACK 报文,导致服务器的半毗连队列被大量占用,终极耗尽。这样一来,正常用户的毗连哀求就无法被服务器处理,从而造成服务中断。
防御手段
为了应对 SYN Flood 攻击,网络安全专家们提出了多种有用的防御手段:
SYN Cookie:这种技术不直接在服务器上存储毗连状态,而是通过一种加密算法生成一个特殊的 Cookie,在收到客户端的 ACK 报文时,通过验证 Cookie 的正当性来确认毗连的有用性。
流量洗濯:通过专门的设备或服务,实时监测网络流量,识别出异常的 IP 地点和流量,并将其过滤掉,从而保证正常用户的毗连哀求能够顺遂到达服务器。