TCP为什么要三次握手,为什么?

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。为了实现可靠数据传输,TCP 协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。

三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认。

具体来说,在三次握手的过程中,客户端和服务器之间会发送三个数据包:

  1. 第一次握手:客户端向服务器发送一个带有 SYN(Synchronization,同步)标志的数据包,请求建立连接。这个数据包中包含了客户端的初始序列号。
  2. 第二次握手:服务器收到客户端的请求后,会回复一个带有 SYN 和 ACK(Acknowledgement,确认)标志的数据包。这个数据包中包含了服务器的初始序列号,以及对客户端初始序列号的确认。
  3. 第三次握手:客户端收到服务器的回复后,会再次向服务器发送一个带有 ACK 标志的数据包,确认已经收到了服务器的初始序列号。

通过这三次握手,客户端和服务器都知道了对方的初始序列号,并且确认了对方已经收到了自己的序列号。这样就可以保证后续的数据传输是可靠的,不会出现数据包丢失或重复的情况。

TCP 使用三次握手(Three-Way Handshake)来建立连接,而不是两次握手,主要是出于以下几个关键原因:

  1. 防止历史连接的初始化造成混乱:如果只使用两次握手,当客户端发送的连接请求(SYN)在网络中滞留并延迟到达服务器时,客户端可能已经重启或者放弃该连接尝试,并重新发送了新的SYN。在这种情况下,如果服务器仍然对第一个滞留的SYN做出响应并建立了连接,就会导致一个无效(或称为"幽灵")的连接占用服务器资源。

  2. 同步双方的初始序列号:三次握手过程允许双方确认对方的初始序列号。序列号对于TCP的可靠数据传输至关重要,它帮助检测数据包的丢失、重复和乱序。两次握手无法确保双方都已知晓并确认了对方的序列号初始化。

  3. 确保连接的双向性:三次握手确认了客户端到服务器以及服务器回到客户端的路径都是畅通的。这一步是必要的,因为它验证了双方都有发送和接收数据的能力,而两次握手无法完全保证这一点。

  4. 避免资源浪费:通过第三次握手,客户端确认收到了服务器的SYN+ACK,这样服务器就知道客户端确实准备好了进行数据通信,避免了服务器为一个客户端不打算使用的连接分配资源。

简而言之,三次握手提供了额外的安全性和可靠性保障,确保连接是双方都同意的、新鲜的,并且双方的通信参数已经被正确初始化,这些都是两次握手所不能提供的。

相关推荐
(Charon)27 分钟前
【C++/Qt】Qt 实现 TCP Client:从功能构思到消息收发与日志保存
qt·网络协议·tcp/ip
想成为优秀工程师的爸爸1 小时前
第二十四篇技术笔记:郭大侠学DoIP - 从“偶睡破庙”到“天字一号”
网络·笔记·网络协议·tcp/ip·信息与通信
夜瞬2 小时前
HTTP基础教程:请求方法、状态码、JSON、鉴权、超时、重试与流式返回
网络协议·http·json
水木流年追梦2 小时前
CodeTop Top 300 热门题目10-验证IP地址
python·网络协议·tcp/ip·算法·leetcode
lifewange5 小时前
RPC 是什么
网络·网络协议·rpc
想成为优秀工程师的爸爸10 小时前
第十九篇技术笔记:UDP——相思传得快,飞鸽传书在
笔记·网络协议·tcp/ip·udp·信息与通信
0xR3lativ1ty13 小时前
关闭公网IP的两种方式
网络协议·tcp/ip·php
2401_8734794016 小时前
固件升级如何按地区分批推送?IP地址查询定位决定升级策略
网络协议·tcp/ip·php
net3m3316 小时前
所有esp_websocket_client_send。。。的地方都加锁,就不容易websocket 断线重连
网络·websocket·网络协议
Jiangxl~16 小时前
IP数据云如何为不同行业提供精准IP查询与风险防控解决方案?
网络·网络协议·tcp/ip·算法·ai·ip·安全架构