承接上一博文而来,继续解析网络数据包,对于承载在以太网上的三种协议进行了解析,主要是分为根据RFC定义的标准先解析头部数据,然后得到有效载荷,即为协议包含的实体数据,更上层进行进一步处理。
一、ARP协议
该协议作为局域网IP地址和MAC地址映射的重要协议,与DNS将域名与IP地址进行映射有异曲同工之妙。当以太网的类型字段为 0x0806时即为ARP协议数据包。定义如下图:
硬件类型即为以太网的代码。ARP支持的协议类型为IP(0x0800),硬件地址长度即MAC地址长度为6,协议地址长度为IP地址长度为4,OP字段为当前数据报的类型,0x0001表示请求包,0x0002表示应答包。这些就构成了ARP数据报头,一共8个Byte。
随后的20个Byte分别如上图所示,用来进行MAC地址和IP地址映射。
解析如下:
/// <summary>
/// Define the ARP packet header by RFC826
/// </summary>
public class ARPPacketHeader : INetworkLayerHeader
{
public ushort HardwareType = 0; //2 Bytes 硬件类型
public ushort ProtocalType = 0; //2 Bytes 协议类型
public byte HardwareAddressLength = 6; //1 Byte 硬件地址长度(即MAC地址长度为6)
public byte ProtocolAddressLength = 4; //1 Byte 协议地址长度(即IP地址长度为4)
public ushort OP = 0; //2 Byte ARP包类型(0x0001:请求包 0x0002:应答包)
}
/// <summary>
/// Parse the ARP packet
/// </summary>
public class ARPPacket : INetworkLayerPacket
{
private byte[] Raw