TCP详解(一)报文详情/MSS/MTU

news2024/9/22 19:29:46

本文旨在介绍TCP的报文格式详情和传输层、链路层的字节数限制

1 TCP 协议的报文格式

TCP 报文段包括协议首部和数据两部分,协议首部的固定部分是 20 个字节,头部是固定部分,后面是选项部分。

1.1 端口号

16位源端口:发送方主机的应用程序的端口号

16位目的端口:目的主机的应用程序的端口号

1.2 序列号

32位Seq序号。表示本报文段所发送数据的第一个字节的编号

1.3 确认号

32位Ack 序号,接收方期望收到发送方下一个报文段的第一个字节数据的编号,因此确认序号应该是上次已经成功收到数据字节序号加 1,即 Ack = 连续的最后一个Seq序号(收到的连续字节中最后一个字节编号) + 1。

1.4 数据偏移

4位,数据偏移代表数据部分距离报文首部的偏移量,表示TCP所传输的数据部分应该从TCP包的哪个位置开始计算,也可以理解为TCP首部的长度。“数据偏移”的计算单位是 32 位(4 字节)

例如:数据偏移设置为0101 = 5,5 x 4 = 20个字节,代表报文段首部距离数据部分的偏移长度是20字节;最大1111表示15 x 4= 60个字节,即表示TCP首部最大长度为60个字节,由于有20个字节是固定必须有的,因此“选项”部分最多40个字节。

1.5 保留字段

6位,为TCP将来的发展预留空间,目前必须全部为0 

1.6 标志位字段 

6位标志位:共有6个标志位,每个标志位占1个bit,内容含义如下 

  • URG(紧急):为1时表明紧急指针字段有效
  • ACK(确认):为1时表明确认号字段有效
  • PSH(推送):为1时接收方应尽快将这个报文段交给应用层
  • RST(复位):为1时表明TCP连接出现故障必须重建连接
  • SYN(同步):在连接建立时用来同步序号
  • FIN(终止):为1时表明发送端数据发送完毕要求释放连接

1.7 窗口大小

16位窗口大小:表示发送该TCP报文的接受窗口还可以接受多少字节的数据量。即表示当前接收缓冲区的大小

1.8 校验和

16位校验和字段:用于确认传输的数据有无损坏 。发送端基于数据内容校验生成一个数值,接收端根据接受的数据校验生成一个值。两个值相同代表数据有效,反之无效,丢弃该数据包。校验和根据 伪首部 + TCP头 + TCP数据 三部分进行计算

伪首部共有12字节,包含IP首部的一些字段,有如下信息:32位源IP地址、32位目的IP地址、8位保留字节(置0)、8位传输层协议号(TCP是6,UDP是17)、16位报文长度(首部+数据)。

伪首部是为了增加校验和的检错能力:通过伪首部的目的IP地址来检查TCP报文是否收错了、通过伪首部的传输层协议号来检查传输层协议是否选对了。数据包经过中间器件(路由器)的时候,这些中间器件可能会修改IP首部的内容,例如同时修改目的IP和IP首部校验和。这样一来将导致错误的接收方接收到该数据包。因此在TCP的伪首部加上IP地址,可以防止错收报文。

1.9 紧急指针

16位紧急指针字段: 仅当标志位字段的URG标志位为1时才有意义。指出有效载荷中为紧急数据的字节数。当所有紧急数据处理完后,TCP就会告诉应用程序恢复到正常操作。即使接收方窗口大小为0,也可以发送紧急数据,因为紧急数据无须缓存

1.10 选项/填充

长度不定,内容可变,因此必须使用首部长度来区分选项的具体长度。可选项和填充部分的长度为4n字节(n是整数),该部分是根据需要而增加的选项。如果不足4n字节,要加填充位,使得选项长度为32位(4字节)的整数倍,具体的做法是在这个字段中加入额外的零,以确保TCP头是32位(4字节)的整数倍。

典型的选项字段的结构示意图如

选项的第一个kind说明选项的类型。第二个length指定该选项的总长度,该长度包括kind和length所占的两个字节。第三个info是选项的具体信息。

1.10.1 kind=0

选项表结束(EOP)选项,一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处

1.10.2 kind=1

空操作(NOP)选项没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍

1.10.3 kind=2

