0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TCP 协议的运作机制

科技绿洲 来源:Linux开发架构之路 作者:Linux开发架构之路 2023-11-13 11:34 次阅读

今天我们将 从稳定性角度深挖 TCP 协议的运作机制

如今,大半个互联网都建立在 TCP 协议之上,我们使用的 HTTP 协议、消息队列、存储、缓存,都需要用到 TCP 协议—— 这是因为 TCP 协议提供了可靠性

简单来说,可靠性就是让数据无损送达。但若是考虑到成本,就会变得非常复杂——因为还需要尽可能地提升吞吐量、降低延迟、减少丢包率。

TCP 协议具有很强的实用性,而可靠性又是 TCP 最核心的能力 。具体来说,从一个终端有序地发出多个数据包,经过一个复杂的网络环境,到达目的地的时候会变得无序,而可靠性要求数据恢复到原始的顺序。这里先提出两个问题:

  • TCP 协议是如何恢复数据的顺序的?
  • 拆包和粘包的作用是什么?

那么带着这两个问题开始今天的学习。

TCP 的拆包和粘包

TCP数据发送

TCP 是一个传输层协议

TCP 发送数据的时候,往往不会将数据一次性发送

图片

而是将数据拆分成很多个部分,然后再逐个发送。像下图这样:

同样的,在目的地,TCP 协议又需要逐个接收数据。

请 思考,TCP 为什么不一次发送完所有的数据?比如我们要传一个大小为 10M 的文件,对于应用层而言,就是一次传送完成的。而传输层的协议为什么不选择将这个文件一次发送完呢?

这里有很多原因,

  • 比如为了稳定性,一次发送的数据越多,出错的概率越大。
  • 再比如说为了效率,网络中有时候存在着并行的路径,拆分数据包就能更好地利用这些并行的路径。
  • 再有,比如发送和接收数据的时候,都存在着缓冲区。如下图所示:

图片

缓冲区是在内存中开辟的一块区域,目的是缓冲。因为大量的应用频繁地通过网卡收发数据,这个时候,网卡只能一个一个处理应用的请求。当网卡忙不过来的时候,数据就需要排队,也就是将数据放入缓冲区 。如果每个应用都随意发送很大的数据,可能导致其他应用实时性遭到破坏。

还有一些原因 比如内存的最小分配单位是页表,如果数据的大小超过一个页表,可能会存在页面置换问题,造成性能的损失。

总之,方方面面的原因: 在传输层封包不能太大

这种限制,往往是以缓冲区大小为单位的。也就是 TCP 协议,会将数据拆分成不超过缓冲区大小的一个个部分 。每个部分有一个独特的名词,叫作 TCP 段(TCP Segment)

在接收数据的时候,一个个 TCP 段又被重组成原来的数据。

像这样, 数据经过拆分,然后传输,然后在目的地重组,俗称拆包 。所以拆包是将数据拆分成多个 TCP 段传输。

那么粘包是什么呢?有时候, 如果发往一个目的地的多个数据太小了,为了防止多次发送占用资源,TCP 协议有可能将它们合并成一个 TCP 段发送,在目的地再还原成多个数据,这个过程俗称粘包。所以粘包是将多个数据合并成一个 TCP 段发送


TCP Segment

那么一个 TCP 段长什么样子呢?下图是一个 TCP 段的格式:

图片

我们可以看到,TCP 的很多配置选项和数据粘在了一起,作为一个 TCP 段。

显然, 把每一部分都记住似乎不太现实,先把其中最主要的部分理解。

TCP 协议就是依靠每一个 TCP 段工作的,所以你每认识一个 TCP 的能力,几乎都会找到在 TCP Segment 中与之对应的字段 。接下来 认识它们。

  • Source Port/Destination Port 描述的是发送端口号和目标端口号,代表发送数据的应用程序和接收数据的应用程序。比如 80 往往代表 HTTP 服务,22 往往是 SSH 服务……
  • Sequence Number 和 Achnowledgment Number 是保证可靠性的两个关键
  • Data Offset 是一个偏移量。这个量存在的原因是 TCP Header 部分的长度是可变的,因此需要一个数值来描述数据从哪个字节开始。
  • Reserved 是很多协议设计会保留的一个区域,用于日后扩展能力。
  • URG/ACK/PSH/RST/SYN/FIN 是几个标志位,用于描述 TCP 段的行为。也就是一个 TCP 封包到底是做什么用的

1)URG 代表这是一个紧急数据,比如远程操作的时候,用户按下了 Ctrl+C,要求终止程序,这种请求需要紧急处理。

2)ACK 代表响应, 所有的消息都必须有 ACK,这是 TCP 协议确保稳定性的一环。

3)PSH 代表数据推送,也就是在传输数据的意思。

4)SYN 同步请求,也就是申请握手。

5)FIN 终止请求,也就是挥手。

特别说明一下:以上这 5 个标志位,每个占了一个比特,可以混合使用。比如 ACK 和 SYN 同时为 1,代表同步请求和响应被合并了。这也是 TCP 协议,为什么是三次握手的原因之一

  • Window 也是 TCP 保证稳定性并进行流量控制的工具,后续会 TCP 的稳定性:滑动窗口和流速控制是中详细介绍。
  • Checksum 是校验和,用于校验 TCP 段有没有损坏。
  • Urgent Pointer 指向最后一个紧急数据的序号(Sequence Number)。它存在的原因是:有时候紧急数据是连续的很多个段,所以需要提前告诉接收方进行准备。
  • Options 中存储了一些可选字段,比如接下来我们要讨论的 MSS(Maximun Segment Size)。
  • Padding 存在的意义是因为 Options 的长度不固定,需要 Pading 进行对齐。

其实这个问题的本质就好像两个人在说话一样,我们要确保他们说出去的话,和回答之间的顺序。因为 TCP 是一个双工的协议,两边可能会同时说话。所以聪明的 科学家想到了确定一句话的顺序,需要两个值去描述——也就是发送的字节数和接收的字节数

图片

我们重新定义一下 Seq(如上图所示),对于任何一个接收方,如果知道了发送者发送某个 TCP 段时,已经发送了多少字节的数据,那么就可以确定发送者发送数据的顺序。

但是这里有一个问题。如果接收方也向发送者发送了数据请求(或者说双方在对话),接收方就不知道发送者发送的数据到底对应哪一条自己发送的数据了。

举个例子:下面 A 和 B 的对话中,我们可以确定他们彼此之间接收数据的顺序。但是无法确定数据之间的关联关系,所以只有 Sequence Number 是不够的。

A:今天天气好吗?

A:今天你开心吗?

B:开心

B:天气不好

人类很容易理解这几句话的顺序,但是对于机器来说就需要特别的标注。因此我们还需要另一个数据,就是每个 TCP 段发送时,发送方已经接收了多少数据。用 Acknowledgement Number 表示,下面简写为 ACK。

下图中,终端发送了三条数据,并且接收到四条数据,通过观察,根据接收到的数据中的 Seq 和 ACK,将发送和接收的数据进行排序。

图片

例如上图中, **发送方发送了 100 字节的数据,而接收到的(Seq = 0 和 Seq =100)的两个封包,都是针对发送方(Seq = 0)这个封包的。发送 100 个字节,所以接收到的 ACK 刚好是 100。说明(Seq= 0 和 Seq= 100)这两个封包是针对接收到第 100 个字节数据后,发送回来的。这样就确定了整体的顺序** 。

注意,无论 Seq 还是 ACK,都是针对“对方”而言的。是对方发送的数据和对方接收到的数据 。我们在实际的工作当中,可以通过 Whireshark 调试工具观察两个 TCP 连接的 Seq和 ACK。

图片


MSS(Maximun Segment Size)

接下来,我们讨论下 MSS,它也是面试经常会问到的一个 TCP Header 中的可选项(Options), 这个可选项控制了 TCP 段的大小,它是一个协商字段(Negotiate) 。协议是双方都要遵循的标准,因此配置往往不能由单方决定,需要双方协商。

TCP 段的大小(MSS)涉及发送、接收缓冲区的大小设置,双方实际发送接收封包的大小,对拆包和粘包的过程有指导作用,因此需要双方去协商

如果这个字段设置得非常大,就会带来一些影响。

  • 首先对方可能会拒绝,作为服务的提供方,你可能不会愿意接收太大的 TCP 段。因为大的 TCP 段,会降低性能,比如内存使用的性能 。还有就是资源的占用。一个用户占用服务器太多的资源,意味着其他的用户就需要等待或者降低他们的服务质量
  • 其次,支持 TCP 协议工作的 IP 协议,工作效率会下降

TCP 协议不肯拆包,IP 协议就需要拆出大量的包。那么 IP 协议为什么需要拆包呢?这是因为在网络中,每次能够传输的数据不可能太大,这受限于具体的网络传输设备,也就是物理特性。但是 IP 协议,拆分太多的封包并没有意义。因为可能会导致属于同个 TCP 段的封包被不同的网络路线传输,这会加大延迟。同时,拆包,还需要消耗硬件和计算资源。

那是不是 MSS 越小越好呢? MSS 太小的情况下,会浪费传输资源(降低吞吐量)。因为数据被拆分之后,每一份数据都要增加一个头部。如果 MSS 太小,那头部的数据占比会上升,这让吞吐量成为一个灾难。所以在使用的过程当中,MSS 的配置,往往都是一个折中的方案

不要去猜想什么样的方案是最合理的,而是要尝试去用实验证明它,一切都要用实验依据说话。

Question : TCP 协议是如何恢复数据的顺序的,TCP 拆包和粘包的作用是什么?

Answer:

TCP 拆包的作用是将任务拆分处理,降低整体任务出错的概率,以及减小底层网络处理的压力。拆包过程需要保证数据经过网络的传输,又能恢复到原始的顺序。这中间,需要数学提供保证顺序的理论依据。 TCP 利用(发送字节数、接收字节数)的唯一性来确定封包之间的顺序关系

