文章目录

  • Pre
  • TCP 协议
    • 主机到主机(Host-To-Host)
    • 什么是连接和会话?
    • 双工/单工问题
  • 什么是可靠性?
  • TCP 的握手和挥手
    • TCP 协议的基本操作
    • 建立连接的过程(3次握手)
    • 断开连接的过程(4 次挥手)
  • 总结
    • Question TCP 为什么是 3 次握手,4 次挥手?


Pre

TCP 和 UDP 是今天应用最广泛的传输层协议,拥有最核心的垄断地位。今天互联网的整个传输层,几乎都是基于这两个协议打造的。无论是应用开发、框架设计选型、做底层和优化,还是定位线上问题,只要碰到网络,就逃不开 TCP 协议相关的知识。

TCP 协议为什么握手是 3 次,挥手却是 4 次?下面请你带着这个问题,开启今天的学习。


TCP 协议

TCP(Transport Control Protocol)是一个传输层协议,提供 Host-To-Host 数据的可靠传输,支持全双工,是一个连接导向的协议

这里面牵涉很多概念,比如主机到主机、连接、会话、双工/单工及可靠性等,接下来逐一解释。


主机到主机(Host-To-Host)

TCP 提供的是 Host-To-Host 传输,一台主机通过 TCP 发送数据给另一台主机。

这里的主机(Host)是一个抽象的概念,可以是手机、平板、手表等。收发数据的设备都是主机,所以双方是平等的。
TCP 协议往上是应用到应用(Application-To-Application)的协议

什么是应用到应用的协议呢?比如你用微信发信息给张三,你的微信客户端、微信聊天服务都是应用。微信有自己的聊天协议,微信的聊天协议是应用到应用的协议;如果微信的聊天协议想要工作,就需要一个主机到主机的协议帮助它实现通信。

而 TCP 上层有太多的应用,不仅仅有微信,还有抖音、网易云音乐……因此 TCP 上层的应用层协议使用 TCP 能力的时候,需要告知 TCP 是哪个应用——这就是端口号。端口号用于区分应用,下文中我们还会详细讨论。

TCP 要实现主机到主机通信,就需要知道主机们的网络地址(IP 地址),但是 TCP 不负责实际地址到地址(Address-To-Address)的传输,因此 TCP 协议把 IP 地址给底层的互联网层处理。

互联网层,也叫网络层(Network Layer),提供地址到地址的通信,IP 协议就在这一层工作。互联网层解决地址到地址的通信,但是不负责信号在具体两个设备间传递。因此,网络层会调用下方的链路层在两个相邻设备间传递信息。当信号在两个设备间传递的时候,科学家又设计出了物理层封装最底层的物理设备、传输介质等,由最下方的物理层提供最底层的传输能力

以上的 5 层架构,我们称为互联网协议群,也称作 TCP/IP 协议群。总结下,主机到主机(Host-To-Host)为应用提供应用间通信的能力。


什么是连接和会话?

下一个关联的概念是连接(Connection)——连接是数据传输双方的契约。

连接是通信双方的一个约定,目标是让两个在通信的程序之间产生一个默契,保证两个程序都在线,而且尽快地响应对方的请求,这就是连接(Connection)

设计上,连接是一种传输数据的行为。传输之前,建立一个连接。具体来说,数据收发双方的内存中都建立一个用于维护数据传输状态的对象,比如双方 IP 和端口是多少?现在发送了多少数据了?状态健康吗?传输速度如何?等。所以,连接是网络行为状态的记录

和连接关联的还有一个名词,叫作会话(Session),会话是应用的行为。比如微信里张三和你聊天,那么张三和你建立一个会话。你要和张三聊天,你们创建一个聊天窗口,这个就是会话。你开始 Typing,开始传输数据,你和微信服务器间建立一个连接。如果你们聊一段时间,各自休息了,约定先不要关微信,1 个小时后再回来。那么连接会断开,因为聊天窗口没关,所以会话还在。

在有些系统设计中,会话会自动重连(也就是重新创建连接),或者帮助创建连接。 此外,会话也负责在多次连接中保存状态,比如 HTTP Session 在多次 HTTP 请求(连接)间保持状态(如用户信息)。

