前言:上学期实训课,由于要做一个网络通信的应用,期间遇到各种问题,让我深感计算机网络知识的薄弱。于是上网查找大量的资料,期间偶然发现了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定义组件 const Index = { template:` <div>首页</div> ` } const Order = { template:` <div> ...

  2. java中的标识符、关键字、保留字

    Java中关键字(keyword)和保留字(reservedword) Keyword :Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等. Reserv ...

  3. AngularJS中$interval和$timeout的使用

    我们在项目中会出现定时刷新,延迟加载等多种场景. 接下来就看$interval和$timeout的使用 $interval可用于定时任务,我们只需在controller注入$interval即可使用. ...

  4. 【慕课网实战】Spark Streaming实时流处理项目实战笔记五之铭文升级版

    铭文一级: 单节点单broker的部署及使用 $KAFKA_HOME/config/server.propertiesbroker.id=0listenershost.namelog.dirszook ...

  5. redis.conf之save配置项解读

    配置示例: save 900 1 save 300 10 save 60 3600 配置解读: 1) “save 900 1”表示如果900秒内至少1个key发生变化(新增.修改和删除),则重写rdb ...

  6. 1057 Stack 树状数组

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  7. What's New In Python 3.X

    As Python updating to python 3.6, its performance is better than Python 2.x, which is good news to e ...

  8. 20145232 《Java程序设计》课程总结

    学期总结 实验报告链接汇总 实验一 Java开发环境的熟悉 实验二 Java面向对象程序设计 实验三 敏捷开发与XP实践 实验四 Andoid开发基础 实验五 Java网络编程 代码托管链接 :Jav ...

  9. 第84讲:Scala中List和ListBuffer设计实现思考

    今天来学习了scala中的list和ListBuffer scala list 内部很多操作是listbuffer做的,因为改变元素,listbuffer非常高效,tl是var类型的  ,但是他属于s ...

  10. hihocode 1336 Matrix Sum 【二维树状数组】

    题目 两个操作: 1. Add x y value: Add value to the element Axy. (Subscripts starts from 0 2. Sum x1 y1 x2 y ...