粘包是为了防止数据量过小,导致大量的传输,而将多个 TCP 段合并成一个发送。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6989

    浏览量

    88932
  • 端口
    +关注

    关注

    4

    文章

    963

    浏览量

    32043
  • 应用程序
    +关注

    关注

    37

    文章

    3261

    浏览量

    57675
  • TCP协议
    +关注

    关注

    1

    文章

    91

    浏览量

    12068
收藏 人收藏

    评论

    相关推荐

    LwIP中TCP协议是如何实现的

    与其他协议一样,为了描述`TCP`协议,LwIP定义了一个名字叫`tcp_pcb`的结构体,可以称之为`TCP控制块`,其内定义了大量的成员
    的头像 发表于 02-14 10:39 3025次阅读

    TCP运输层协议的超时重传原理实现

    1、TCP运输层协议的超时重传原理是什么tcp是一种面向连接的可靠的运输层协议,在TCP/IP协议
    发表于 04-14 16:17

    TCP/IP协议简介

    TCP/IP协议简介 TCP/IP传输层协议概揽 传输控制协议 TCP 是一
    发表于 06-09 23:07 1409次阅读
    <b class='flag-5'>TCP</b>/IP<b class='flag-5'>协议</b>简介

    TCP/IP协议,TCP/IP协议内容和作用是什么?

    TCP/IP协议,TCP/IP协议内容和作用是什么? TCP/IP是一组协议的代名词,它还包括
    发表于 03-19 13:55 5826次阅读

    NetBEUI和,IPX/SPX ,TCP/IP三大协议

    NetBEUI和,IPX/SPX ,TCP/IP三大协议 网络协议(Protocol)是一种特殊的软件,是计算机网络实现其功能的最基本机制。网络
    发表于 03-29 17:32 2076次阅读

    传输控制协议(TCP)/网络层协议是什么意思

    传输控制协议(TCP)/网络层协议是什么意思 传输控制协议(TCP) TCP提供的是一种可靠
    发表于 04-06 16:44 2746次阅读

    tcp ip协议_什么是tcp ip协议

    什么是tcp ip协议tcp ip协议详解,深刻讲述了tcp ip协议的概念,
    发表于 05-14 16:29 6027次阅读
    <b class='flag-5'>tcp</b> ip<b class='flag-5'>协议</b>_什么是<b class='flag-5'>tcp</b> ip<b class='flag-5'>协议</b>

    TCP/IP协议进阶课程:TCP协议(2)

    TCP/IP协议进阶课程:6、TCP协议02
    的头像 发表于 07-05 00:10 4248次阅读

    关于TCP协议的全方位介绍

    本篇文章较长,大家先看下目录 1、简介 2、TCP协议头 3、TCP数据包的编号(SEQ) 4、三次握手建立连接 5、四次挥手断开连接 6、TCP可靠性的保证 7、滑动窗口技术 9、窗
    的头像 发表于 02-20 14:17 2313次阅读
    关于<b class='flag-5'>TCP</b><b class='flag-5'>协议</b>的全方位介绍

    TCP协议的简介和关键知识点

    本篇文章较长,大家先看下目录 1、简介 2、TCP协议头 3、TCP数据包的编号(SEQ) 4、三次握手建立连接 5、四次挥手断开连接 6、TCP可靠性的保证 7、滑动窗口技术 9、窗
    的头像 发表于 08-18 09:55 5319次阅读
    <b class='flag-5'>TCP</b><b class='flag-5'>协议</b>的简介和关键知识点

    TCP/IP协议的特点

    可靠性和性能: TCP/IP协议的传输层TCP协议,提供了高可靠的数据传输服务,保证数据的完整性和顺序性,并且具有流量控制和拥塞控制等机制
    发表于 05-06 15:15 1w次阅读

    udp是什么协议 TCP与UDP的区别

    TCP协议提供可靠的数据传输,UDP协议提供尽量高效的数据传输。TCP协议通过使用序列号、确认应答等机制
    的头像 发表于 06-26 17:47 1.1w次阅读

    TCP/IP协议进阶课程:6、TCP协议

    电子发烧友网站提供《TCP/IP协议进阶课程:6、TCP协议.pdf》资料免费下载
    发表于 07-31 11:47 2次下载
    <b class='flag-5'>TCP</b>/IP<b class='flag-5'>协议</b>进阶课程:6、<b class='flag-5'>TCP</b><b class='flag-5'>协议</b>

    TCP协议中的拥塞控制机制与网络稳定性

    TCP协议中的拥塞控制机制与网络稳定性的深度探讨 随着互联网的快速发展,网络流量呈现爆炸式增长,网络拥塞问题逐渐凸显。为了维护网络的稳定运行,TCP
    的头像 发表于 04-19 16:42 414次阅读

    简述TCP协议的三次握手机制

    TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它主要用于在IP网络中进行数据传输。TCP
    的头像 发表于 08-16 10:57 917次阅读