TCP报文段详解

TCP协议tcp报文段源端口&目的端口2字节(tcp的分用功能以端口实现)序号4字节tcp三次握手中的seq,表示tcp数据段发送的第一个字节的序号,范围[0,2^32-1],即mod2^32;例如,seq=201,携带的数据有100,那么最后一个字节的序号就为300,那么下一个报文段就应该从401开始,下一个序列的首地址.tcp是面向字节…

大家好,又见面了,我是你们的朋友全栈君。

TCP协议

  • tcp报文段
    图片来源于网络
  1. 源端口&目的端口 2字节
    (tcp的分用功能以端口实现)

  2. 序号 4字节
    tcp三次握手中的seq,表示tcp数据段发送的第一个字节的序号,范围[0,2^32 – 1],即mod 2^32; 例如,seq = 201,携带的数据有100,那么最后一个字节的序号就为300,那么下一个报文段就应该从401开始,下一个序列的首地址.

    tcp是面向字节流的,在tcp连接中每一个字节流都按顺编号

  3. 确认号 4字节
    为期望收到对方下一个报文段的第一个数据字节序号

注意:若确认号=N,则表示序号N-1为止的序列号已正确收到

  1. 数据偏移 4位
    指出偏移多远,实际就是指定报文段的首部长度
    因为占4位,最大15,因此数据最大偏移为60:即为tcp首部最大长度

  2. 控制位 6位

URG
为1表示高优先级数据包,紧急指针字段有效。
(告诉系统此报文段有紧急数据,应尽快传输,而不要原来的排队顺序)

ACK
==1 表示确认号字段有效(连接建立后,传输的报文段都应该置为1)
==0 确认号无效

PSH
为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。

RST
为1表示出现严重差错。可能需要重现创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
RST 可称为重建位&重置位
SYN
为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
当 syn=1&ack=1,表明这是一个连接请求报文段
FIN
==1 表示发送方没有数据要传输了,要求释放连接

  1. 窗口 2字节
    表示从确认号开始,本报文的接受方可以接收的字节数,即接收窗口大小,用于流量控制。
    (窗口字段明确指出了现在允许对方发送的数据量:窗口大小经常是在动态变换着的!)

  2. 校验和 2字节
    对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。

  3. 紧急指针 2字节
    本报文段中的紧急数据的最后一个字节的序号。本报文段中的紧急数据的最后一个字节的序号。

  4. 选项字段—最多40字节
    每个选项的开始是1字节的kind字段,说明选项的类型。 每个选项的开始是1字节的kind字段,说明选项的类型。
    附:详细解释

选项表结束(1字节)
无操作(1字节) 用于选项字段之间的字边界对齐。
最大报文段长度
(4字节,Maximum Segment Size,MSS)通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能接收的最大长度的报文段。通常将MSS设置为(MTU-40)字节,携带TCP报文段的IP数据报的长度就不会超过MTU,从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。
窗口扩大因子(4字节,wscale),取值0-14。用来把TCP的窗口的值左移的位数,使窗口值乘倍。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。
sackOK—发送端支持并同意使用SACK选项。
SACK实际工作的选项。
时间戳(10字节,TCP Timestamps Option,TSopt)
发送端的时间戳(Timestamp Value field,TSval,4字节)
时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)

附:详细的存储图
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126175.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • activiti7实战教程(二)作图「建议收藏」

    activiti7实战教程(二)作图「建议收藏」IDEA:2018.2.2插件:actibpm新建BPMN文件依次拖出需要的组件,最好按照流程的顺序进行拖出,这样后面看xml的时候比较直观。修改每个节点的名称填写每个审批节点的伪码:科室长、分管领导、采购人员、以及网关的伪码表达式这样流程图就做好了。接下来要根据流程图生成XML文件和png图片复制一份流程图,修改名称:后缀名加上20.xml在xml文件上右键到此为止,整个流程图作图就完整的结束了。另外呢告知一点,流程图…

    2022年7月21日
    34
  • vue封装组件方法_什么是vue组件

    vue封装组件方法_什么是vue组件在package.json中配置打包路径:1、在scripts中定义打包指令;指令说明:–targetlib关键字指定打包的目录–name打包后的文件名称–dest打包后的文件夹的名称例如:“sf_common_build”:”nodebuild/build.js–targetlib./src/ui/index.js–nameqf-ssf–destcom_ss3种方式:1、npm本地file引用:在项目控制台下输入npminstall…/com

    2022年9月23日
    3
  • vue学习笔记-day03

    vue学习笔记-day03

    2021年7月12日
    85
  • isset,empty,is_null小知识

    isset,empty,is_null小知识

    2022年1月2日
    46
  • python中的缩进规则_什么叫代码缩进

    python中的缩进规则_什么叫代码缩进引言python对缩进是敏感的,而大多教程对缩进规则,往往就几句话带过,对于没有其他语言基础的初学者,十分不友好,本文就把python常见的缩进问题做了一些整理。一、Python缩进长度及缩进字符常看到一些Python缩进错误的解读,“tab符和空格做为缩进不能混用”、“缩进一定是4个空格”。实际上并没有这些限制,例如图中的示例就可以正常运行。a=1ifa==1:print(a)else:print(1)k=1;whilek<5:

    2022年10月11日
    2
  • Linux上安装JDK

    Linux上安装JDK1 在安装前 需要先关掉 linux 的防火墙查看防火墙状态命令 systemctlsta service2 关闭防火墙 systemctlsto service3 再次查看防火墙 4 切换到 root 用户并输入相应的密码 不然会提示用户权限不够 suroot5 在 usr local 中创建 java 目录 mkdir usr local java6 使用 filezilla 工具连接 linux 主机 IP

    2025年8月2日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号