各种数据包头

typedef struct _ARPHeader		// 28字节的ARP头 { 	USHORT	hrd;				//	硬件地址空间,以太网中为ARPHRD_ETHER 	USHORT	eth_type;			//  以太网类型,ETHERTYPE_IP ?? 	UCHAR	maclen;				//	MAC地址的长度,为6 	UCHAR	iplen;				//	IP地址的长度,为4 	USHORT	opcode;				//	操作代码,ARPOP_REQUEST为请求,ARPOP_REPLY为响应 	UCHAR	smac[6];			//	源MAC地址 	UCHAR	saddr[4];			//	源IP地址 	UCHAR	dmac[6];			//	目的MAC地址 	UCHAR	daddr[4];			//	目的IP地址 } ARPHeader, *PARPHeader;   typedef struct _IPHeader		// 20字节的IP头 {     UCHAR     iphVerLen;      // 版本号和头长度(各占4位)     UCHAR     ipTOS;          // 服务类型      USHORT    ipLength;       // 封包总长度,即整个IP报的长度     USHORT    ipID;			  // 封包标识,惟一标识发送的每一个数据报     USHORT    ipFlags;	      // 标志     UCHAR     ipTTL;	      // 生存时间,就是TTL     UCHAR     ipProtocol;     // 协议,可能是TCP、UDP、ICMP等     USHORT    ipChecksum;     // 校验和     ULONG     ipSource;       // 源IP地址     ULONG     ipDestination;  // 目标IP地址 } IPHeader, *PIPHeader;   typedef struct _TCPHeader		// 20字节的TCP头 { 	USHORT	sourcePort;			// 16位源端口号 	USHORT	destinationPort;	// 16位目的端口号 	ULONG	sequenceNumber;		// 32位序列号 	ULONG	acknowledgeNumber;	// 32位确认号 	UCHAR	dataoffset;			// 高4位表示数据偏移 	UCHAR	flags;				// 6位标志位 								//FIN - 0x01 								//SYN - 0x02 								//RST - 0x04  								//PUSH- 0x08 								//ACK- 0x10 								//URG- 0x20 								//ACE- 0x40 								//CWR- 0x80  	USHORT	windows;			// 16位窗口大小 	USHORT	checksum;			// 16位校验和 	USHORT	urgentPointer;		// 16位紧急数据偏移量  } TCPHeader, *PTCPHeader;   typedef struct _UDPHeader { 	USHORT			sourcePort;		// 源端口号		 	USHORT			destinationPort;// 目的端口号		 	USHORT			len;			// 封包长度 	USHORT			checksum;		// 校验和 } UDPHeader, *PUDPHeader;
### TCP 数据包头结构与字段详解 TCP(Transmission Control Protocol)是一种面向连接的可靠传输协议,其头部包含了多个字段用于控制通信过程中的各种功能。以下是关于 TCP 数据包头的主要字段及其含义: #### 1. **源端口号 (Source Port)** - 占用 2 个字节。 - 表示发送方的应用程序端口,以便接收方能够将数据返回到正确的应用程序[^1]。 #### 2. **目的端口号 (Destination Port)** - 同样占用 2 个字节。 - 指定目标主机上运行的服务或应用对应的端口号,确保数据被传递给正确的进程。 #### 3. **序列号 (Sequence Number)** - 使用 4 个字节表示。 - 序列号用来标记当前数据流的第一个字节的位置,从而实现按序组装接收到的数据片段。 #### 4. **确认号 (Acknowledgment Number)** - 占用 4 个字节。 - 当 ACK 标志位设置为 1 时有效,表明期望接收的下一个字节编号,即已成功接收之前的所有数据。 #### 5. **数据偏移量 / 头部长度 (Data Offset or Header Length)** - 只有 4 位。 - 定义了 TCP 报文头的实际大小(以 32-bit 字为单位)。最小值通常为 5(对应于标准 20 字节头部),最大可扩展至 15(最多允许 60 字节头部)。 #### 6. **保留字段 (Reserved Field)** - 长度固定为 6 位,默认全置零。 - 未来可能用于新特性支持,目前无实际作用。 #### 7. **标志位 (Flags)** - 总共占用了 6 位,具体如下: - URG:紧急指针是否生效。 - ACK:确认号字段是否有意义。 - PSH:提示接收方尽快交付数据给上层应用。 - RST:重置连接请求。 - SYN:同步序列号,建立连接时使用。 - FIN:结束会话指示。 #### 8. **窗口大小 (Window Size)** - 耗费 2 个字节空间。 - 告知对方自己可以接受多少字节数目作为流量控制机制的一部分。 #### 9. **校验和 (Checksum)** - 包含两个字节的信息。 - 对整个 TCP 报文段执行计算得出的结果,覆盖范围不仅限于头部还包括负载部分;此操作旨在保障数据完整性并由两端设备共同完成验证工作。 #### 10. **紧急指针 (Urgent Pointer)** - 如果设置了URG,则该值指出本报文中未处理完毕的重要信息位置相对于序列号起点的距离。 #### 11. **选项 (Options)** 和填充(Padding) - 这些额外参数并非总是存在,仅当需要特殊配置如时间戳等功能才会启用它们,并通过适当数量的零比特来保持整体边界对齐。 下面展示了一个简单的 Python 函数用于解析基本的 TCP 包头信息: ```python import struct def parse_tcp_header(data): tcp_header = data[:20] tcph = struct.unpack('!HHLLBBHHH', tcp_header) source_port = tcph[0] dest_port = tcph[1] sequence_number = tcph[2] acknowledgment_number = tcph[3] offset_reserved_flags = tcph[4] window_size = tcph[5] checksum = tcph[6] urgent_pointer = tcph[7] header_length = (offset_reserved_flags >> 4) * 4 return { 'source_port': source_port, 'dest_port': dest_port, 'sequence_number': sequence_number, 'acknowledgment_number': acknowledgment_number, 'header_length': header_length, 'window_size': window_size, 'checksum': checksum, 'urgent_pointer': urgent_pointer } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值