TCP报文头详解

TCP报文是TCP层传输的数据单元,也叫报文段
在这里插入图片描述

1、端口号
用来标识同一台计算机的不同的应用进程。

16位源端口(Source Port):16位的源端口字段包含初始化通信的端口号。源端口和IP地址的作用是标识报文的返回地址。

16位目的端口(Destination Port):16位的目的端口字段定义传输的目的地。这个端口指明接收方计算机上的应用程序接口。

TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

2、序列号和确认号
这两个字段是TCP可靠传输服务的关键部分,序列号是该报文段首字节的字节流编号(TCP把数据看成是有序的字节流,TCP隐式地对数据流的每个字节进行编号)。这样理解可能更直观,当报文被分解成多个报文段时,序列号就是报文段首字节在整个报文的偏移量。确定号指定下一个期待的字节。

32位序列号(Sequence Number):一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。每发送一次数据,就累加一次该数据字节的大小。序列号不会从零开始,而是在建立连接时通过计算机随机生成一个数,由SYN包传给接收端主机。
假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值)。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025.另外一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义。

32位确认应答号(Acknowledge Number):标识期望收到的下一个段的第一个字节,并声明此前的所有数据已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节序列号加1。收到确认号的源计算机会知道特定的段已经被收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。

3、数据偏移/首部长度

4位头部长度(header length):由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*4 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。

4、保留

保留(6位):为将来定义新的用途保留,现在一般置0。

5、控制位:URG、 ACK、PSH 、 RST 、 SYN、 FIN

1)URG:紧急指针标志,为1时表示紧急指针有效,该报文应该优先传送,为0则忽略紧急指针。

2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。我们称携带ACK标识的TCP报文段为确认报文段。

3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应优先将这个报文段交给应用程序,而不是在缓冲区排队。

4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。我们称携带RST标志的TCP报文段为复位报文段。

5)SYN:表示请求建立一个连接。在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。我们称携带SYN标志的TCP报文段为同步报文段。

6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。我们称携带FIN标志的TCP报文段为结束报文段。

6、窗口

16位窗口大小(window size):是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口(Receiver Window,RWND)。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度,从而达到流量控制。窗口大小为一个16bit字段,因而窗口大小最大为65535。

7、校验和

16位校验和(TCP check sum):由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。

8、紧急指针

16位紧急指针(urgent pointer):只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

9、选项和填充

TCP头部选项:TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。
最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。
选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

10、数据部分

TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

参考:https://blog.csdn.net/Sharp_UP/article/details/72783243
https://blog.csdn.net/baidu_17611285/article/details/80171239
https://blog.csdn.net/paincupid/article/details/79726795

### TCP 报文头结构与字段详解 TCP(Transmission Control Protocol)是一种面向连接的、可靠的字节流服务传输层协议。其报文头包含了多个字段,用于实现可靠的数据传输以及流量控制等功能。 #### 1. 源端口 (Source Port) 源端口号是一个16位的字段,用来标识发送方的应用程序端口[^1]。通过该字段可以区分同一台主机上的不同应用程序。 #### 2. 目的端口 (Destination Port) 目的端口号也是一个16位的字段,用来指定接收方的应用程序端口[^2]。它帮助操作系统将接收到的数据传递给正确的进程。 #### 3. 序列号 (Sequence Number) 序列号是一个32位的字段,在建立连接后,每一段数据都有一个唯一的序列号[^3]。这使得接收方可按顺序重新组装数据片段并检测丢失或重复的数据包。 #### 4. 确认号 (Acknowledgment Number) 确认号同样是32位长度,当ACK标志位设置为1时有效。此字段指明下一个期望收到的数据段的第一个字节编号,从而向发送方反馈已成功接收的信息范围。 #### 5. 数据偏移/首部长度 (Data Offset or Header Length) 这是一个4位字段,定义了TCP头部的实际大小,单位是以4字节为增量计算得出的结果。由于选项的存在可能导致头部变长,因此需要明确指示具体位置以便正确解析后续内容。 #### 6. 标志位 Flags 共有六个标志位组成的一组控制信号: - **URG**: 表示紧急指针是否生效; - **ACK**: 如果置1,则表明当前消息含有有效的确认应答信息; - **PSH**: 建议立即把缓冲区中的数据推送给上一层应用处理而不等待缓存填满; - **RST**: 请求重置连接状态机回到初始态; - **SYN**: 同步序列号码以发起新的握手请求; - **FIN**: 发送者已经完成发送操作准备关闭会话链接。 #### 7. 窗口尺寸 Window Size 窗口尺寸占用16比特空间来告知对方自己还能接受多少额外的数据量而无需进一步确认回应。这是实现滑动窗口机制的关键参数之一,有助于动态调整双方之间的通信速率匹配程度。 #### 8. 校验和 Checksum 作为可靠性措施的一部分,16位校验和由发信侧填充完毕之后传送到另一端设备处再利用循环冗余码(CRC)技术验证整个tcp segment(含header plus payload part altogether)[^2]. 若发现错误则丢弃相应packet 并触发超时重传策略. #### 9. 紧急指针 Urgent Pointer 仅当 URG flag 被激活的情况下有意义, 它指出本报文中紧随其后的若干字节数目属于高优先级资料需尽快交付高层使用者而非遵循常规排队逻辑.[^1] #### 10. 可选字段 Options Field 最后预留了一定数量的空间供特殊用途扩展功能使用比如最大分片限制(Maximum Segment Size), 时间戳(Time Stamp Option)等等; 不过这些都依赖于协商好的规则才会实际出现.[^4] ```python class TCPSegment: def __init__(self, source_port, destination_port, sequence_number, acknowledgment_number, flags, window_size, checksum, urgent_pointer, options=None): self.source_port = source_port self.destination_port = destination_port self.sequence_number = sequence_number self.acknowledgment_number = acknowledgment_number self.flags = flags self.window_size = window_size self.checksum = checksum self.urgent_pointer = urgent_pointer self.options = options if options else [] def calculate_checksum(self): pass def validate_segment(self): pass ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值