前言:上学期实训课,由于要做一个网络通信的应用,期间遇到各种问题,让我深感计算机网络知识的薄弱。于是上网查找大量的资料,期间偶然发现了roc大神的博客,很喜欢他简明易懂的博文风格。本文受roc的《计算机网络协议包头赏析-TCP》的启发,希望根据自己所学以及IETF的相关文档,在原有基础上,进行相应知识的扩充,特别地将针对大部分字段的用途进行分析。

(1)TCP报文格式图示:

  TCP报文段也分为首部和数据两部分,首部默认情况下一般是20字节长度,但在一些需求情况下,会使用“可选字段”,这时,首部长度会有所增加,但最长不超过60字节。

(2)固定头部的各字段的功能解说:

【源端口】- 16bit

  来源处的端口号;端口号有65536个,即2^16。我也写了一篇关于端口号的范围的分类的《计算机网络 之 TCP和UDP的端口解析》,供大家参考。

【目的端口】- 16bit

  目的处的端口号;

【序号】- 32bit

  TCP在对数据进行分段的时候,会给每一个TCP报文段添加一个序号,序号字段的值其实是该文段所发送的数据的第一个字节的序号。这么做的原因是,TCP是面向连接的可靠服务,这个序号可以保证数据在传输过程中保持有序性,接受端可以通过这个序号确认收到的数据的完整性和先后顺序;

【确认号】- 32bit

  确认号,是期望收到对方的下一个报文段的数据的第一个字节的序号;(后续将会提供一片关于如何使用序号和确认号保证数据的完整性和有序性的文章供大家参考。)

【数据偏移】- 4bit

  其实它本质上就是“首部长度”,因为“数据偏移”是指TCP报文段的数据部分的起始处距离TCP报文段的起始处的距离。(仍然很拗口,但相信你能明白)。

  数据偏移总共占4bit,因此最大能表示的数值为15。但TCP的报文头部至少为20字节。因此数据偏移的单位是“4字节”,此处的设计和IP数据报的设计是完全相同的,所以说TCP报文段首部的长度最长为15×4=60字节,且首部长度必须为4字节的整数倍。

【保留字段】- 6bit

  IETF文档指出,这6bit在标准中是保留字段,留待以后使用,必须为0。我猜测,有两个目的,第一个是预留除URG/ACK/PSH/RST/SYN/FIN/之外的冗余功能位;第二个是为了对齐字节位。

【控制位】- 6bit

  又称为TCP flag,该字段从左到右分为以下六个字段,指明包的类型。同时用于控制TCP的状态机,同时ACK和SYN与三次握手协议有关,FIN与四次挥手协议有关。

  ① 紧急字段URG - 1bit

    当URG=1时,此字段告诉系统此报文段中有紧急数据,应尽快传送。

  ② 确认字段ACK - 1bit

    当ACK=1时,表示确认,且确认号有效;当ACK=0时,确认号字段无效。

  ③ 推送字段PSH - 1bit

    当PSH=1时,则报文段会被尽快地交付给目的方,不会对这样的报文段使用缓存策略。关于URG和PSH,有一篇博文的扩展:《TCP标志中的URG和PSH位》

  ④ 复位字段RST - 1bit

    当RST为1时,表明TCP连接中出现了严重的差错,必须释放连接,然后再重新建立连接。

  ⑤ 同步字段SYN - 1bit

    当SYN=1时,表示发起一个连接请求。

  ⑥ 终止字段FIN - 1bit

    用来释放连接。当FIN=1时,表明此报文段的发送端的数据已发送完成,并要求释放连接。

【窗口字段】- 16bit

  此字段用来控制对方发送的数据量,单位为字节。

  一般TCP连接的其中一端会根据自身的缓存空间大小来确定自己的接收窗口大小,然后告知另一端以确定另一端的发送窗口大小。该字段与TCP的流量控制服务有关。

【校验和字段】- 16bit

  与IP协议的检验和不同,TCP的这个校验和是针对首部和数据两部分的。

【紧急指针字段】- 16bit

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

  

(3)TCP报文的可选项

  在TCP报文头部的前20个字节是固定的。有时TCP报文也会在报文头部增加一些选项,该部分的长度不固定,不同的应用场景会有所变化。

  该部分的可选项常用的包含但不仅限于有以下几种:

  ① 最大报文传输段(即常提到的MSS): 用于确定每一个TCP报文段中科传输的最大的数据长度(注意,不包括头部)

  ② 窗口扩大选项:TCP的窗口大小最大为64K,在大多数时候这是够用的,但有时候为了提高吞吐量,就需要对窗口扩大,这个时候,就需要使用该选项对窗口进行扩大。

  ③ 时间戳选项:可以用来计算RLL,进而可以用于TCP的拥塞控制。

