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

本文旨在介绍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.rhkb.cn/news/403475.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KDP数据平台:以实战案例验证技术领先力

本文由智领云 LeetTools 工具自动生成 申请试用&#xff1a; https://www.leettools.com/feedback/ 在当今快速发展的技术环境中&#xff0c;数据平台的选择对企业的数字化转型和业务发展至关重要。智领云开源KDP&#xff08;Kubernetes Data Platform&#xff09;在数据处理和…

效果炫酷的3D翻转书特效WordPress主题模板MagicBook主题v1.19

正文&#xff1a; MagicBook是一款支持3D翻书特效的书籍WordPress主题。支持可视化页面搭建&#xff0c;3D菜单&#xff0c;完全自适应设计,WPML多语言支持。 这款主题一定会让你爱不释手。虽然他是英文的&#xff0c;但不可不承认的是&#xff0c;它优雅的设计会让你愿意花时…

无缝融入,即刻智能[二]:Dify-LLM平台(聊天智能助手、AI工作流)快速使用指南,42K+星标见证专属智能方案

无缝融入,即刻智能[二]:Dify-LLM平台(聊天智能助手、AI工作流)快速使用指南,42K+星标见证专属智能方案 1.快速创建应用 你可以通过 3 种方式在 Dify 的工作室内创建应用: 基于应用模板创建(新手推荐) 创建一个空白应用 通过 DSL 文件(本地 / 在线)创建应用 从模板创建…

13 定时器

13 定时器 1、定时1.1 硬件定时器的特性1.2 硬件定时器对应的中断处理函数所作的工作(了解)1.3 linux内核中跟时间相关的三个概念&#xff1a; 2、延时2.1.延时定义2.2 忙等待2.3.休眠等待2.4 等待队列机制2.4.1 介绍2.4.2 结论2.4.3 进程休眠和唤醒的编程步骤方法 1方法 2 3、…

关于uniapp使用izExif.js 插件问题

需求&#xff1a;1.APP获取图片的属性&#xff0c;得到经纬度信息&#xff0c;然后标注到图片上 我们采用izExif.js 插件&#xff0c;进行获取图片信息&#xff0c;在模拟器测试好好地&#xff0c;但是使用真机测试发现getImageData没有返回信息&#xff0c;去izExif.js源码查…

ubuntu中python 改为默认使用python3,pip改为默认使用pip3

一、安装pip和python&#xff08;有的话可跳过&#xff09; 更新软件源 sudo apt update !!!apt和apt-get apt apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。 部分截图为apt-get&#xff0c;建议直接用apt 安装pip和python ubuntu 18.04和更高版本默认安…

字符串金额转换,字符串手机号屏蔽,身份证信息查看,敏感词替换

2135 在发票上面该写成零佰零拾零万贰仟壹佰叁拾伍元 我们用逆推法可以写成零零零贰壹叁伍->贰壹叁伍->2135 1.遍历获取到每一个数字&#xff0c;然后把大写放到数组里面&#xff0c;将数字当作索引&#xff0c;在数组里面查找大写 package stringdemo;import java.uti…

Jakarta Servlet 到 SpringMVC

Jakarta EE&#xff08;曾被称为Java EE&#xff09;是Java平台企业版&#xff08;Java Platform Enterprise Edition&#xff09;的下一代版本&#xff0c;它在Oracle将Java EE的开发和维护交给Eclipse Foundation后得以重生&#xff0c;并更名为Jakarta EE。Jakarta EE保留了…

Windows采用VS2019实现Open3D的C++应用

1、参考链接 https://blog.csdn.net/qq_31254435/article/details/137799739 但是&#xff0c;我的方法和上述链接不大一样&#xff0c;我是采用VS2019进行编译的&#xff0c;方便在Windows平台上验证各种算法。 2、创建一个VS2019的C Console工程 #include <iostream>…

MT1619 (A/B/C/D 15W-25W)快充电源主控芯片

MT1619 是一款快充电源主控芯片&#xff0c;MT1619内部集成了一颗高集成度、高性能的电流模式 PWM 控制器和一颗功率 MOSFET。MT1619适用于小于 30W 的开关电源。MT1619 具有恒功率功能&#xff0c;特别适用于 PD 充电器、电源适配器等中小功率的开关电源设备。极低的启动电流与…

