网络协议程序员信息系统

TCP 为什么是三次握手四次挥手?

2018-04-14  本文已影响102人  linjinhe

简介

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。

两次 seq 确认

简单优化,可以将中间的 ACK + SYN 合并。所以就变成了 TCP 建立连接的三次握手。


三次握手

确认全双工信道

另外还有一点就是,由于网络信道是不可靠的,通过三次握手,可以最低限度地确定双方的信息是双向可用的(全双工)。

假设是 A 向 B 发起请求。
第二次握手成功表明 A => B 没问题。
第三次握手成功表明 B => A 没问题。

四次挥手

理解了三次握手,四次挥手就不难理解了。上面讲到,三次握手其实是由“四次握手”合并二、三次握手优化而来的。那为什么第二次挥手和第三次挥手不能像握手协议中进行合并呢?

原因是: TCP 要支持半关闭连接

一开始建立的连接是全双工的,A <=> B 双方都可以读写。支持半关闭意味着,TCP 支持 A 和 B 双方独立关闭通道。因此会有两次独立的关闭写通道的请求。一次关闭请求(FIN),对应一个 ACK。所以就有了四次挥手。


TCP 四次挥手

小结

TCP 需要三次握手的原因:

  1. 初始化双方 seq。
  2. 确认双方信道可以实现最低限度的全双工。

TCP 需要四次挥手的原因:

  1. TCP 要支持半关闭连接。

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻

上一篇下一篇

猜你喜欢

热点阅读