TCP 为什么是三次握手四次挥手?
简介
TCP 三次握手四次挥手我们都知道 TCP 有建立连接时的三次握手和断开连接时的四次挥手,如上图所示。这个过程具体怎么样就不多说了。
今天主要想讨论一下,为什么 TCP 是三次握手,四次挥手。
下面说说个人对这个问题的理解和总结。
三次握手
初始化 Seq
首先,TCP 的定位是全双工的、支持半关闭的、可靠的传输协议。但是,我们知道,网络信道是不可靠的,随时都有可能丢包、错包、乱序。TCP 怎么在不可靠的网络上实现可靠的传输协议呢?
对于丢包,TCP 的解决方案很简单,就是超时重传。
对于错包,TCP 通过检查出错误后直接丢弃(丢包)。
所以问题来了,TCP 怎么知道哪些包需要重传呢?TCP 又是怎么解决包乱序到达的问题呢?
这两个问题都是通过 seq 来实现的,三次握手的过程就是双方协商好初始的 seq。
解决乱序:通过 seq 确定顺序。
确定重传: 接收方在 ACK 里带上 seq 告诉发送方收到了哪些数据包。发送方超时就重发没收到 ACK 的包。
通信双方协商好一个初始 seq,至少需要一次 SYN 和 一次 ACK。
一次 seq 确认
由于 TCP 是全双工的,所以 TCP 要协商两个初始 seq,所以双方各需要一次 SYN 和一次 ACK。
简单优化,可以将中间的 ACK + SYN 合并。所以就变成了 TCP 建立连接的三次握手。
三次握手
确认全双工信道
另外还有一点就是,由于网络信道是不可靠的,通过三次握手,可以最低限度地确定双方的信息是双向可用的(全双工)。
假设是 A 向 B 发起请求。
第二次握手成功表明 A => B 没问题。
第三次握手成功表明 B => A 没问题。
四次挥手
理解了三次握手,四次挥手就不难理解了。上面讲到,三次握手其实是由“四次握手”合并二、三次握手优化而来的。那为什么第二次挥手和第三次挥手不能像握手协议中进行合并呢?
原因是: TCP 要支持半关闭连接。
一开始建立的连接是全双工的,A <=> B 双方都可以读写。支持半关闭意味着,TCP 支持 A 和 B 双方独立关闭通道。因此会有两次独立的关闭写通道的请求。一次关闭请求(FIN),对应一个 ACK。所以就有了四次挥手。
TCP 四次挥手
小结
TCP 需要三次握手的原因:
- 初始化双方 seq。
- 确认双方信道可以实现最低限度的全双工。
TCP 需要四次挥手的原因:
- TCP 要支持半关闭连接。
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻。