UDP协议报文分析和主动发送UDP简单实现

  • 前言
  • 一、Wireshark 报文解析
    • 1、UDP报文实例
    • 2、报文格式分析
      • ①、以太网头
      • ②、IP头
      • ③、UDP头
  • 二、UDP主动传输数据的实现方式
    • 1、说明
    • 2、发送UDP前的约定
    • 3、ARP报文
    • 4、UDPIP报文
  • 三、UDP报文校验
    • 1、IP校验和计算
    • 2、UDP校验和计算

前言

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

一、Wireshark 报文解析

1、UDP报文实例

  

2、报文格式分析

  一帧UDP报文由四个部分组成:以太网头、IP头、UDP头、数据。

帧头 帧数据含义 对应报文(HEX) 位数
以太网头 目标MAC地址 00:aa:00:00:00:7b 6*8
源MAC地址 e0:db:55:f8:d1:e5 6*8
协议类型 08 00 2*8
IP头 IP协议版本 4 4
IP头长度 5 4
服务类型TOS 00 8
报文总长度(IP报文开始) 00 21 2*8
标识符(序号) c2 a1 2*8
标志位 00 00 2*8
帧存活周期TTL 40 8
数据协议 11 8
IP校验和 32 50 2*8
源IP地址 c0 a8 02 0f 4*8
目标IP地址 c0 a8 02 7b 4*8
UDP头 源端口号 2c ee 2*8
目标端口号 01 f6 2*8
报文总长度(UDP报文开始) 00 0d 2*8
UDP校验和 17 f3 2*8
数据帧 传输数据 11 11 11 11 11 n*8

①、以太网头


  以太网头使用两种标准帧格式。第一种是上世纪80年代初提出的DIXv2格式,即EthernetII帧格式。EthernetII后来被IEEE802标准接纳,并写进了IEEE802.3x-1997的3.2.6节。第二种是1983年提出的IEEE802.3格式。普通情况下使用EthernetII帧格式更简单便捷。
  报文中 Type 为" 08 00 "表示后续报文的协议为IP协议帧,若 Type 为"08 06 "表示后续报文为ARP帧。
  

②、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+8+5)而来。
  标识符ID:可以理解为报文的编号,一般是由上一帧的标识符计算加一。
  对端IP:目标IP地址。
  本机IP:本机IP地址。
  

③、UDP头

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

二、UDP主动传输数据的实现方式

1、说明

  以下方法的测试环境是在局域网内,且无其他设备同时连接的环境下实现的,仅用与点对点的传输方式。

2、发送UDP前的约定

  在发送UDP报文前,想要对端设备收到UDP报文,就必须知道对端的设备部分信息:目标MAC地址、目标IP地址、目标端口号。其中目标IP地址和目标端口号可以在约定后直接进行绑定,但目标MAC地址在很多情况下无法直接得出,且在对端设备更换后会随着变动。此时,我们可以用ARP协议获取MAC地址。

3、ARP报文

  ARP(Address Resolution Protocol),地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。
  在发送UDP报文前,可以先发送一帧ARP报文请求,报文需要修改的部分为:本机MAC地址(30:3a:64:9f:32:06)、本机IP(0xc0a8 0067)、目标IP(0xc0a8 0065),其他部分可以参照图中请求报文的数据直接写死。报文中 06 04 后的两个字节是Opcode, 00 01 表示ARP请求报文,若为 00 02 表示应答报文。
  发送ARP报文后会收到ARP的回复报文,回复报文中包含目标IP地址和MAC地址,和本机的IP地址和MAC地址,可以在确认ARP回复报文的目标IP为本机IP后,再将该MAC地址缓存,取得需要的MAC地址为(3e:c8:be:6e:f4:06)。
  ARP报文举例,如图所示:
  请求报文:

  应答报文:

4、UDPIP报文

  通过ARP报文获取到对端MAC地址后,就可以开始编辑发送UDP报文了。
  (1)编写以太网头部。 写入目标MAC地址(00:aa:00:00:00:7b)、本机MAC地址(e0:db:55:f8:d1: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_t
ipchksum()
{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_t
udpchksum(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);
}

UDP协议报文分析和主动发送UDP简单实现相关推荐

  1. Linux内核网络数据包发送(二)——UDP协议层分析

    Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...

  2. 分析udp数据报_Linux内核网络udp数据包发送(二)——UDP协议层分析

    1. 前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调 ...

  3. Linux内核网络udp数据包发送(二)——UDP协议层分析

    1. 前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调 ...

  4. 以太网基础知识1(UDP协议及分析 )

    UDP协议及分析 一.UDP协议 UDP是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联 ...

  5. http,tcp,udp协议深度分析

    文章目录 前言 一.网络分层原理 1.现实世界中的复杂网络环境 2.OSI七层协议和TCP/IP协议 第一层:物理层 第二层:数据链路层 第三层:网络层 第四层:传输层 第五层:会话层 第六层:表示层 ...

  6. TCP/UDP协议对比分析

    TCP与UDP区别: TCP提供可靠的服务,不丢失,不重复.UDP没有保证. TCP头部20字节,UDP头部8字节等. TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...

  7. 计算机网络-传输层(UDP协议报文格式,伪首部,UDP校验过程)

    文章目录 1. UDP协议 UDP报文格式 UDP校验过程 1. UDP协议 UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能. UDP的主要特点: UDP是无连接的,减少开销和发 ...

  8. 【计算机网络】协议报文分析

    目录 实验内容: 实验要求: 实验内容: 1.运用抓包工具,分别获取不同互联网访问情形下的本机网卡数据包:过滤捕获和过滤显示不同条件的数据包 2.运用抓包工具,分别获取不同互联网访问情形下的本机网卡数 ...

  9. udp协议提供的是什么服务器,udp协议是什么_有什么用

    UDP简介 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System InterconnecTIon,开放式系统互联) 参考模型中一种无 ...

最新文章

  1. CentOS5.4 上将Python进行升级,已经解决yum不可用的问题(转载)
  2. 分享一例脚本发版和tomcat重启脚本
  3. python mysql股票分析_一颗韭菜的自我修养:用Python分析下股市,练练手
  4. rank() over,dense_rank(),row_number() 的区别
  5. 输出torch构建的模型结构
  6. 实现textarea限制输入字数
  7. SpringCloud Sleuth + zipkin 实现微服务链路追踪功能
  8. API 应该享受版权保护吗?
  9. 解析搜索引擎的Robots协议
  10. 使用python制作ArcGIS插件(2)代码编写
  11. bug-Skipping optimization due to error while loading function libraries: Invalid argument: Functions
  12. Python超级码力在线编程大赛初赛题解
  13. ECharts南丁格尔玫瑰实现及部分配置解析
  14. CYGWIN安装方法
  15. 基于Proxy代理服务器的长连接方法
  16. simulink提示错误Invalid OutputTimes specified in the Configuration Parameters dialog for block diagram
  17. 论文翻译:2022_Time-Frequency Attention for Monaural Speech Enhancement
  18. [CF949D]Curfew
  19. 易语言 超文本浏览框
  20. riboseq的下游分析ribodiff,在R里进行GO分析和KEGG分析

热门文章

  1. Linux 内核开发 - NetFilter
  2. 深度学习/机器学习入门基础数学知识整理(一):线性代数基础,矩阵,范数等
  3. PCL点云库安装及学习(2021.7.28)
  4. 关于货物物品横竖摆放的问题
  5. 怎样把Audio cd光盘里的歌曲文件复制到硬盘里
  6. goahead(嵌入式Web服务器)之文件传输篇
  7. Demo2:Retrofit+Rxjava+Okhttp+Gson+Fresco+Butterknife
  8. 无尘车间净化装修方案
  9. go-cqhttp 使用文档
  10. scanf不能输入字符串Linux,scanf的用法