首页 > 编程知识 正文

TCP和UDP以及IP报文格式(UDP协议报文分析和主动发送UDP简单实现)

时间:2023-05-03 09:02:00 阅读:122780 作者:2292

UDP协议消息分析和UDP主动发送的简单实现序言1、Wireshark消息分析1、UDP消息实例2、消息格式分析、以太网报头、IP报头、UDP报头2、UDP

前言

用 Wireshark 简单分析UDP报文解析,学习UDP报文的解析。在需要编写底层UDP报文的环境下(单片机等),简单编排UDP报文达到主动传输的目的。

一、Wireshark消息分析1、UDP消息实例

2、消息格式分析一帧UDP消息由四部分组成:以太网报头、IP报头、UDP报头、数据。

帧头帧数据的含义是消息(HEX )比特数以太网头目标MAC地址003360 aa 33600033600033607 b6* 8源MAC地址e 0: db 33605333336 8协议类型08 002* 8IP报头IP协议版本44IP报头长度54服务类型TOS008消息长度(开始IP消息) 00 212*8标识符编号) c2 a12*8标志位00 002* 8帧生存期TTL408数据协议118IP校验和32 502*8源IP地址c0 a8 02 0f4*8目的地IP地址C0A8004*8 8UDP报头源端口号2c ee2*8目的地端口号01 f62*8消息全长(8UDP校验和17 f32*8数据帧传输数据11 11 11 11 11n*8 ,以太网标头

以太网标头使用两种标准帧格式。 第一种是20世纪80年代初提出的DIXv2格式,即以太网ii帧格式。 以太网ii后来被IEEE802标准接受,并写入IEEE802.3x-1997的3.2.6节。 第二种是1983年提交的IEEE802.3格式。 通常使用以太网ii帧格式更简单、更方便。

其中Type为' 08 00 '表示后续消息的协议是IP协议帧,Type为' 08 06 '表示后续消息

、对于IP报头主动发送的UDP消息,可以主要修改其他数据,而不修改IP报头开头的“45 00”和“00 00 40 11”。 其中“40”指示帧的生存时间为64秒,“11”指示后续协议为UDP协议。

IP报头中数据帧的主要修改是来自IP报头的数据长度、标识符id、IP检查、对等IP和本地IP。

数据长度:IP标头的长度后续消息长度。 例如,实例的消息长度是0x0021(33 ),包括IP报头长度20、UDP报头长度8、数据长度5加上) 20 )。

标识符ID:可以理解为消息的编号。 通常从前一帧的标识符中加1。

对端IP:目标IP地址。

本机IP:本地IP地址。

、UDP报头的UDP报头的数据帧需要主要注意UDP校验和的计算方式,同时计算UDP伪报头。

二、UDP有源传输数据实现方式1、描述以下方法的测试环境在局域网内且其他设备不同时连接的环境中实现,仅采用点对点传输方式。

2、发送UDP前的约定在发送UDP消息之前,对方的设备接收UDP消息,需要知道对方的设备部分的信息、目的地MAC地址、目的地IP地址、目的地端口号。 其中,目标IP地址和目标端口号可以在约定后直接绑定,而目标MAC地址往往不能直接导出,在对方设备更换后发生变动。 此时,可以使用ARP协议获取MAC地址。

3、ARP消息ARP (地址解析协议)、地址解析协议是基于IP地址获取物理地址的TCP/IP协议。

在发送UDP消息之前,可以发送一帧ARP消息请求。 需要修改消息的部分是本地MAC地址6530:6433609f336032336006 (、本地IP(0XC0a80067 )、目标IP(0XC0a80067 ) )和消息中的06 04

发送ARP消息后,ARP会收到回复消息。 回复消息中包含目标IP地址和MAC地址以及本机的IP地址和MAC地址。 在确认ARP回复消息的目标IP是本机的IP之后,可以缓存该MAC地址,获得所需的MAC地址。 (3e : c 83360 be 33606 e 3360 f 4336006

ARP消息的示例,如图:

请求报文:

应答报文:

4、UDPIP消息可以在ARP消息中获得对方的MAC地址后,开始UDP消息的编辑发送。

)1)编写以太网头部。写入目标MAC地址(00: aa 336000336000336003360003360033607 b )、本地MAC地址) e 0: db 336053360 f

