(4层)TCP 首部字段

2023-11-10

TCP 报文段的首部格式

TCP 虽然是面向字节流的,但 TCP 发送的数据单元却是报文段。一个 TCP 报文段分为首部和数据两部分,而 TCP 的全部功能都体现在它首部中各字段的作用。

TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项(n 是整数)。因此 TCP 首部的最小长度是 20 字节。

在这里插入图片描述
首部各字段的意义如下:

  • 源端口和目的端口:各占 2 个字节,分别写入源端口号和目的端口号。
  • 序号:占 4 字节。本报文段所发送的数据的第一个字节的序号。序号范围是 [ 0, 2^32 -1 ],共 2^32 个序号,序号增加到 2^32 -1 后,下一个序号就又回到 0。TCP是面向字节流的。在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
  • 确认号:占 4 字节,是期望收到对方下一个报文段的第一个数据字节的序号。只有在 ACK = 1 时确认号字段才有意义。由于序号字段有 32 位长,可对 4GB(即 4 千兆字节)的数据进行编号。在一般情况下,可保证当序号重复时,旧序号的数据早已通过网络到达终点了。
  • 数据偏移:占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。这个字段实际上是指出 TCP 报文段的首部字段长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。但应注意,“数据偏移” 的单位是 32 位字。由于 4 位 二进制数能够表示的最大十进制数字是 15,因此数据偏移的最大值是 60 字节(15 * 32bit),这也是 TCP 首部的最大长度(即选项长度不能超过 40 字节 / 60 最大首部 -20 固定首部 = 40 选项长度)
  • 保留:占 6 位,保留位今后使用,但目前应置为 0 。
  • 6 个控制位:包括 URG、ACK、PSH、RST、SYN、FIN,用来说明本报文段的性质。
  • 窗口:占 2 字节。窗口指的是发送本报文段的一方的接收窗口。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化着。窗口值是 [ 0, 2^16 -1 ] 之间的整数。
  • 检验和:占 2 字节。检验和字段检验的范围包括首部和数据这两部分。和 UDP 数据报一样,在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。伪首部的格式与 UDP 用户数据报的伪首部一样。但应把伪首部第 4 个字段中的 17 改为 6(TCP 的协议号是 6),把第 5 个字段中的 UDP 长度改为 TCP 长度。接收方收到此报文段后,仍要加上这个伪首部来计算校验和。若使用 IPv6,则相应的伪首部也要改变。
  • 紧急指针:占 2 字节。紧急指针仅在 URG = 1 时才有意义,它指出本报文字段中的紧急数据的字节数(紧急数据之后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP 就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为零时也可发送紧急数据。
  • 选项:长度可变,最长可达 40 字节。当没有使用 “选项” 时,TCP 的首部长度是 20字节。

TCP 有 6 个控制位,用来说明报文段的性质。

  • 同步 SYN
  • 确认 ACK
  • 推送 PSH
  • 紧急 URG
  • 终止 FIN
  • 复位 RST

同步 SYN

在连接建立时用来同步序号。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中是 SYN = 1 和 ACK = 1。因此 SYN 置为 1 就表示这是一个连接请求或连接接受报文。

确认 ACK

仅当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。

推送 PSH

当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP 就可以使用推送操作。这时,发送方 TCP 把 PSH 置 1,并立即创建一个报文段发送出去。接收方 TCP 收到 PSH = 1 的报文段,就尽快地(即 “推送” 向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

紧急 URG

当 URG = 1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送。

当 URG 置 1时,发送应用进程就告诉发送方的 TCP 有紧急数据要传送。于是发送方 TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面仍是普通数据。这时要与首部中紧急指针字段配合使用。

紧急指针指出本报文字段中的紧急数据的字节数(紧急数据之后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。

终止 FIN

用来释放一个连接。当 FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

复位 RST

当 RST = 1时,表明 TCP 连接中出现严重差错(如由于主机奔溃或其他原因),必须释放连接,然后再重新建立运输连接。RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个连接。RST 也可称为 重建位 或 重置位。

选项

  • 最大报文段长度 MSS
  • 窗口扩大选项
  • 时间戳选项
  • 选择确认(SACK)

最大报文段长度 MSS

为什么要规定一个最大报文段长度 MSS 呢?实际上,MSS与接收窗口值没有关系。若选择较小的 MSS 长度,网络的利用率就降低。但反过来,若 TCP 报文段非常长,那么在 IP 层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的 TCP 报文段。当传输出错时还要进行重传。这些也都会时开销增大。

因此,MSS 应尽可能大些,只要在 IP 层传输时不需要再分片就行。由于 IP 数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要分片的 MSS,如果改走另一条路径就可能需要进行分片。因此最佳 MSS 是很难确定的。在连接建立的过程中,双方都把自己能够支持的 MSS 写入这一字段,以后就按照这个数值传送数据,两个传送方向可以有不同的 MSS 值。若主机未填写这一项,则 MSS 的默认值是 536 字节长。因此,所有在互联网上的主机都应能接受的报文段长度是 536 + 20(固定首部)= 556 字节。

窗口扩大选项

窗口扩大选项是为了扩大窗口。窗口扩大选项占 3 字节,其中有一个字节表示 移位值 S。新是窗口值等于 TCP 首部中的窗口位数从 16 增大到 (16 + S)。移位值允许使用的最大值是 14。

窗口扩大选项可以在双方初始建立 TCP 连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其端口时,可发送 S= 0 的选项,使窗口大小回到 16。

时间戳选项

时间戳选项占 10 字节,其中最主要的字段是 时间戳值字段(4 字节)和 时间戳回送回答字段(4 字节)。时间戳选项有以下两个功能:

  • 用来计算往返时间 RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出 RTT 来。
  • 用于处理 TCP 序号超过 2^32 的情况,这又称为防止序号绕回 PAWS。TCP 报文段的序号只有 32 位,而每增加 2^32 个序号就会重复使用原来用过的序号。为了使接收方能够把新的报文段和迟到很久的报文段区分开,可以在报文段中加上这种时间戳。

选择确认(SACK)

若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据?答案是可以的。选择确认就是一种可行的处理方法。

然而,SACK 文档并没有指明发送方应当怎样响应 SACK。因此大多数的实现还是重传所有未被确认的数据块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(4层)TCP 首部字段 的相关文章

  • NAT穿透 - P2P

    NAT穿透 P2P 一 NAT穿透 二 NAT分类 总结 一 NAT穿透 NAT穿透 即内网穿透 也称为打洞 其网络拓扑示例 二 NAT分类 完全锥型NAT 内网客户端映射到一个外部IP Port IP端口无限制 任意主机都可往该映射端口发
  • 逻辑分析题目:“给你一个9升的水桶和一个4升的水桶,在河里取6升水”

    问题答案 1 大桶装满 然后倒满小桶 这样大桶剩5升 小桶4升 2 小桶倒空 大桶再往小桶灌满 大桶剩1升 小桶4升 3 小桶倒空 把大桶的一升灌进小桶 这时大桶没有了 小桶一升 4 再灌满大桶 此时往已有1升得小桶里灌三升 大桶剩下6升
  • 算法训练Day38

    目录 动态规划理论基础 LeetCode509 斐波那契数 1 思路 2 代码实现 3 复杂度分析 4 总结与收获 LeetCode70 爬楼梯 1 思路 2 代码实现 3 复杂度分析 4 思考与收获 LeetCode746 使用最小花费爬

随机推荐

  • input/textarea文本的选择与获取

    获取input textarea中选择的文本function getSelectedText textbox if document selection IE return document selection createRange te
  • 网络与信息安全——知识整理(1)

    1 The Security Goals a Confidentiality to protect theconfidential information and to guard against the malicious actions
  • 数据结构——算法

    算法是什么 算法 Algorithm 是对解题方案的准确而完整的描述 是一系列解决问题的清晰指令 说白了就是 用来解决问题的 算法的特性 必须全部符合才可称之为一个算法 1 有穷性 一个算法必须在执行有穷步后结束且每一步必须在有穷时间内完成
  • Unity项目架构

    整理了一下Unity项目客户端涵盖一些内容 如果有遗漏 欢迎大家指出 感谢
  • 动画 + 大白话讲清楚React渲染原理

    前言 相信很多人跟我之前一样 看到源码两个字觉得触不可及 觉得离自己还很遥远 是需要非常多年的工作经验的大佬才能触及到的领域 就在去年我改变了这个想法 当时被react的几个生命周期执行顺序弄的睡不着觉 为什么有些时候生命周期的执行事与愿违
  • 小软件项目开发的管理

    小软件项目开发的管理 创建成功的工程 成功项目管理的秘密 更好地领导一个项目的诀窍 参与变革 走向成功 CMM TSP PSP讲义稿 开发流程中的可用性 软件开发的管理和控制 如何组织软件开发团队 软件项目管理 CMM 经验谈 实施CMM
  • stable-diffusion的webui和comfyuig共享模型路径

    1 修改上图extra model paths yaml example为extra model paths yaml Rename this to extra model paths yaml and ComfyUI will load
  • 最长公共子序列问题(Java)-动态规划

    动态规划法 经常会遇到复杂问题不能简单地分解成几个子问题 而会分解出一系列的子问题 简单地采用把大问题分解成子问题 并综合子问题的解导出大问题的解的方法 问题求解耗时会按问题规模呈幂级数增加 为了节约重复求相同子问题的时间 引入一个数组 不
  • 关于Springcloud的RestTemplate使用服务名报异常java.net.UnknownHostException

    关于Springcloud的RestTemplate使用服务名报异常java net UnknownHostException和使用localhost 8081报异常java lang IllegalStateException No in
  • ConstraintLayout基本使用之toLeftOf 、toTopOf、toRightOf、toBottomOf

    关于ConstraintLayout的博客 文章想必大家已经见过很多了 都是很全面的 今天这篇博客主要将ConstraintLayout的 layout constraintLeft toLeftOf layout constraintLe
  • HTML常考知识点和面试题

    保证页面不会出现编码问题 乱码 宽度等于设备宽度 初始化比例等于1 最大初始化比例等于1 user scalable no 将控制用户无法进行触屏扩大或缩小网页 适配移动端的第一步加上viewport 再针对手机屏幕大小调整 指定一个基础的
  • 【LeetCode队列】933 最近的请求次数 RecentCounter(java实现)

    文章目录 题目描述 一 解题思路 二 代码 1 最近的请求次数 2 测试数据 3 复杂度分析 4 执行时间 题目描述 写一个 RecentCounter 类来计算特定时间范围内最近的请求 请你实现 RecentCounter 类 Recen
  • 2023-04-29 读取内容为十六进制数字的txt文件转换为二进制文件

    读取内容为十六进制数字的txt文件转换为二进制文件 前言 一 示例代码 总结 前言 一个有趣的题目 读取txt文件内容两两结合 存储为dat文件 实现十分简单 有很多有意思的回答 但大都是python 其实这个用C的格式化读取fscanf
  • DC/DC:单端反激直流变换电路设计及matlab/Simulink仿真

    直流单端反激变换电路在开关管导通时电源将电能转为磁场能储存在变压器中 当开关管关断时再将磁能转变为电能传送到负载 单端反激变换电路是由升降压 Buck Boost 变换电路派生而来的 电路图如图所示 参数计算 理论计算可参考Buck Boo
  • 通过hyperledger fabric理解区块链存储

    hyperledger fabric 是一个联盟链框架 基于这个框架的最简单案例 A与B转账 我们来理解一下什么是区块链 第一个问题 区块链是干什么用的 很多人想到了比特币 以太坊等等 那具体是干什么用的呢 实际上可以理解为一个特别的数据存
  • ERROR: cannot launch node of type [map_server/map_server]: map_server等

    问题说明 在运行Autolabor simulation中README md的Quick start时 roslaunch simulation launch gmapping navigation launch 出现了以下错误 发现找不到
  • phpstudy安装和使用

    一 phpstudy 1 下载网址 http www xp cn 2 过程 1 往下拉可以看到推荐版本我下载的是8 1版本 注意下载路径不可以有中文或空格 2 按需下载 3 安装完成后解压 点击这个一步一步做就可以啦 3 简单熟悉phpst
  • 回形数(转载)

    转载及参考https blog csdn net sinat 37976731 article details 78614723 import java util Scanner author litianfu version 1 0 em
  • CCNP14-BGP基础

    文章目录 一 概念 二 特点 三 数据包 四 邻居关系 名词解释 五 BGP的防环机制 水平分割 六 BGP的工作过程 七 基本配置 八 BGP的三张表 1 简化邻居表 2 BGP的路由表 3 IP路由表 一 概念 BGP 边界网关协议 应
  • (4层)TCP 首部字段

    TCP 报文段的首部格式 TCP 虽然是面向字节流的 但 TCP 发送的数据单元却是报文段 一个 TCP 报文段分为首部和数据两部分 而 TCP 的全部功能都体现在它首部中各字段的作用 TCP 报文段首部的前 20 个字节是固定的 后面有