最大段尺寸(Maximum Segment Size,MSS)选项。MSS是每个TCP报文段中的数据部分的最大长度。数据部分加上TCP首部才等于整个TCP报文段。在建立TCP连接的过程中,双方把自己能够支持的MSS填入这一字段,以后就按照这个数值传输数据,提高效率,网络利用率(避免本机发生IP分片)

双方可以有不同的MSS值。若主机未填写这一项,则MSS的默认值为536字节长度。因此,所有互联网上的主机都应能接受报文长度为536+20(TCP固定首部长度) =586字节。MSS的大小受到数据链路层的MTU(最大传输单元)的限制,因为TCP报文最终会封装在IP数据包中进行传输,而IP数据包的大小受到底层网络设备MTU的限制。一般来说,MSS的值会设为MTU减去IP报头和TCP报头的长度,以保证TCP报文在IP层传输不会被分片

1.10.4 kind=3

窗口扩大因子选项,TCP连接初始化时,通信双方使用该选项来协商接收窗口的扩大因子。在TCP的头部中,接收窗口大小是用16位表示的,故最大为65535字节,但实际上TCP模块允许的接收窗口大小远不止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。
假设TCP头部中的接收通告窗口大小是N,窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N*2M,或者说N左移M位。注意,M的取值范围是0~14。我们可以通过修改 /proc/sys/net/ipv4/tcp_window_scaling 内核变量来启用或关闭窗口扩大因子选项。
和MSS选项一样,窗口扩大因子选项只能出现在同步报文段中,否则将被忽略。但同步报文段本身不执行窗口扩大操作,即同步报文段头部的接收窗口大小就是该TCP报文段的实际接收窗口大小。当连接建立好之后,每个数据传输方向的窗口扩大因子就固定不变了。

1.10.5 kind=4

选择确认(Selective Acknowledgment,SACK)选项。TCP通信时,如果某个TCP报文段丢失,则TCP模块会重传最后被接收方确认的TCP报文段后续的所有报文段,这样原先已经正确传输的TCP报文段也可能重复发送,从而降低TCP性能。SACK选项正式为了改善这种情况而产生的,它使TCP模块只重新发送丢失的TCP报文段,而不用发送所有未被确认的TCP报文段。选择确认字段用于TCP连接建立时,表示是否支持SACK选项。可通过修改Linux系统的/proc/sys/net/ipv4/tcp_sack内核变量来启动或关闭该选项

1.10.6 kind=5

是SACK实际工作的选项。该选项的参数告诉发送端,本端已经接收到不连续的数据块,从而让发送端据此检查并重发丢失的数据。每个块边沿(end of block)参数包含一个4字节的序号。其中左边沿表示不连续块的第一个数据字节的序号,而右边沿表示不连续块的最后一个数据字节的下一个字节序号。左右边沿之间的数据就是没有收到的。因为一个块信息占8字节,所以TCP首部选项中实际最多可以包含4个这样的不连续数据块(4*8+2=34 < 40)

1.10.7 kind=8

时间戳选项,占10字节。时间戳有以下两个功能

  1.  用来计算通信双方之间的回路时间(Round Trip Time,RTT)。发送方在发送TCP报文段时把当前时间放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回显应答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT
  2. 用于处理TCP序号超过2^32(4,294,967,296)的情况,这又称为防止序号绕回PAWS(Protect Against Wrapped Sequence numbers)。我们知道,TCP报文段的序号只有32位,而每增加2^32个序号后就会重新从0开始编号。当使用高速网络时,在一次TCP连接的数据传送中序号很可能会被重复使用。例如,当使用 1.5Mbit/s的速率发送TCP报文段时,序号重复要6小时以上。但若使用2.5Gbit/s的速率发送数据报时,则不到14秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段(序号相同的情况下)区分开,可以在报文段中加上时间戳选项。我们可以通过修改Linux系统的 /proc/sys/net/ipv4/tcp_timestamps 内核变量来启用和关闭时间戳选项。

完整的选项:Transmission Control Protocol (TCP) Parameters

并不是所有的TCP实现都支持所有的选项类型。因此,在使用TCP选项字段时需要确保双方都支持相应的选项类型和长度,否则可能会导致通信错误和不兼容问题。

2 MSS/MTU

2.1 MTU

最大传输单元MTU,是指网络能够传输的最大数据包大小,以字节为单位。它是由底层网络技术(如以太网、Wi-Fi等)所决定的,并且通常是在网络设备(如路由器、交换机)上配置的。MTU包括数据链路层的数据部分以及数据链路层头部和尾部的大小。