计算机网络 之 TCP协议报文结构的更多相关文章

  1. modbus tcp数据报文结构

    modbus tcp数据报文结构 请求:00 00 00 00 00 06 09 03 00 00 00 01 响应:00 00 00 00 00 05 09 03 02 12 34 一次modbus ...

  2. 计算机网络(7)-----TCP协议概述

    传输控制协议(Transmission Control Protocol) 概念 一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它 ...

  3. 计算机网络:TCP协议建立连接的过程为什么是三次握手而不是两次?【对于网上的两种说法我的思考】

    网上关于这个问题吵得很凶,但是仔细看过之后我更偏向认为两种说的是一样的. 首先我们来看看 TCP 协议的三次握手过程 如上图所示: 解释一下里面的英文: 里面起到作用的一些标志位就是TCP报文首部里的 ...

  4. HTTP协议报文结构及示例

    HTTP基本架构 下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解. 9.png Web Client可以是浏览器.搜索引擎.机器人等等一切基于HTTP协议发起http请 ...

  5. 计算机网络之TCP协议与UDP协议

    运输层向它上面应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层. 两个主机进行通信实际上就是两个主机中的应用进程互相通信.应用进程之间的通信又称为端到端的通信. 应用层不同进 ...

  6. HTTP协议图--HTTP 协议报文结构

    1.HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文.请求端(客户端)的 HTTP 报文叫做请求报文:响应端(服务器端)的叫做响应报文.HTTP 报文本身是由多行(用 CR[car ...

  7. 接口测试01 - HTTP协议报文结构及示例

    HTTP基本架构 用一张简单的流程图来展示HTTP协议的基本架构,以便先有个基础的了解. 1)Web Client可以是浏览器.搜索引擎等等一切基于HTTP协议发起http请求的工具. 2)Web S ...

  8. 协议系列之TCP协议

    3.TCP协议 从上一节我们了解了什么是IP协议,以及IP协议的一些特性,利用IP协议传输都是单向的,不可靠的,无连接状态的.正是这些特性,于是便产生了TCP协议.TCP协议属于传输层,在IP协议网络 ...

  9. 面试准备——计算机网络(TCP的三次握手和四次挥手)

    一.TCP的报文结构 红色圈标出的是在讨论三次握手和四次挥手时会用到的首部字段: 顺序号(seq):TCP对从网络层传下来的数据报文进行分组,分成一段一段的TCP报文段,并对这些报文段进行编号.seq ...

随机推荐

  1. vue中的路由独享守卫的理解

    1.vue中路由独享守卫意思就是对这个路由有一个单独的守卫,因为他的守卫方式于其他的凡是不太同 独享守卫于前置守卫使用方法大致是一样的 在路由配置的时候进行配置, { path:'/login', c ...

  2. CodeForces 916C Jamie and Interesting Graph (构造)

    题意:给定两个数,表示一个图的点数和边数,让你构造出一个图满足 1-  n 的最短路是素数,并且最小生成树也是素数. 析:首先 1 - n 的最短路,非常好解决,直接 1 连 n 就好了,但是素数尽量 ...

  3. MySQL5.7的安装配置

    双击进入安装,如下图: 2 点击上图红框“Install MySQL Products”进入安装界面,如下图: 3 根据上图当中第一步骤与第二步骤,进入下图: 4 进入设置界面,如下图: 5 在原来旧 ...

  4. hive 桶表

    转自:https://blog.csdn.net/csdnliuxin123524/article/details/81052974 桶表(bucket table): 原理: 分区表是按照经常查询的 ...

  5. 第二天:Javascript事件

    事件:是可以被Javascript侦测到的行为,例如鼠标的点击,鼠标的移动,常见的事件如下   代码实现“点击事件”: <body> <button onclick="de ...

  6. 微擎开启redis memcache

    微擎开启redis memcache 2018年01月20日 14:39:54 luogan129 阅读数:2161更多 个人分类: 微信开发   版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  7. (原创)c++中的类型擦除

    c++11 boost技术交流群:296561497,欢迎大家来交流技术. 关于类型擦除,可能很多人都不清楚,不知道类型擦除是干啥的,为什么需要类型擦除.有必要做个说明,类型擦除就是将原有类型消除或者 ...

  8. 免 Google Play 的安卓应用下载平台

    本文已过时,以后会在我的新博客内更新 https://blog.clso.fun/posts/2019-03-22/non-google-play-apk-download.html 鉴于那啥你懂的原 ...

  9. 迁移桌面程序到MS Store(6)——.NET Portability Analyzer

    上一篇我们简单介绍了.NET Standard,本篇我们来实践.NET Framework 4.5 Class Library到.NET Standard 2.0的转换.        首先让我们来做 ...

  10. Android---------------解决bug的关键点

    一.抛出异常,打出异常的的堆信息 System.err.print("ceshi");      e.printStackTrace();     Log.i("cesh ...