TCP头部结构详解

article/2025/4/26 1:58:23

tcp头部信息出现在每个tcp报文段中,用于指定通信的源端端口,目的端口,管理tcp连接等。tcp头部结构如下图所示:
 

tcp头部结构

1、16位端口号:告知主机该报文段来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。进行tcp通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。

2、32位序号:一次tcp通信过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行tcp通信,A发送给B的第一个tcp报文段中,序号值被系统初始化为某个随机值ISN。那么在该传输方向上(从A到B),后续的tcp报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个在整个字节流中的偏移。例如,某个tcp报文段传送的数据时字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。另一个传输方向(从B到A)的tcp报文段的序号值也具有相同的含义。

3、32位确认号:用作对另一方发送来的tcp报文段的相应。其值是收到的tcp报文段的序号值加1。假设主机A和主机B进行tcp通信,那么A发送出的tcp报文段不仅携带自己的序号,而且包含对B发送来的tcp报文段的确认号。反之,B发送出的tcp报文段也同时携带自己的序号和对A发送来的报文的确认号。

4、4位头部长度:标识该tcp头部有多少个32bit字(4字节)因为4位最大能表示15,所以tcp头部最长是60字节。

5、6位标志位(即图中的保留6位):标志位有如下几项

  • URG标志,表示紧急指针是否有效
  • ACK标志,表示确认号是否有效。称携带ACK标志的tcp报文段位确认报文段
  • PSH标志,提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为接受后续数据腾出空间(如果应用程序不将接收的数据读走,它们就会一直停留在tcp缓冲区中)
  • RST标志,表示要求对方重新建立连接。携带RST标志的tcp报文段为复位报文段。
  • SYN标志,表示请求建立一个连接。携带SYN标志的tcp报文段为同步报文段。
  • FIN标志,表示通知对方本端要关闭连接了。携带FIN标志的tcp报文段为结束报文段。

6、16位窗口大小:是tcp流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。

7、16位校验和:由发送端填充,接收端对tcp报文段执行CRC算法以校验tcp报文段在传输过程中是否损坏。注意,这个校验不仅包括tcp头部,也包括数据部分。这也是tcp可靠传输的一个重要保障。

8、16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。因此,确切的说,这个字段是紧急指针相对当前序列号的偏移,称为紧急偏移。tcp的紧急指针是发送端向接收端发送紧急数据的方法。

9、16位选项:

       TCP头部的最后一个选项字段是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。典型的TCP头部选项结构如图3-4所示。

       选项的第一个字段kind说明选项的类型。有的TCP选项没有后面两个字段,仅包含1字节的kind字段。第二个字段length(如果有的话)指定该选项的总长度,该长度包括kind字段和length字段占据的2字节。第三个字段info(如果有的话)是选项的具体信息。常见的TCP选项有7种,如图3-5所示。

       kind=0是选项表结束选项。
       kind=1是空操作(nop)选项,没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍。
       kind=2是最大报文段长度选项。TCP连接初始化时,通信双方使用该选项来协商最大报文段长度(Max Segment Size,MSS)。TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免本机发生IP分片。对以太网而言,MSS值是1460(1500-40)字节。
       kind=3是窗口扩大因子选项。TCP连接初始化时,通信双方使用该选项来协商接收通告窗口的扩大因子。在TCP的头部中,接收通告窗口大小是用16位表示的,故最大为65?535字节,但实际上TCP模块允许的接收通告窗口大小远不止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。假设TCP头部中的接收通告窗口大小是N,窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N乘2M,或者说N左移M位。注意,M的取值范围是0~14。我们可以通过修改/proc/sys/net/ipv4/tcp_window_scaling内核变量来启用或关闭窗口扩大因子选项。