1:e5)、Type(0x08 00)。
  (2)将IP头的数据长度、IP校验和的四个字节置为0,先填充的IP头部的其他位。 写入IP版本以及长度(0x45)、区分服务领域(0x00)、ID号(0xc2 a1)、标志位Flags(0x00)、ttl(0x40)、协议号(0x11)、本机IP地址(0xc0 a8 02 0f)、目标IP地址(0xc0 a8 02 7b)。
  (3)将UDP头的数据长度、IP校验和的四个字节置为0,先填充的UDP头部的其他位。 写入本机源端口(0x2c ee)、目标端口(0x01 f6)、ID号(0x00 00)。
  (4)填充UDP需要传输的数据。 在UDP报文头之后写入需要传输的数据(0x11 11 11 11 11)。
  (5)根据传输的数据长度,填充IP头中的总长度(0x00 21)。 该长度计算方式为:IP头报文长度20 + UDP报文头长度8 + 数据长度5 = 33。
  (6)根据传输的数据长度,填充UDP头中的总长度(0x00 0d)。 该长度计算方式为:UDP报文头长度8 + 数据长度5 = 13。
  (7)根据IP头报文已填充数据,计算校验和,填充IP头中的校验位(0x32 50)。
  (7)根据IP头和UDP头报文已填充数据,计算校验和,填充UDP头中的校验位(0x17 f3)。

三、UDP报文校验 1、IP校验和计算

  对IP报文头从首部开始以16bit为单位求和,将计算结果溢出16bit的部分加在低16bit上,取反。
  忽略校验位数据,将上述实例报文的IP头从首部开始以16bit为单位拆分后,得到一组数据:0x4500,0x0021,0xC2A1,0x0000,0x4011,0xC0A8,0x020F,0xC0A8,0x027B。
  将上述拆分的16bit数据累加:   0x4500+0x0021+0xC2A1+0x0000+0x4011+0xC0A8+0x020F+0xC0A8+0x027B=0x2 CDAD;
  将上结果的高16位加在低16位数据得到:0xCDAF;
  将得到的0xCDAF作位取反得:0x3250。
简单代码段如下:

/*sendbuf[]是要发送的报文,计算前要先填充其他数据*/static u16_tipchksum(){ u16_t i,index=14; //从sendbuf[14]开始计算,即IP头开始位置。 u32_t sum=0; for(i=0;i<5;i++){ sum+=((u16_t)sendbuf[index]<<8)+sendbuf[index+1]; index+=2; } index+=2; for(i=0;i<4;i++){ sum+=((u16_t)sendbuf[index]<<8)+sendbuf[index+1]; index+=2; } sum = (sum >> 16) + (sum & 0xffff); return (~sum & 0xffff);} 2、UDP校验和计算

  对UDP报文头从首部开始以16bit为单位求和,求和时包含后续所有数据以及UDP伪首部数据;将计算结果溢出16bit的部分加在低16bit上,取反。
  (1)先计算伪首部,伪首部由四部分组成:源地址(0xc0a8,0x020f)、目的地址(0xc0a8,0x027b)、UDP数据长度(0x000d)、协议类型(0x0011)。将UDP伪首部以16位求和得到(0x0001 85F8)。
  (2)再计算UDP头部报文,由四部分组成:源端口(0x2cee)、目标端口(0x01f6)、UDP数据长度(0x000d)、数据(0x1111、0x1111、0x1100)。以16位求和得到(0x6213)。这里要注意的是数据结尾如果为单数,需要在低8位填充0x00,而不是高八位填充,即0x11填充为0x1100再求和。
  (3)将UDP的伪首部和与UDP头部和求和(0x1 85f8 + 0x6213);将计算结果的高16位加到低16位得到(0xe80c);进行取反运算,得到最终UDP校验和0x17f3。

简单代码段如下。

/*sendbuf[]是要发送的报文,计算前要先填充其他数据*/static u16_tudpchksum(u16_t datalen){ u16_t i,index=26; u32_t sum=0; sum = 0x11; //计算伪首部 for(i=0;i<7;i++){ sum+=((u16_t)sendbuf[index]<<8)+sendbuf[index+1]; index+=2; } index-=2; sum+=((u16_t)sendbuf[index]<<8)+sendbuf[index+1]; index+=4; for(i=0;i<(datalen/2);i++){ sum+=((u16_t)sendbbf[index]<<8)+sendbuf[index+1]; index+=2; } if(datalen%2){ sum+=((u16_t)sendbbf[index]<<8); } sum = (sum >> 16) + (sum & 0xffff); return (~sum & 0xffff);}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。