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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript 中如何判断变量是否为数字

    JavaScript 中如何判断变量是否为数字简介JavaScript是一种动态类型语言,这意味着解释器在运行时确定变量的类型。实际上,这也允许我们在相同的代码中使用相同的变量来存储不同类型的数据。如果没有文档和一致性,我们在使用代码时并不总是知道变量的类型。当我们期望一个变量是数字时,对字符串或数组进行操作可能会在代码中导致奇怪的结果。在本文中,我们将会介绍一些判断变量是否为数字的函数。像”10″之类的数字的字符串不应被接受。在JavaScript中,诸如NaN,Infinity和-Infinity之类的特殊值也是数字类型的。根据这些要求,

    2022年6月22日
    27
  • 黑客养成秘籍_名媛修炼手册

    黑客养成秘籍_名媛修炼手册第一节、黑客的种类和行为以我的理解,“黑客”大体上应该分为“正”、“邪”两类,正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善,而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情,因为邪派黑客所从事的事情违背了《黑客守则》,所以他们真正的名字叫“骇客”(Cracker)而非“黑客”(Hacker),也就是我们平时经常听说的“黑客”(Cacker

    2025年12月11日
    4
  • Feign使用Hystrix

    Feign使用HystrixFeigh是以接口形式工作,它没有方法体,那么Feign如何整合Hystrix呢?如何实现Feign的回退呢?事实上,Spring Cloud默认已经为Feign整合了Hystrix,下面看一个实例。一 新建项目microservice-consumer-movie-feign-hystrix-fallback二 编写Feigh接口packagecom.itmuch.cloud.study.us…

    2025年6月1日
    4
  • 【Vue】关闭 eslint 检测「建议收藏」

    【Vue】关闭 eslint 检测「建议收藏」eslint是一个JavaScript的校验插件,通常用来校验语法或代码的书写风格。

    2022年10月8日
    3
  • 树莓派4B CPU 挖矿 比特币(树莓派4b cpu)

    在使用空闲的服务器(VPS)来进行挖矿(门罗币XMR)中,我们用服务器来挖矿,如果你没有服务器,那么用手头的树莓派也可以来挖矿。我用树莓派搭了一个DNS服务器,CPU利用率很小,因此我决定在树莓派上再搭建一个挖矿软件进行挖矿。原因有两个,一是树莓派功耗低,可以长期开机,二是用来学习,虽然以树莓派的算力,肯定挖不了什么,但也算用来学习数字货币了。以下是用树莓派来挖莱特币LTC的教程。首先注册莱特币L…

    2022年4月12日
    108
  • c++二分法查找_二分法查找python代码

    c++二分法查找_二分法查找python代码二分法:二分法应用条件:1)数组为有序数组。2)同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。区间的定义:区间的定义不同代码就不同。1)定义target在[left,right]区间while(left<=right)要使用<=,因为left==right是有意义的,所以使用<=。if(nums[middle]>target)right要赋值为middle-1,因为当前这个nums[mid

    2025年6月17日
    4

发表回复

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

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