和MSS选项一样,窗口扩大因子选项只能出现在同步报文段中,否则将被忽略。但同步报文段本身不执行窗口扩大操作,即同步报文段头部的接收通告窗口大小就是该TCP报文段的实际接收通告窗口大小。当连接建立好之后,每个数据传输方向的窗口扩大因子就固定不变了。关于窗口扩大因子选项的细节,可参考标准文档RFC 1323。
       kind=4是选择性确认(Selective Acknowledgment,SACK)选项。TCP通信时,如果某个TCP报文段丢失,则TCP模块会重传最后被确认的TCP报文段后续的所有报文段,这样原先已经正确传输的TCP报文段也可能重复发送,从而降低了TCP性能。SACK技术正是为改善这种情况而产生的,它使TCP模块只重新发送丢失的TCP报文段,不用发送所有未被确认的TCP报文段。选择性确认选项用在连接初始化时,表示是否支持SACK技术。我们可以通过修改/proc/sys/net/ipv4/tcp_sack内核变量来启用或关闭选择性确认选项。
       kind=5是SACK实际工作的选项。该选项的参数告诉发送方本端已经收到并缓存的不连续的数据块,从而让发送端可以据此检查并重发丢失的数据块。每个块边沿(edge of block)参数包含一个4字节的序号。其中块左边沿表示不连续块的第一个数据的序号,而块右边沿则表示不连续块的最后一个数据的序号的下一个序号。这样一对参数(块左边沿和块右边沿)之间的数据是没有收到的。因为一个块信息占用8字节,所以TCP头部选项中实际上最多可以包含4个这样的不连续数据块(考虑选项类型和长度占用的2字节)。
       kind=8是时间戳选项。该选项提供了较为准确的计算通信双方之间的回路时间(Round Trip Time,RTT)的方法,从而为TCP流量控制提供重要信息。我们可以通过修改/proc/sys/net/ipv4/tcp_timestamps内核变量来启用或关闭时间戳选项。


http://chatgpt.dhexx.cn/article/CUOaQKZg.shtml

相关文章

TCP头部详解

1. TCP的定义 TCP提供一种面向连接的、可靠的字节流服务。 面向连接: 两个使用TCP的应用(通常是一个客户和一个服务)在彼此交换数据之前必须建立一个TCP连接。 TCP提供可靠性的方式: 1)应用数据被分割成TCP认为最适合发送的数据块; 2)当…

TCP协议详解(一):TCP头部结构

TCP字节流服务 网络传输层中,TCP是面向连接、可靠的、字节流传输。 TCP协议通信双方必须先建立连接,通信双方必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP是全双工的,即双方的数据读写可通过一个连接…

Python 变量的命名规范

引言 混乱或错误的命名不仅让我们对代码难以理解,更糟糕的是,会误导我们的思维,导致对代码的理解完全错误。相反,良好的命名,则可以让我们的代码非常容易读懂,也能向读者正确表达事物以及逻辑的本质&#x…

matlab中变量命名规则,Matlab变量及命名规则

Matlab变量及命名规则 Matlab变量及命名规则 Matlab中所有的变量都是用矩阵形式来表示的,即所有的变量都表示一个矩阵或者一个向量。其命名规则如下: (1)变量名对大小写敏感; (2)变量名的第一个字符必须为英文字母,其长度不能超过…

matlab变量名的命名规则

简述Java中变量的命名的规则? 首字母只能是字母下划线‘_’‘$’符号(变量名首字母不能是数字!!!) 其余部分任意多的:数字字母下划线‘_’‘$’符号 Java命名规则 局部变量和成员变量 我说我知道的约定俗成&#xff1a…

vb变量名的命名规则

求十分详细的的java变量命名规范 您好,提问者: 在java编程中命名规范是统一的,而且老外发明的东西是没有中文的,严格区分大小写。 规范:以字母、下划线、$符号组成,不能以数字开头,声明类跟变量…

python变量名有哪些_python变量名命名规则

原博文 2020-03-21 11:07 − 一.python变量名命名规则: 1.变量名通常由字母,数字,下划线组成; 2.数字不能作为变量名开头; 3.不能以python中的关键字命名; 4.变量名要有意义; 5.不要用汉字和拼音去命名; 6.变量名要区分大小写; 7.推荐使用驼峰型(GuessAge或guessAge)和…

