TCP:面向连接的、可靠的运输层协议。它的连接就是建立在三次握手的基础上的。在讲三次握手之前,我们应该先了解它的报文格式,这样才能更加深刻的理解它的三次握手。
TCP 的报文格式
- 首部的 SYN 标志位用于建立连接。
- 首部的 FIN 标志位用于断开连接。
- 序号和确认号用于 TCP 连接提供可靠性服务。
三次握手
- 第一次握手:客户端的 TCP 向服务器端的 TCP 发送一个特殊的 TCP 报文段,该报文段不包含应用层的数据。该报文段会随机生成一个数字,赋值给
序号(client_isn)。因首部的 SYN 标志位为 1,因此,该报文段也被称为 SYN 报文段。 - 第二次握手:若 SYN 的报文段成功到达服务器,服务器会在数据报中提取出 TCP SYN 报文段,为该连接分配 TCP 缓存和变量。最后返回一个允许连接的报文段。服务器返回的报文段包含三个重要的信息:SYN 比特置为 1 ;
确认号的字段值为 client_isn + 1 ;随机生成一个数字赋值给序号(server_isn)。改报文段被称为 SYNACK 报文段。 - 第三次握手:接受服务器发送的报文段,给连接分配缓存和变量。再给服务器发送确认的报文段,该报文段 SYN 为 0,
确认号的值为 server_isn + 1。
注:第三次握手的报文段可装载客户端到服务器的数据,且后续的报文段 SYN 值为 0 。
三次握手完成,客户端和服务器就可以发送包含数据的报文段了。
其实 TCP 的三次握手和现实中的任何沟通都是一样的原理。比如当你给别人语音通话时,你会说:“hello,能听到吗?”,接收方会回复:“能听到,你能听到我吗?”。这时,你会再次回复:“能听到”。至此,你们就可以交流沟通的内容了。
你就相当于客户端,而对方就相当于服务器。
你说的hello,能听到吗 - 对应 TCP 三次握手的第一次。
对方回复的能听到,你能听到我吗? - 对应的 TCP 三次握手的第二次。
你回复的能听到 - 对应 TCP 三次握手的第三次。
四次挥手
- 第一次挥手:客户端给服务器发送一个特殊的报文段,改报文段首部的 FIN 置为 1 。
- 第二次挥手:服务器发送确认的报文段,即 ACK 报文段。
- 第三次挥手:服务器发送报文段首部的 FIN 为 1 的报文段。
- 第四次挥手:客户端发送确认的 ACK 报文段。
注:TCP 连接会在第四次挥手之后,等待一段时间再断开连接。
问题
- 为什么是三次握手而不是二次握手? 答:为了实现可靠数据传输,TCP 协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。
三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认。答案来源
一句话总结:需要三次握手来约定确定双方的 ISN(初始 seq 序列号)。
本文中图片皆来自《计算机网络 - 自顶向下方法》。
参考链接: