源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用 16 位表示的,可推算计算机的端口个数为 2^16 个。

序列号:表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由 32 位表示,所以每 2^32 个字节,就会出现序列号回绕,再次从 0 开始。那如何区分两个相同序列号的不同 TCP 报文段就是一个问题了,后面会有答案,暂时可以不管。

确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号。也就是告诉发送方:我希望你(指发送方)下次发送给我的 TCP 报文段的序列号字段的值是这个确认号。

TCP 首部长度:由于 TCP 首部包含一个长度可变的选项部分,所以需要这么一个值来指定这个 TCP 报文段到底有多长。或者可以这么理解:就是表示 TCP 报文段中数据部分在整个 TCP 报文段中的位置。该字段的单位是 32 位字,即:4 个字节。

URG:表示本报文段中发送的数据是否包含紧急数据。URG=1,表示有紧急数据。后面的紧急指针字段只有当 URG=1 时才有效。

ACK:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。

PSH:告诉对方收到该报文段后是否应该立即把数据推送给上层。如果为 1,则表示对方应当立即把数据提交给上层,而不是缓存起来。

RST:只有当 RST=1 时才有用。如果你收到一个 RST=1 的报文,说明你与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明你上次发送给主机的数据有问题,主机拒绝响应。

SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才置为 1。

FIN:标记数据是否发送完毕。如果 FIN=1,就相当于告诉对方:“我的数据已经发送完毕,你可以释放连接了”

窗口大小:表示现在运行对方发送的数据量。也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量。

校验和:提供额外的可靠性。具体如何校验,参考其他资料。

紧急指针:标记紧急数据在数据字段中的位置。

选项部分:其最大长度可根据 TCP 首部长度进行推算。TCP 首部长度用 4 位表示,那么选项部分最长为:(2^4-1)*4-20=40 字节。

选项部分的应用:

MSS 最大报文段长度 (Maxium Segment Size):指明数据字段的最大长度,数据字段的长度加上 TCP 首部的长度才等于整个 TCP 报文段的长度。MSS 值指示自己期望对方发送 TCP 报文段时那个数据字段的长度。通信双方可以有不同的 MSS 值。如果未填写,默认采用 536 字节。MSS 只出现在 SYN 报文中。即:MSS 出现在 SYN=1 的报文段中。

窗口扩大选项 (Windows Scaling):由于 TCP 首部的窗口大小字段长度是 16 位,所以其表示的最大数是 65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项。

SACK 选择确认项 (Selective Acknowledgements):用来确保只重传缺少的报文段,而不是重传所有报文段。比如主机 A 发送报文段 1、2、3,而主机 B 仅收到报文段 1、3。那么此时就需要使用 SACK 选项来告诉发送方只发送丢失的数据。那么又如何指明丢失了哪些报文段呢?使用 SACK 需要两个功能字节。一个表示要使用 SACK 选项,另一个指明这个选项占用多少字节。描述丢失的报文段 2,是通过描述它的左右边界报文段 1、3 来完成的。而这个 1、3 实际上是表示序列号,所以描述一个丢失的报文段需要 64 位即 8 个字节的空间。那么可以推算整个选项字段最多描述 (40-2)/8=4 个丢失的报文段。

时间戳选项(Timestamps):可以用来计算 RTT(往返时间),发送方发送 TCP 报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出 RTT。也可以用来防止回绕序号 PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用 32 为表示,每 2^32 个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文。

NOP(NO-Operation):它要求选项部分中的每种选项长度必须是 4 字节的倍数,不足的则用 NOP 填充。同时也可以用来分割不同的选项字段。如窗口扩大选项和 SACK 之间用 NOP 隔开。

 
http://seahi.me/archives/1732.html

TCP 报文段结构的更多相关文章

  1. 计算机网络(8)-----TCP报文段的首部格式

    TCP报文段的首部格式 概述 TCP报文段首部的前20个字节是固定的,因此TCP首部的最小长度是20字节. 源端口和目标端口 各占2个字节,分别写入源端口号和目的端口号. 序列号 占4个字节,表示本报 ...

  2. TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。

    from:https://blog.csdn.net/mary19920410/article/details/58030147 TCP报文是TCP层传输的数据单元,也叫报文段. 1.端口号:用来标识 ...

  3. 一个TCP报文段的数据部分最多为多少个字节,为什么

    IP数据报的最大长度=2^16-1=65535(字节)TCP报文段的数据部分=IP数据报的最大长度-IP数据报的首部-TCP报文段的首部=65535-20-20=65495(字节) 一个tcp报文段的 ...

  4. 运输层5——TCP报文段的首部格式

    写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控制协议TCP概述 运输层4--TCP可靠运输的工作原理 ...

  5. 计算机网络(三),TCP报文段详解

    目录 1.TCP(Transmission Control Protocol传输控制协议)作用 2.TCP报文段详解 三.TCP报文段详解 1.TCP(Transmission Control Pro ...

  6. TCP报文段首部格式详解

    TCP首部格式   格式字段详解   源端口.目标端口: 计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两 ...

  7. TCP报文段的首部格式 20字节的固定首部

    <----  IP首部 TCP首部 TCP报文段的数据部分  <---- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  8. 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...

  9. TCP报文段首部详解

    TCP虽然是面向字节流的,但是tcp传送的数据单元却是报文段,一个报文段分为首部和数据两部分,几乎TCP所有功能都从首部来体现,下面我们来详细的剖析下它的首部. (1):源端口与目标端口:分别写入源端 ...

随机推荐

  1. 【hdu 6208】The Dominator of Strings

    [链接]h在这里写链接 [题意] 问你n个串里面有没有一个串,使得其余n-1个串都是他的子串. [题解] 后缀数组. 答案肯定是那个最长的串. 则,把那个串求一下Sa数组(注意仅仅那个最长的串求). ...

  2. (转)Vim练级攻略

    (转)Vim练级攻略 原文链接:http://coolshell.cn/articles/5426.html vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆 ...

  3. Unity插件之NGUI学习(5)—— 创建Label图文混排及文字点击

    创建一个新的Scene,并按 Unity插件之NGUI学习(2)创建UI Root. 准备工作,制作Font.如今Project窗体创建一个Font目录.然后从系统自带字体目录中选择自己须要的字体,我 ...

  4. C++中的虚析构函数、纯虚析构函数具体解释

    C++中析构函数能够为纯虚函数吗? 众所周知.在实现多态的过程中,一般将基类的析构函数设为virtual.以便在delete的时候能够多态的链式调用.那么析构函数能否够设为纯虚呢? class CBa ...

  5. strace跟踪线程调用

    方法一:strace -fp pid , 可以跟踪所有线程, 进程的系统调用. [root@xxxx]strace -p 24091 Process xxx attached - interrupt ...

  6. ZOJ FatMouse' Trade 贪心

    得之我幸,不得,我命.仅此而已. 学姐说呀,希望下次看到你的时候依然潇洒如故.(笑~) 我就是这么潇洒~哈哈. 感觉大家比我还紧张~ 我很好的.真的 ------------------------- ...

  7. 学习金字塔 分类: T_TALENT 2014-05-21 09:25 331人阅读 评论(0) 收藏

    学习金字塔是美国缅因州的国家训练实验室研究成果,它用数字形式形象显示了:采用不同的学习方式,学习者在两周以后还能记住内容(平均学习保持率)的多少.它是一种现代学习方式的理论.最早它是由美国学者.著名的 ...

  8. HttpClient基础教程 分类: C_OHTERS 2014-05-18 23:23 2600人阅读 评论(0) 收藏

    1.HttpClient相关的重要资料 官方网站:http://hc.apache.org/ API:http://hc.apache.org/httpcomponents-client-4.3.x/ ...

  9. 【t010】最近距离

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 聚类方法要求将空间中的点集,按照一点的方式进行归类,要求每一类中的点集相互之间的距离足够的"近 ...

  10. js对时间的操作相关

    摘自网络,我主要用了日期增加若干天之后获得的日期,就是现在是5月2号,我增加30天,应该返回6月几号来着,就是这个意思 用到了Date.prototype.DateAdd 方法,prototype的意 ...