本博客主要总结一下TCP/IP协议中各层协议的数据包的结构。
(1)数据链路层。
数据链路层整体结构:
数据 |
长度 |
数据链路层头部 |
14字节 |
数据链路层数据 |
实际数据长度 |
数据链路层尾部 |
4字节 |
数据链路层头部的结构:
数据 |
长度 |
目的MAC |
6字节 |
源MAC |
6字节 |
协议类型(IP:0x0800,ARP:0x0806) |
2字节 |
数据链路层尾部的结构:
数据 |
长度 |
数据校验和 |
4字节 |
(2) IP层。
(a) IP层数据包整体结构。
数据 |
长度 |
IP头部 |
20字节(无选项) |
IP层数据 |
不定长度 |
(b) IP层数据包头部的结构。
其中各个字段说明如下:
数据 |
说明 |
版本 |
IPV4: 0x4,即二进制0100。通常版本和头部长度组成字节为0x45。 |
头部长度 |
IHL(Internet Header Length)。单位为4字节。4位二进制最大值为15。因此最大可以表示4x15=60字节。最小为20字节(值为0x5),最大60字节(值为0xf)。 |
TOS |
TOS(Type Of Service,服务类型)。各位的含义稍后专门介绍 |
总长度 |
整个数据包的总长度,包括IP头部和数据。 |
标识 |
每发送一个数据包,标识增加1. |
标识 |
是否分片等。 BIT0:0,未用。 BIT1:DF,为1表示不要分片。 BIT2:MF,为1表示还有更多片。 |
片偏移 |
本片的数据与第1片数据开始位置的距离 |
TTL |
TTL(Time to live)允许经过的路由器的最大数量,一般32,64,128。当TTL为0时数据包被丢弃。 |
协议 |
IP数据包的数据载荷的封装协议。含义稍后专门介绍。 |
头部校验和 |
设置时每16位进行反码求和,验证时结果为0则通过。 |
源IP地址 |
发送数据包的IP地址 |
目的IP地址 |
接收数据包的IP地址 |
选项 |
可选。头部长度为20时不包含任何选项。 |
TOS中各位的含义如下表所示,其中4-7位最多只能允许其中一位为1,一般全部为0.
位 |
说明 |
0-3 |
优先权,一般被忽略。 |
4 |
1表示最小延迟 |
5 |
1表示最大吞吐量 |
6 |
1表示最高可靠性 |
7 |
1表示最小费用 |
IP数据包支持的协议:
协议 |
说明 |
1 |
ICMP |
2 |
IGMP |
6 |
TCP |
17 |
UDP |
(3)UDP层。
(a)UDP层数据包整体结构。
数据 |
长度 |
UDP头部 |
20字节(无选项) |
UDP层数据 |
不定长度 |
(c) UDP层数据包头部的结构。
其中UDP头部中的长度字段表示UDP数据包的总字节数(UDP头部长度+UDP有效数据的长度),最多65535个字节。
(4)TCP层。
(a)TCP层数据包整体结构。
数据 |
长度 |
TCP头部 |
8字节(无选项) |
TCP层数据 |
不定长度 |
TCP层数据包头部的结构。
其中各字段的含义如下表所示:
数据 |
说明 |
源端口号 |
发送者端口号 |
目的端口号 |
接收者端口号 |
顺序号 |
本数据包中实际数据的第1个字节在所有实际数据中的位置。第1个数据包为0,后面一个数据包的顺序号为前数据包的顺序号+前一个数据包的实际数据的长度。 |
确认号 |
希望收到的下一个数据包的顺序号。如果已收到的数据包的顺序号为X,实际数据长度为L,则发送的确认号可以为X+L。本字段当标志位ACK=1时有效。 |
头部长度 |
TCP头部的长度。单位为4字节。4位二进制最大值为15。因此最大可以表示4x15=60字节。最小20字节。 |
保留 |
|
标志位 |
标志位共6位,U、A、P、R、S、F。具体含义稍后解释。 |
窗口大小 |
接收方能够一次接收的字节数。 |
校验和 |
TCP头部和实际数据的校验和 |
紧急指针 |
BSD模式下表示该位置的前一个字节是紧急数据(OOB) |
TCP标志位的含义:
位 |
说明 |
URG |
紧急指针是否有效 |
ACK |
确认序号是否有效 |
PSH |
接收方应当尽快将这个数据包交给应用层 |
RST |
重置TCP连接 |
SYN |
发起一个TCP连接 |
FIN |
释放一个TCP连接 |