TCP报文段的首部格式

本文详细解析了TCP与ICMP两种关键网络协议。对于TCP,介绍了其报文段首部结构,包括源端口、目的端口、序号、确认序号等字段的作用及意义,并说明了TCP首部长度的构成。对于ICMP,阐述了其基本结构,包括类型、代码、校验和等字段,以及ICMP数据部分的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源端口

目的端口

                                                             序号

                                                            确认号

数据偏移

保留

URG

ACK

PSH

RST

SYN

FIN

窗口

校验和

紧急指针

选项(长度可变)

填充

 

 

 

TCP报文段首部的前20个字节是固定,后面有4n字节是根据需要而增加的选项,因此TCP首部最小长度20字节。

1.源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号。(端口为16位即两个字节)

2.序号:占4字节序,序号范围[0,2的32次幂-1]个序号,序号增加到2的32次幂-1后,下个序号又回到0。序号使用mod 2的32次幂运算。Tcp是面向字节流的。

在tcp中传送的字节流中的每个字节都安字节编号。整个要传送的数据的第一个字节的序号必须在建立连接时设置。首部中的序号字段值则指的是本报文所发送

的字节的序号。

3确认序号:占4字节,期望受到对方下个报文段的第一个数据字节的序号

4数据偏移:占4位,指出tcp报文段的数据起始处距离tcp报文段的起始处有多远。

 

 

 

 

/******************************ICMP******************************/

0~8bit类型                 8~16bit代码                                   16~31bit检验和
这4个字节取决于ICMP报文类型
ICMP的数据部分(长度取决于类型)

加上ip首部变成了ip数据包发送出去

 

 

### TCP 报文段首部格式 TCP 报文段首部对于确保数据可靠传输至关重要。其基本结构如下表所示: | 字段名称 | 长度(字节) | 描述 | |------------------|-------------------|------------------------------------------------------------| | 源端口 | 2 | 发送方的应用程序端口号 | | 目标端口 | 2 | 接收方的应用程序端口号 | | 序列号 | 4 | 当前报文段所携带的数据的第一个字节在整个会话中的位置 | | 确认号 | 4 | 如果ACK标志位被设置,则表示期望收到下一个报文段的位置 | | 数据偏移量/保留/控制位 | 1 | 前四位用于指示头部长度;中间六位目前未使用,设为全零;后六个比特代表不同的控制标记 | | 窗口大小 | 2 | 表明接收方还有多少可用空间来接受更多来自发送者的流量 | | 校验和 | 2 | 对整个TCP报文段以及伪头部进行计算得到的一个值,仅针对首部查错[^1] | | 紧急指针 | 2 | 若URG置位则有效,指出本报文段中有紧急数据 | #### 控制位说明 - **URG**: 表示是否有紧急数据需要优先处理。 - **ACK**: 确认序号是否有效。 - **PSH**: 提醒对方尽快交付给应用层。 - **RST**: 复位连接请求。 - **SYN**: 请求建立同步连接。 - **FIN**: 结束通信。 此外,在某些情况下还会存在可变长的选项字段,这些通常位于固定部分之后,并且由特定类型的标识符指定功能[^5]。 ```python import struct def create_tcp_header(source_port, dest_port, seq_num, ack_num, flags, window_size, checksum=0, urgent_pointer=0): """ 创建一个简单的TCP头部 参数: source_port : int - 来源端口 dest_port : int - 目的地端口 seq_num : int - 序列编号 ack_num : int - 承认编号 flags : dict - 包含各flag状态 {'URG': bool, 'ACK': bool, ...} window_size : int - 窗口尺寸 checksum : int - 计算后的校验码,默认为0意味着稍后再填充 urgent_pointer: int - 紧急指针,默认为0 返回: bytes - 构建好的TCP头部二进制字符串 """ # 设置默认头部长度(无option),即20bytes -> 5*4bit offset_reserved = (5 << 4) + 0 control_bits = ( (flags.get('CWR', False) << 7) + (flags.get('ECE', False) << 6) + (flags.get('URG', False) << 5) + (flags.get('ACK', False) << 4) + (flags.get('PSH', False) << 3) + (flags.get('RST', False) << 2) + (flags.get('SYN', False) << 1) + (flags.get('FIN', False)) ) tcp_header = struct.pack( '!HHLLBBHHH', source_port, dest_port, seq_num, ack_num, offset_reserved, control_bits, window_size, checksum, urgent_pointer ) return tcp_header ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值