MTU是数据链路层的概念,指数据链路层对帧的数据部分长度的限制,实际上,不同的厂商,甚至同一厂商的不同产品型号对MTU的定义也不尽相同

早期以太网使用共享链路的工作方式,为了保证CSMA/CD(载波多路复用/冲突检测)机制,规定了以太帧长度最小为64字节,最大为1518字节。

  • 最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;
  • 最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。

以太网最大的数据帧是1518字节,这样刨去帧头14字节和帧尾CRC校验部分4字节,那么剩下承载上层IP报文的地方最大就只有1500字节,这个值就是以太网的默认MTU值。这个MTU就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片,如果单个IP报文长度大于MTU,则会在发送出接口前被分片,被切割为小于或等于MTU长度的IP包。

2.2 MSS

是TCP协议中的一个概念,UDP协议中不存在MSS一说。

MSS指的是TCP协议中数据段的最大大小,它是在TCP连接建立时协商确定的。MSS是指在TCP数据包中的数据部分的最大允许长度,不包括TCP头部和IP头部的大小。TCP协议中的MSS通常由TCP连接的双方协商确定,取双方中较小的那个值。

通常情况下,MSS的大小会略小于MTU减去IP头部和TCP头部的长度,以保证数据包在传输过程中不会超出MTU的限制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2034345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔记:在WPF中如何控件级全局事件和应用程序级全局事件

一、目的&#xff1a;在WPF中如何控件级全局事件和应用程序级全局事件 二、实现 应用程序级全局事件 //注册应用程序级全局事件 EventManager.RegisterClassHandler(typeof(Button), Button.ClickEvent, new RoutedEventHandler(ic_event_Click)); 如上代码既会注册全局Butt…

Linux--C语言之循环结构

文章目录 一、循环结构&#xff08;一&#xff09;循环的概念&#xff08;二&#xff09;循环的类型&#xff08;三&#xff09;循环的构成&#xff08;四&#xff09;当型循环的实现while死循环 &#xff08;五&#xff09;for...总结死循环 &#xff08;七&#xff09;循环实…

数据结构:链式二叉树(2)

目录 前言 一、节点个数 1.1 二叉树的节点个数 1.2 二叉树叶子节点个数 1.3 二叉树第k层节点个数 二、查找值为x的节点 三、判断二叉树是否为完全二叉树 前言 上一篇 链式二叉树&#xff08;1&#xff09;&#xff0c;主要是讲了了一些链式二叉树的实现基础以及链式二叉…

day28 代码随想录 | 贪心 买卖股票 跳跃游戏 K次取反

买卖股票的最佳时机 II 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。返回 你能获得的 …

测绘工程项目管理系统,为测绘企业量身定制!测绘项目一体化管理

在日益复杂的测绘工程项目管理领域&#xff0c;高效、精准的信息化管理成为提升工作效率、降低运营成本的关键。企智汇软件&#xff0c;作为一款专为勘察、设计、监测、测绘等多元化工程项目量身打造的管理系统&#xff0c;正逐步成为行业内的佼佼者。 企智汇测绘管理系统深度…

Java FX 学习

声明&#xff1a;参考视频 一. Stage与Scene 舞台与场景&#xff1a;JavaFX应用程序将Ul容器定义为舞台&#xff08;Stage&#xff09;与场景&#xff08;Scene&#xff09;Stage类是顶级容器&#xff0c;它对应于窗体&#xff0c;其内容由Scene决定。Scene类是所有可视化内容…

运维监控体系实践与探索

在当今的数字化时代&#xff0c;运维工作作为企业IT服务的核心&#xff0c;面临着前所未有的挑战与机遇。随着业务规模的扩大和技术栈的复杂化&#xff0c;如何确保系统稳定运行、高效响应&#xff0c;成为运维团队亟需解决的问题。监控体系作为运维工作的基石&#xff0c;其建…

Python+selenium基于PO模式的Web自动化测试框架详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主…

分布式锁 分布式锁解决了什么问题 如何实现 看门狗机制是什么

分布式锁的基本概念 在 Redis 中实现分布式锁的常用方式是通过 SETNX 命令&#xff08;SET with NX option&#xff09;来设置一个键&#xff08;key&#xff09;&#xff0c;这个键代表锁。如果 key 不存在&#xff0c;SETNX 会设置成功&#xff0c;并返回 1&#xff0c;表示…

