前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TCP 为什么是三次握手四次挥手?

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

作者头像
linjinhe
修改2018-06-06 22:49:11
1.4K0
修改2018-06-06 22:49:11
举报
文章被收录于专栏:linjinhe的专栏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 要支持半关闭连接。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.04.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 三次握手
    • 初始化 Seq
      • 确认全双工信道
      • 四次挥手
      • 小结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档