总结下,会话是应用层的概念,连接是传输层的概念


双工/单工问题

接下来我们聊聊什么是双工/单工。

在任何一个时刻,如果数据只能单向发送,就是单工,所以单工需要至少一条线路

如果在某个时刻数据可以向一个方向传输,也可以向另一个方向反方向传输,而且交替进行,叫作半双工;半双工需要至少 1 条线路

最后,如果任何时刻数据都可以双向收发,这就是全双工,全双工需要大于 1 条线路 。 当然这里的线路,是一个抽象概念,你可以并发的处理信号,达到模拟双工的目的。

TCP 是一个双工协议,数据任何时候都可以双向传输。这就意味着客户端和服务端可以平等地发送、接收信息。正因为如此,客户端和服务端在 TCP 协议中有一个平等的名词——Host(主机)。


什么是可靠性?

TCP 提供可靠性,那么可靠性是什么?

可靠性指数据保证无损传输。如果发送方按照顺序发送,然后数据无序地在网络间传递,就必须有一种算法在接收方将数据恢复原有的顺序。另外,如果发送方同时要把消息发送给多个接收方,这种情况叫作多播,可靠性要求每个接收方都无损收到相同的副本。多播情况还有强可靠性,就是如果有一个消息到达任何一个接收者,那么所有接受者都必须收到这个消息。


TCP 的握手和挥手

TCP 是一个连接导向的协议,设计有建立连接(握手)和断开连接(挥手)的过程。TCP 没有设计会话(Session),因为会话通常是一个应用的行为

TCP 协议的基本操作

TCP 协议有这样几个基本操作:

  • 如果一个 Host 主动向另一个 Host 发起连接,称为 SYN(Synchronization),请求同步;

  • 如果一个 Host 主动断开请求,称为 FIN(Finish),请求完成;

  • 如果一个 Host 给另一个 Host 发送数据,称为 PSH(Push),数据推送。

以上 3 种情况,接收方收到数据后,都需要给发送方一个 ACK(Acknowledgement)响应。 请求/响应的模型是可靠性的要求,如果一个请求没有响应,发送方可能会认为自己需要重发这个请求。


建立连接的过程(3次握手)

因为要保持连接和可靠性约束,TCP 协议要保证每一条发出的数据必须给返回,返回数据叫作 ACK(也就是响应)。

按照这个思路,我们来可以看看建立连接是不是需要 3 次握手:

1. 客户端发消息给服务端(SYN)

2. 服务端准备好进行连接

3. 服务端针对客户端的 SYN 给一个 ACK

到这里不就可以了吗?2 次握手就足够了。但其实不是,因为服务端还没有确定客户端是否准备好了。比如步骤 3 之后,服务端马上给客户端发送数据,这个时候客户端可能还没有准备好接收数据。因此还需要增加一个过程

4. 服务端发送一个 SYN 给客户端

5. 客户端准备就绪

6. 客户端给服务端发送一个 ACK

上面不是 6 个步骤吗? 怎么是 3 次握手呢?下面我们一起分析一下其中缘由。

  • 步骤 1 是 1 次握手;

  • 步骤 2 是服务端的准备,不是数据传输,因此不算握手;

  • 步骤 3 和步骤 4,因为是同时发生的,可以合并成一个 SYN-ACK 响应,作为一条数据传递给客户端,因此是第 2 次握手;

  • 步骤 5 不算握手;

  • 步骤 6 是第 3 次握手。

为了方便理解步骤 3 和步骤 4,这里我画了一张图。可以看到下图中 SYN 和 ACK 被合并了,因此建立连接一共需要 3 次握手,过程如下图所示:


从上面的例子中,我们可以进一步思考 SYN、ACK、PSH 这些常见的标识位(Flag)在传输中如何表示

一种思路是为 TCP 协议增加协议头。在协议头中取多个位(bit),其中 SYN、ACK、PSH 都占有 1 个位。比如 SYN 位,1 表示 SYN 开启,0 表示关闭。因此,SYN-ACK 就是 SYN 位和 ACK 位都置 1。这种设计,我们也称为标识(Flag)。标识位是放在 TCP 头部的


断开连接的过程(4 次挥手)

