美文网首页网络协议程序员信息系统
TCP 为什么是三次握手四次挥手?

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

作者: linjinhe | 来源:发表于2018-04-14 01:13 被阅读102次

    简介

    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 要支持半关闭连接。

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

    相关文章

      网友评论

        本文标题:TCP 为什么是三次握手四次挥手?

        本文链接:https://www.haomeiwen.com/subject/atjkkftx.html