分析UDP数据包结构

一个典型的udp数据报包含如下几个部分:以太网MAC首部+网络层IP数据报首部+传输层UDP首部+要传输的数据

1.以太网MAC头

以太网MAC头由14个字节构成,6个目的地址,6个源地址,2个类型字段,目的地址和源地址是指网卡的MAC地址,具有唯一性。协议是指数据包的高级协议,0X8000:IP协议,0X0806:ARP协议,0X8035:RARP协议

如你要发送的目的MAC地址是:00:1d:09:10:d1:9c 源MAC地址是:01:60:6e:11:02:0f,上层是IP层,标识符是0x0800,那么MAC头就是:00 1d 09 10 d1 9c 01 60 6e 11 02 0f 80 00

一般的以太网帧会有8字节的前导(用于帧同步),4字节的CRC(用于帧校验),这些由网卡芯片自动填充

2.IP数据头

ip数据报头如下:

0x45, 0x00, IPlenght_h, IPlenght_l,0x00, 0x00, 0x00, 0x00, 0x80, 0x11,IPchecksum4, IPchecksum5,IPsource_1, IPsource_2, IPsource_3, IPsource_4,IPdestination_1, IPdestination_2, IPdestination_3, IPdestination_4

  上面是一个简单的ip头的例子,下面一个个的来解释啊!

  0x45,其中的高位0x4,表示的是版本号,ipv4的意思,而后面低字节5表示的是指明IPv4协议包头长度的字节数包含多少个32位,这里是5,也就是说协议头是5*4=20个字节的大小。

  0x00,定义IP封包在传送过程中要求的服务类型,如果所有4bit均为0,那么就意味着是一般服务,具体如下:

    ◆000..... (Routine): 过程字段,占3位。设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)

    ◆...0....(Delay):延迟字段 ,占1位,取值:0(正常)1(期待低的延迟) 

    ◆....0...(Throughput):流量字段,占1位,取值:0(正常)1(期特高的流量) 

    ◆.....0..(Reliability) :可靠性字段,占1位,取值:0(正常)1(期特高的可靠性)

    ◆…..0.(ECN-Capable Transport):显式拥塞指示传输字段,占1位,由源端设置,以显示源端节点的传输协议是支持ECN(Explicit Cogestion Notifica tion,显式拥塞指示)的取值:0(不支持ECN)1(支持ECN)

    ◆.......0(Congestion Experienced):拥塞预警字段,占1位取值:0(正常,不拥塞)1(拥塞)

  IPlenght_h, IPlenght_l,表示的是包总长度=IP头长度+UDP头长度+数据长度,长度分为高8位和低8位。

  0x00, 0x00,是上面的标志位,16个字节。每一个IP封包都有一个16位的唯一识别码,当程序产生的数据要通过网络传送时都会被拆散成封包形式发送,当封包要进行重组的时候这个ID就是依据了。

  0x00, 0x00这16位是由两部分组成,包括3bit的标记位和13bit的分段偏移量。

    这是当封包在传输过程中进行最佳组合时使用的3个bit的识别记号,占3位,

    ◆000(Reserved Fragment):保留分段,当此值为0的时候表示目前未被使用

    ◆.0.(Don't Fragment):不分段,当此值为0的时候表示封包可以被分段,如果为1则不能被分割

    ◆..0( More Fragment):更多分段,当上一个值为0时,此值为0就示该封包是最后一个封包,如果为1则表示其后还有被分割的封包

    IP协议头格式规定当封包被分段之后,由于网路情况或其它因素影响其抵达顺序不会和当初切割顺序一至,所以当封包进行分段的时候会为各片段做好定位记录,以便在重组的时候就能够

    对号入座,值为多少个字节,如果封包并没有被分段,则FO值为0,占13位 

  0x80表示生存时间。生存时间字段设置了数据报可以经过的最多路由器数,表示数据包在网络上生存多久,TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1,当该字段的值为0时,数据报就被丢弃,并发送ICMP消息通知源主机,这样当封包在传递过程中由於某些原因而未能抵达目的地的时候就可以避免其一直充斥在网路上面,占8位

  0x11表示的是传输层的协议。如下表所示:

分析UDP数据包结构_第1张图片

  IPchecksum4, IPchecksum5这两个是头校验和的高8位和低8位。

  指IPv4数据报包头的校验和,这个数值用来检错用的,用以确保封包被正确无误的接收到,当封包开始进行传送后,接收端主机会利用这个检验值会来检验余下的封包,如果一切无误就会发出确认信息表示接收正常,与UDP和TCP协议包头中的校验和作用是一样的,占16位,

  首部检验和字段是根据IP首部计算的检验和码,不对首部后面的数据进行计算,ICMP,IGMP,UDP和TCP协议在它们各自的首部中均含有同时覆盖首部和数据检验和码

  IP协议头格式规定了:计算一份数据报的IP检验和,首先把检验和字段置为0,然后,对首部中每个16位进行二进制反码求和(整个首部看成是由一串16位的字组成),结果存在检验和字段中,当接收端收到一份IP数据报后,同样对首部中每个16 位进行二进制反码的求和,由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1,如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报,但是不生成差错消息,由上层去发现丢失的数据报并进行重传

  ICMP,IGMP,UDP和TCP都采用相同的检验和算法,尽管TCP和UDP除了本身的首部和数据外,在IP首部中还包含不同的字段,由于路由器经常只修改TTL字段(减1),因此当路由器转发一份消息时可以增加它的检验和,而不需要对IP整个首部进行重新计算

   IPsource_1, IPsource_2, IPsource_3, IPsource_4,IPdestination_1, IPdestination_2, IPdestination_3, IPdestination_4这两个就表示了源IP和目标IP。

2.UDP数据头

UDP数据头如下:0x04, 0x00,0x04, 0x00, lenght_h, lenght_l, 0x00, 0x00  

  0x04, 0x00表示的是UDP的源端口,这里为1024;

  0x04, 0x00表示的是UDP的目标端口,这里为1024;

  lenght_h, lenght_l,为整个数据包的长度,包括MAC头+ip头+UDP头+校验位。

  0x00, 0x00这些是UDP协议的选项和填充位。

  这两个选项较少使用,只有某些特殊的封包需要特定的控制才会利用到�1�7这些选项通常包括:

  ◆安全和处理限制:用于军事领域

  ◆记录路径:让每个路由器都记下它的IP地址

  ◆时间戳:让每个路由器都记下它的IP地址和时间

  ◆宽松的源站选路:为数据报指定一系列必须经过的IP地址

  ◆严格的源站选路:与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址

  以上这些选项很少被使用,而且并非所有的主机和路由器都支持这些选项


你可能感兴趣的:(分析UDP数据包结构)