继续上面的思路,如果断开连接需要几次握手?给一些提示,可以在脑海中这样构思。

1. 客户端要求断开连接,发送一个断开的请求,这个叫作(FIN)。

2. 服务端收到请求,然后给客户端一个 ACK,作为 FIN 的响应。

3. 这里需要思考一个问题,可不可以像握手那样马上传 FIN 回去?

其实这个时候服务端不能马上传 FIN,因为断开连接要处理的问题比较多,比如说服务端可能还有发送出去的消息没有得到 ACK;也有可能服务端自己有资源要释放。因此断开连接不能像握手那样操作——将两条消息合并。所以,服务端经过一个等待,确定可以关闭连接了,再发一条 FIN 给客户端

4. 客户端收到服务端的 FIN,同时客户端也可能有自己的事情需要处理完,比如客户端有发送给服务端没有收到 ACK 的请求,客户端自己处理完成后,再给服务端发送一个 ACK。

经过以上分析,就可以回答上面这个问题了。是不是刚刚好 4 次挥手?过程如下图所示:


总结

在学习 3 次握手、4 次挥手时,我们一定要理解为什么这么设计,而不是死记硬背。

  • TCP 提供连接(Connection),让双方的传输更加稳定、安全

  • TCP 没有直接提供会话,因为应用对会话的需求多种多样,比如聊天程序会话在保持双方的聊天记录,电商程序会话在保持购物车、订单一致,所以会话通常在 TCP 连接上进一步封装,在应用层提供。

  • TCP 是一个面向连接的协议(Connection -oriented Protocol),说的就是 TCP 协议参与的双方(Host)在收发数据之前会先建立连接。相比较UDP 协议,UDP 是一个面向报文(Datagram-oriented)的协议——协议双方不需要建立连接,直接传送报文(数据)

  • 最后,连接需要消耗更多的资源。比如说,在传输数据前,必须先协商建立连接。因此,不是每种场景都应该用连接导向的协议。像视频播放的场景,如果使用连接导向的协议,服务端每向客户端推送一帧视频,客户端都要给服务端一次响应,这是不合理的。


Question TCP 为什么是 3 次握手,4 次挥手?

让我们来总结下: TCP 为什么是 3 次握手,4 次挥手?

  1. TCP 是一个双工协议,为了让双方都保证,建立连接的时候,连接双方都需要向对方发送 SYC(同步请求)和 ACK(响应)。

  2. 握手阶段双方都没有烦琐的工作,因此一方向另一方发起同步(SYN)之后,另一方可以将自己的 ACK 和 SYN 打包作为一条消息回复,因此是 3 次握手——需要 3 次数据传输

  3. 到了挥手阶段,双方都可能有未完成的工作。收到挥手请求的一方,必须马上响应(ACK),表示接收到了挥手请求。类比现实世界中,你收到一个 Offer,出于礼貌你先回复考虑一下,然后思考一段时间再回复 HR 最后的结果。最后等所有工作结束,再发送请求中断连接(FIN),因此是 4 次挥手。

来个思考题: 一台内存在 8G 左右的服务器,可以同时维护多少个连接?

tcp连接数上限其实受限于机器的内存,以8G内存为例,假设一个tcp连接需要占用的最小内存是8k(发送接收缓存各4k,当然还要考虑socket描述符),那么最大连接数为:810241024/8=1048576个,即约100万个tcp长连接。不过这只是理论数值,并未考虑实际业务。