Tips:一个字符占几个字节?

《JAVA啃骨头》之 Javascript 章节 Tips:一个字符占几个字节? ASCII码:   一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,…

字节与字符的区别 一个字母占一个字节(学习记录)

字节(Byte):字节是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。 字符(Character):计算机中使用的字母、数字、字和符号,比如’A’、‘B’、‘$’、…

一个指针占几个字节?原理是什么呢?

一个指针占几个字节的问题,感觉会C语言的同学都知道。但是在面试过程中,面了几个同学,不是答忘记了,就是两个、四个的瞎蒙。。。 那么,一个指针到底占几个字节呢? 其实,这个问题很简单&#x…

一个汉字几个字符?几个字节?字符与字节关系傻傻分不清

一个汉字一个字符!不信你去java输入char ch 汉’看看报不报错 学习java也有段时间了,一直都是毛里毛糙的学习,但都是停留在略懂阶段,似乎会,实际上差得远了,,还是要沉下来心一点一点学呀&…

Office 2016更新后 Word 2016、Excel 2016、Power 2016、Visio 2016、OneNote 2016图标全部消失问题解决

【问题描述】 打开办公软件后显示Office在更新,更新完成后开始屏幕固定的 Word 2016、Excel 2016、Power 2016、Visio 2016、OneNote 2016图标全部消失了。 全局搜索只能搜索到Word、Excel、Power、Visio、OneNote,但已经不是2016版的了,而是…

关于修复Office图标白色的问题

问题: Offcie的Word和Excel的文件的部分后缀文件(.doc .docx .xls .xlsx)变成白色,且无法通过默认打开方式修改图标 可能原因: 以前使用过WPS,卸载后,在注册表没有删除干净 这个E:\Software\WPS Office\....目录和指…

卸载wps后桌面上的office文件图标变成了白色

文章目录 卸载wps后桌面上的office文件图标变成了白色第一步:第二步 卸载wps后桌面上的office文件图标变成了白色 作者:wyf 第一步: **win(图标)R,输入regedit,点击确定**第二步 2、找到HKEY_CLASSES_RO…

提取 Office 2016 工具栏图标

Office 图标精美漂亮,作为微软的官方图标,与 Windows 具有一致的风格,但我们若想把这些图标用在自己的程序中,却并不容易,使用常规的提取程序资源的方法,根本得不到这些图标。 微软虽然没有把这些图标开放给…

office图标异常解决办法

问题描述: 前不久才重装过系统,可是没多久就出现了一个很恶心的问题:word文档、excel文档图标异常,显示的是下面这样: (造成这样的原因一般是装了 wps,卸载后又装了office) 打开…

office图标显示异常和新建时图标没有显示等问题解决

1.office图标显示异常问题解决方法 1>点击“开始” 2>在在运行命令行中输入“regedit”,找到regedit.exe执行文件,点击进入注册表 3>在左侧找到HKEY_CLASSES_ROOT目录,并展开: 4>删除其中一些注册表选项&#xff1…

卸载office后桌面上的word文件图标变成了白色

如图所示; 解决办法:适用Office2016/365中的Word、PowerPoint、Excel文件图标因安装WPS造成图标异常,显示为无法识别的程序图标,卸载、重装都不能修复,但能正常使用。 解决办法: 1、运行regedit&#xff0c…

修复Microsoft Office的Word、Excel、PPT丢失图标

文章目录 打开注册表Word注册表Excel注册表PPT注册表修复 使用注册表方式修复,删除Word、Excel、PPT的对应文件夹,那个丢失,就删除那个,然后修复 打开注册表 Windows R 打开电脑中的运行界面,输入命令回车: regedit …

将默认打开方式改成Office后,桌面办公软件图标变成白板

(注意:修改注册表有风险,请谨慎使用) 通过注册表解决。关键看图标是否仍然关联WPS,如果有则删除相关关联参数 步骤1:同时按WinR键,输入regedit打开注册表 步骤2:在注册表中打开HKEY_CLASSES_ROOT​文件夹…