一、以太网MAC帧格式:
- 前导码:7个字节的0x55;
- 帧起始界定符SFD:固定0xd5;
- 目的MAC 地址:接收端物理MAC 地址,占用6 个字节。广播地址:所有48bit 全为1,即FF-FF-FF-FF-FF-FF。
- 源MAC 地址:发送端物理MAC 地址,占用6 个字节。
- 长度/类型:当这两个字节的值小于1536(十六进制为 0x0600)时,代表该以太网中数据段的长度;否则表示该以太网中的数据属于哪个上层协议,例如0x0800 代表IP 协议(网际协议)、0x0806 代表ARP 协议(地址解析协议)等。
- 数据:以太网中的数据段长度最小46 个字节,最大1500 个字节。
- 帧检验序列FCS:为了确保数据的正确传输,在数据的尾部加入了4 个字节的循环冗余校验码(CRC 校验)来检测数据是否传输错误。CRC 数据校验从以太网帧头开始即不包含前导码和帧起始界定符。
以太网相邻两帧之间的时间间隔,即帧间隙(IFG,Interpacket Gap)。最小值是96 bit time,即在媒介中发送96 位原始数据所需要的时间。
二、ARP数据包格式
ARP 协议属于TCP/IP 协议簇的一种, ARP 协议位于以太网MAC 帧格式的数据段,ARP 数据包格式如下图所示:
1、ARP层
- 硬件类型:硬件地址的类型,1 表示以太网地址。
- 协议类型:要映射的协议地址类型,ARP 协议的上层协议为IP 协议,因此该协议类型为IP 协议,其值为0x0800。
- 硬件地址长度:硬件地址(MAC 地址)的长度,以字节为单位。对于以太网上IP 地址的ARP 请求或者应答来说,该值为6。
- 协议地址长度:IP 地址的长度,以字节为单位。对于以太网上IP 地址的ARP 请求或者应答来说,该值为4。
- OP:操作码,用于表示该数据包为ARP 请求或者ARP 应答。1 表示ARP 请求,2 表示ARP应答。
- 源MAC 地址:发送端的硬件地址。
- 源IP 地址:发送端的协议(IP)地址,如192.168.1.102。
- 目的MAC 地址:接收端的硬件地址,在ARP 请求时由于不知道接收端MAC 地址,因此该字段为广播地址,即48’hff_ff_ff_ff_ff_ff。
- 目的IP 地址:接收端的协议(IP)地址,如192.168.1.10。
由于以太网数据段最少为46 个字节,而ARP 数据包总长度为28 个字节,因此在ARP 数据段后面需要填充18 个字节的数据,以满足以太网传输格式的要求。这个填充的过程称为Padding(填充),填充的数据可以为任意值,但一般为0。
三、ICMP数据包格式
1、IP层
每个字节传输规则为由比特最高位到最低位的顺序逐一进行发送,4 字节的32bit 值按照以下次序传输:首先7-0bit,其次15-8 bit,然后23-16bit,最后是31-24bit。
- 版本:4 位IP 版本号,设置为二进制的0100 时表示IPv4,设置为0110 时表示IPv6,目前使用比较多的IP 协议版本号是4。
- 首部长度:4 位首部长度,表示IP 首部一共有多少个32 位(4 个字节)。在没有可选字段时,IP 首部长度为20 个字节,因此首部长度的值为5。
- 服务类型:8 位服务类型,该字段被划分成两个子字段:3 位优先级字段(现在已经基本忽略掉了)和4 位TOS 字段,最后一位固定为0。服务类型为0 时表示一般服务。
- 总长度:16 位IP 数据报总长度,包括IP 首部和IP 数据部分,以字节为单位。我们利用IP 首部长度和IP 数据报总长度,就可以知道IP 数据报中数据内容的起始位置和长度。由于该字段长16bit,所以IP 数据报最长可达65535 字节。尽管理论上可以传输长达65535 字节的IP 数据报,但实际上还要考虑网络的最大承载能力等因素。
- 标识字段:16 位标识字段,用来标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。
- 标志字段:3 位标志字段,第1 位为保留位;第2 位表示禁止分片(1 表示不分片 0:允许分片);第3 位标识更多分片(除了数据报的最后一个分片外,其它分片都为1)。
- 片偏移:13 位片偏移,在接收方进行数据报重组时用来标识分片的顺序。
- 生存时间:8 位生存时间字段,TTL(Time To Live)域防止丢失的数据包在无休止的传播,一般被设置为64 或者128。
- 协议:8 位协议(Protocol)类型,表示此数据报所携带上层数据使用的协议类型,ICMP 为1,TCP 为6,UDP 为17。
- 首部校验和:16 位首部校验和(Header Checksum),该字段只校验数据报的首部,不包含数据部分;校验IP 数据报头部是否被破坏、篡改和丢失等。
- 源IP 地址:32 位源IP 地址(Source Address),即发送端的IP 地址,192.168.1.123。
- 目的IP 地址:32 位目的IP 地址(Destination Address),即接收端的IP 地址,如192.168.1.102。
- 可选字段:是数据报中的一个可变长度的可选信息,选项字段以32bit 为界,不足时插入值为0 的填充字节,保证IP 首部始终是32bit 的整数倍。
2、ICMP层
- 类型(type):占用了8 bit 位,是ICMP 报文类型,用于标识错误类型的差错报文或者查询类型的报告报文。常用类型有:类型0,代码0:表示回显应答(ping 应答),类型8,代码0:表示回显请求(ping 请求)。类型11,代码0:超时;类型3,代码0:网络不可达;类型3,代码1:主机不可达;类型5,代码0:重定向。
- 代码(code):占用了8 bit 位,根据ICMP 差错报文的类型,进一步分析错误的原因,代码值不同对应的错误也不同,例如:类型为11 且代码为0,表示数据传输过程中超时了,超时的具体原因是TTL 值为0,数据报被丢弃。
- 校验和(checksum):占用了16 bit 位,校验的方法同上述IP 首部校验和的方法一致。数据发送到目的地后需要对ICMP 数据报文做一个校验,用于检查数据报文是否有错误。
- 标识符(Identifier):占用了16 bit 位,对于每一个发送的数据报进行标识。
- 序列号(Sequence number):占用了16 bit 位,对于发送的每一个数据报文进行编号,比如:发送的第一个数据报序列号为1,第二个序列号为2。
- 数据(Data):要发送的ICMP 数据。
四、UDP数据包格式
UDP(User Datagram Protocol),即用户数据报协议,是一种面向无连接的传输层协议。无连接是指在传输数据时,数据的发送端和接收端不建立逻辑连接。
1、UDP层
UDP 首部共8 个字节,同IP 首部一样,也是一行以32 位(4 个字节)为单位。
- 源端口号:16 位发送端端口号,用于区分不同服务的端口,端口号的范围从0 到65535。
- 目的端口号:16 位接收端端口号。
- UDP 长度:16 位UDP 长度,包含UDP 首部长度+数据长度,单位是字节。
- UDP 校验和:16 位UDP 校验和。UDP 计算校验和的方法和计算IP 数据报首部校验和的方法相似,但不同的是IP 数据报的校验和只检验IP 数据报的首部,而UDP 校验和包含三个部分:UDP 伪首部,UDP 首部和UDP 的数据部分。伪首部的数据是从IP 数据报头和UDP 数据报头获取的,包括源IP 地址,目的IP地址,协议类型和UDP 长度,其目的是让UDP 两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。