计网 - 传输层协议 TCP:TCP 为什么握手是 3 次、挥手是 4 次?相关推荐

  1. 传输层协议(TCP/UDP)介绍

    一,TCP/IP协议族的传输层协议概况:  1,TCP:传输控制协议  2,UDP:用户数据报协议  二,TCP/UDP协议详解:  1,TCP  a.TCP是面向连接的,可靠的进程到进程通信的协议 ...

  2. Linux网络编程(传输层协议 )—tcp三次握手/四次挥手

    传输层协议:负责应用程序之间数据传输-TCP/UDP UDP协议: 16位源端-对端端口:用于描述识别通信两端进程 16位数据报长度:能够存储最大数字 65535,(udp报文总大小不超过64k) 1 ...

  3. 声网传输层协议 AUT 的总结与展望丨Dev for Dev 专栏

    本文为「Dev for Dev 专栏」系列内容,作者为声网大后端传输协议负责人 夏天. 针对实时互动应用对网络传输带来的新需求和新挑战,声网通过将实时互动中的应用层业务需求与传输策略的分层和解耦,于 ...

  4. 传输层协议之TCP协议详解

    传输层重点协议:UDP和TCP. 作用:负责数据能够从发送端传输到接收端.(在进行网络编程时,我们会使用到socket,然而一旦调用socket就进入到了传输层的范畴内) 前面我们已经讲过UDP协议了 ...

  5. TCP/IP传输层协议实现 - TCP连接的建立与终止(lwip)

    1.lwip tcp相关数据结构 1.1.tcp报文格式 <TCP-IP详解卷 1:协议>TCP包首部结构如下: 1.2.lwip tcp数据结构 tcp相关数据结构如下,tcp_pcb_ ...

  6. TCP/IP传输层协议实现 - TCP接收窗口/发送窗口/通告窗口(lwip)

    1.tcp通告窗口/接收窗口/发送窗口 接收端有一个接收窗口大小,接收端只能接收这么多数据,接收窗口的数据需要被上层接收后才释放更大接收空间,才可以接收更多数据:接收窗口之前的数据已经被接收,再次接收 ...

  7. TCP/IP传输层协议实现 - TCP的坚持定时器(lwip)

    (参考<TCP-IP详解卷 1:协议>"第22章 TCP的坚持定时器") 1.糊涂窗口综合症 <TCP-IP详解卷 1:协议>"22.3 糊涂窗口 ...

  8. TCP/IP传输层协议实现 - TCP的超时与重传(lwip)

    (参考<TCP-IP详解卷 1:协议> 第21章 TCP的超时与重传) 1.往返时间测量(RTT) 1.1.分组交换和RTT测量示例 <TCP-IP详解卷 1:协议>中分组交换 ...

  9. 4-1:TCP协议之传输层的作用及传输层协议TCP和UDP

    文章目录 一:传输层的定义 二:通信处理 三:传输层协议 四:TCP协议的可靠和性能 一:传输层的定义 前面说过,IP首部有一个协议字段用于标识网络层(IP)的上一层采用哪一种传输层协议.根据这个字段 ...

最新文章

  1. MySQL的binarylog处理
  2. C语言从青铜到王者——基础知识总结
  3. Python实现不规则txt文本数据读取并转换为csv文本
  4. 在awk中执行外部命令
  5. 常用SHELL软件命令
  6. android 让应用恢复前台显示_Android程序由后台切换到前台
  7. 使用express框架接收和发送ajax信息
  8. Fiddler web 调试工具
  9. 九爷 带你了解 nginx优化与防盗链
  10. 剑指offer题解 带讲解 python版 第一部分
  11. 4204. 构造矩阵
  12. wps一直显示正在备份怎么办_wps怎么解除自动备份
  13. vbs表白小程序,女生同意才能关掉。
  14. Sass系统技术选型笔记(1)OS
  15. 自动合并两个.bib 去除.bib中的重复条目
  16. 15个非常实用的JavaScript表单验证库
  17. 性别分为男子组和女子组
  18. FreeSWITCH的端口设置
  19. 手把手教你如何做自媒体赚钱,揭开自媒体赚钱真相!记得收藏
  20. python atm银行取款系统_python ATM机 案例代码

热门文章

  1. MySQL是自主可控的吗_国产处理器那么多,究竟有哪些,是真正的“自主可控”?...
  2. keras 以图搜图
  3. python t分布的双侧置信区间
  4. 101. Leetcode 139. 单词拆分 (动态规划-完全背包)
  5. 文巾解题 881. 救生艇
  6. 博弈论笔记:谈判与讨价还价
  7. MATLAB实战系列(六)-基于蚁群算法的三维路径规划算法思路浅析
  8. 如何规划 ElasticSearch 集群规模和容量?
  9. CentOS-6.3安装配置SVN
  10. python实现三叉树_使用python代码实现三叉搜索树高效率”自动输入提示”功能