【LinuxPython】linux中通过源码方式安装python环境

python环境安装直接看第二部分即可。 文章目录 1.背景2.python安装3.包环境复制 1.背景 部署一个线上任务时&#xff0c;相同的代码本地开发机正常产出数据&#xff0c;线上产出数据为0&#xff0c;排查到原因是&#xff1a; ...File "/home/disk1/wangdeyong/venv/pyth…

linux搭建zabbix

zabbix简介 Zabbix是一个监控系统&#xff0c;它可以帮助我们实时检查设备的状态&#xff0c;比如服务器、网络设备等。当设备出现问题时&#xff0c;它会及时通知我们&#xff0c;让我们可以采取措施来解决。同时&#xff0c;它还可以把收集到的数据转化成图表和报告&#xf…

ITL-Internet Technology Letters

文章目录 一、期刊简介二、征稿信息三、投稿须知四、咨询 一、期刊简介 Internet Technology Letters本期旨在涵盖所有用于提高物联网性能的新兴或现代学习算法。在此背景下&#xff0c;我们打算收集有关物联网学习进展的研究论文。强烈鼓励与机器学习、计算智能、概率学习、统…

树和图()

预备知识&#xff08;可以不看&#xff09;&#xff1a; 无向图可以理解为是特殊的有向图 1. 图的遍历&#xff08;因为树可以理解为是特殊的图&#xff0c;因此这里不考虑树的遍历&#xff0c;只考虑图的遍历&#xff09; 给定一个具体的图&#xff0c;便于分析 下面是树的结构…

Servlet——个人笔记

Servlet——个人笔记 文章目录 [toc]Servlet简介Servlet命名Servlet由来实现过程 Servlet 相对 CGI 的优势简要说说什么是CGI Servlet 在IDEA中开发流程Servlet注解方式配置WebServlet注解源码WebServlet注解使用 Servlet常见容器Servlet 生命周期简介测试 Servlet 方法init()…

交叉编译util-linux

参考文章&#xff1a;https://www.cnblogs.com/wanglouxiaozi/p/17836701.html 1、下载源码 https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.39/2、编译 解压压缩包&#xff1a; sudo tar xvf util-linux-2.39.2.tar.gz执行autogen.sh生成configure ./aut…

解锁眼部舒压新境界:WT2605C-AT-L009眼部按摩仪蓝牙语音方案,手机APP控制,让护眼更轻松!

一、开发背景&#xff1a; 随着科技的飞速发展和人们生活品质的提升&#xff0c;眼部按摩仪作为一种能够缓解眼部疲劳、改善眼部血液循环的健康产品&#xff0c;越来越受到消费者的青睐。在众多眼部按摩仪中&#xff0c;采用WT2605C-AT-L009蓝牙模块的应用方案&#xff0c;不仅…

优思学院|PDCA和DMAIC之间如何选择?

在现代组织中&#xff0c;提升方法、质量和效率是企业追求卓越、保持竞争力的核心目标。在这条道路上&#xff0c;DMAIC&#xff08;定义、测量、分析、改进、控制&#xff09;和PDCA&#xff08;计划、执行、检查、行动&#xff09;被广泛应用于持续改进和问题解决。这两者虽然…

基于Java的大学新生入学系统设计与实现----附源码17610

摘要 随着高校规模的不断扩大和新生人数的增加&#xff0c;传统的手工登记和管理方式已经无法满足高效、准确的需求。为了提升大学新生入学迎新工作的效率和质量&#xff0c;本研究设计开发了一套基于Java的大学新生入学系统。系统通过信息技术的应用&#xff0c;集成了首页、校…

GIT IDEA 远程仓库操作

1、配置远程仓库地址 &#xff08;点击推送后如果没有配置远程仓库会让配置远程仓库&#xff09; 2、从远程仓库中下载项目到本地 3、提交->推送 更新代码&#xff08;拉取&#xff09;

PSTX250-600-70软启动器PSTX25060070面价

PSTX250-600-70软启动器PSTX25060070面价 PSTX250-600-70软启动器PSTX25060070面价 PSTX250-600-70软启动器PSTX25060070面价 PSTX250-600-70软启动器PSTX25060070说明书 PSTX250-600-70软启动器PSTX25060070接线图 PSTX250-600-70软启动器PSTX25060070引脚线 PSTX250-60…