windows下TortoiseSVN切换账号的方法

前言 在项目开始初期的时候大家会使用一个默认账号,后面会根据需要给每个人分配各自的个人账号,这个时候就需要重登陆新的svn账号,下面就是讲解下怎样在windows下修改登录TortoiseSVN的账号。 方法 1.首先在桌面右键&#xff0c;选择TortoiseSVN-settings 2.进入设置页面&a…

阿里云注册、认证、短信资质、签名、模板申请过程

一、帐号注册 输入“帐号密码注册”中的相关信息即可。 手机号是必须的&#xff0c;先确定好手机号。 正常的可以直接注册成功的。 二、实名认证 注册成功之后&#xff0c;就可以点击上述的“快速实名认证”。 这次选择的是“企业认证”。 有几种方式&#xff0c;如下&#x…

clamp靶机复现

靶机设置 设置靶机为NAT模式 靶机IP发现 nmap 192.168.112.0/24 靶机IP为192.168.112.143 目录扫描 dirsearch 192.168.112.143 访问浏览器 提示让我们扫描更多的目录 换个更大的字典&#xff0c;扫出来一个 /nt4stopc/ 目录 目录拼接 拼接 /nt4stopc/ 发现页面中有很多…

CeresPCL 岭回归拟合(曲线拟合)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 由于在使用最小二乘插值拟合时,会涉及到矩阵求逆的操作,但是如果这个矩阵接近于奇异时,那么拟合的结果就会与我们期望的结果存在较大差距,因此就有学者提出在最小二乘的误差函数中添加正则项,即: 这里我们也可…

【SpringBoot】SpringBoot框架的整体环境搭建和使用(整合Mybatis,Druid,Junit4,PageHelper,logback等)

目录 1.介绍 1.1 配置文件 1.2 目录结构 2.基于SpringBoot的SpringMVC 4.整合Mybatis 5.整合Druid连接池 6.整合Junit4 7.整合Logback 8.整合PageHelper 9.SpringBoot整合Thymeleaf ​编辑 【附录】springboot的pom.xml 1.介绍 Spring框架的优点是方便解耦、简化开…

Python -- GUI图形界面编程—GUI编程实例 博主也在持续学习中[ 持续更新中!!! 欢迎白嫖 也求粉啊啊啊~ ]

本文介绍了GUI的图形界面编程&#xff08;相关视频是哔站上的应该搜这个题目就能找到&#xff09;&#xff0c;文章还是很基础的&#xff0c;反正我是小白从0开始&#xff0c;主要的结构tinkter库、重要组件简介&#xff08;这个不用死记硬背 用的时候再说&#xff09;、Label&…

用于不平衡医疗数据分类的主动SMOTE

一、主动学习如何应用于不平衡数据的处理 首先&#xff0c;主动SMOTE不是像经典的SMOTE那样从训练集中随机选择一个样本作为生成合成样本的轴心点&#xff0c;而是通过不确定性和多样性采样来智能地进行样本选择&#xff0c;这是主动学习的两种技术。 在数据不平衡的情况下&…

Ubuntu上安装Redis的详细教程

1、安装redis 首先&#xff0c;访问Redis官网&#xff0c;点击首页的【Get Started】&#xff0c;然后点击Install Redis on Linux 安装 终端依次输入以下命令&#xff0c;如果过程中没有错误提示&#xff0c;则redis安装完成。 sudo apt install lsb-release curl gpg cu…

计算机科学速成课笔记

计算机速成课个人理解概要 1.计算机的本质 计算机的本质&#xff1a;极其简单的组件&#xff0c;经过一层层复杂的抽象&#xff0c;做出复杂的工作 2.控制电流的技术发展 继电器→真空管→晶体管 拥有了细微控制电流的手段 tip:早期机械计算机&#xff0c;被虫子(bug)卡住…

基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码

介绍 适用于高能耗企业、建筑、工厂、园区的水、电、气、热、油、空压机等能源数据采集、分析、报表&#xff1b; 基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 软件架构 软件功能 数字大屏 使用说明