TCP报文格式

2024-06-12 10:24

TCP报文格式

image.png

1、16位源端口与16位目的端口

这两个字段与UDP中的源端口与目的端口作用相同,为了实现分用功能,用端口来区分应该将数据交付给上层的哪个用户进程;它们各占2个字节,也就是16个比特位;

2、4位首部长度

​ 对于传输层的数据段,我们同样也要考虑两个问题,如何将应用层托付的数据进行封装,托付给下一层(网络层);如何将当前带报头的数据进行解包,交付给上层(应用层);

补充:对于不同层的数据包,在传输层时,称其为数据段,在网络层时,称其为数据报,在数据链路层时,称其为数据帧;

备注:关于数据段的封装与解包,我们通过报文中的4位首部长度来进行的,这个4位首部长度,记录的是TCP报文中首部的长度,也就是最开始那张图中前六行的内容,就是除去数据的部分,其中前5行位固定首部,第六行为选项,可有可无,最多为40字节;

该字段的取值范围是0101~1111,如上图所示,这里的数字是二进制,由于只有四个比特位,因此最高值是1111,也就是15; 这时可能就有小伙伴疑惑了,可是根据上面的图固定首部就有20字节了,而这四个比特位最多只能到15,实际上,这个首部长度是有单位,单位为4字节,也就是415=60字节,这就对的上了,其中最小的值为0101,也就是5,54=20字节,也就是我们固定首部的大小;

3、32位序号与32位确认序号

关于32位序号与32位确认序号涉及TCP的可靠性,TCP为了保证可靠性采用了确认应答的机制;这也是保证TCP可靠性之一的机制;具体如下图;

(1)确认应答机制

image.png

(2)序号引入

​ 使用TCP的双方都要有两个缓冲区,一个为发送缓冲区,一个为接收缓冲区;对这两个缓冲区的每个字节进行编号,这个编号的范围也就是一个整型的范围,0~2^32-1(4294967296),当我们调用系统接口read/write/recv/send时,实际上是将数据在用户自定义缓冲区与TCP缓冲区之间的来回拷贝,而我们所谓的发送也就是将一端发送缓冲区的数据拷贝到另一端的接收缓冲区中;而上述当发送一个TCP报文到网络时,就需要给该TCP报文一个序号,该序号为缓冲区中发送数据块的起始位置的编号;

image.png

image.png

由于TCP是全双工通信,因此,两端都可以同时收发,因此,两端都应该有自己各自的序号;


**注意:**通常这种图都有一个隐性条件,就是时间轴!上图中的数据长度指的时发送端发送报文数据长度;

4、保留字段

该字段占6位,保留为今后使用,目前应置为0;

5、六个控制位

保留位后面接着又是六个控制;


URG:该比特位置为1表示首部中的紧急指针字段有效;


ACK:该比特位置为1表示该报文属于一个应答(回应)报文段,其中确认序号字段有效;


PSH:该比特位置为1表示催促对端赶紧取走对端接收缓冲区中的数据;


RST:该比特位置为1表示该报文属于一个复位报文段,要求对端重新建立连接;


SYN:该比特位置为1表示该报文属于一个同步报文段,请求建立连接;


FIN:该比特位置为1表示该报文属于一个结束报文段,通知对方,本端要关闭了;

6、窗口大小

​ 在基于TCP协议的网络通信过程中,是否可能出现当我发送数据到对端后,发现对端的接收缓冲区为满,此时我们无法继续存储数据,选择丢弃;这显然也是不合理的,我们的数据资源经过网络是需要消耗网络资源的,这样白白消耗网络资源却最终被丢弃这种做法显然很不合适,因此窗口大小就是解决这一事情的方案,每次我们给对方发送确认报文时,表示从该确认序号起,该端还可以接收窗口大小值的数据;

7、校验和

​ 与UDP的校验和一样,该字段用来检测数据与首部是否发生错误,若发生错误,则直接丢弃。

8、紧急指针

在某些情况下,可能需要传送一个紧急数据,而不想像普通数据一样在接收缓冲区中排队,因此,我们会将URG控制位置为1,并且将紧急数据的最后一个比特位的位置放在紧急指针字段下。

9、选项

​ 该字段一般设置一些特殊参数,该字段最多有40字节。

相关新闻
热点
视频
投票
查看结果
Tags

站点地图 在线访客: 今日访问量: 昨日访问量: 总访问量:

© 2025 个人网站 版权所有

备案号:苏ICP备2024108837号

苏公网安备32011302322151号