在使用IP核40G/50G Ethernet Subsystem,实现PC-FPGA板UDP双向通信的过程中,需要提取接收帧数据部分以及填充帧头给发送帧,所以学习了IPV4 UDP协议,用Wireshark和ila抓取包并详细分析了帧结构,包括UDP数据包、ARP包、ICMP包。

一、UDP包

1. 完整以太网帧的结构图(普通包/分载包)

以太网帧头 + IP帧头UDP帧头 + 数据部分

2. 举例分析图

3. 帧结构信息详解

Ⅰ. 以太网帧头

③【以太网类型】:0800-> IPV4,86DD->IPV6,0806->ARP

Ⅱ. IP帧头

①【版本号】:IPV4固定为4
②【首部长度】:以4字节为单位,5=20byte
③【服务类型】:用于Qos服务质量,8'h00-普通服务
④【总长度】:普通包及分载包第一个分片:IP首部长度 + UDP首部长度 + 数据长度, 分载包第n+1个分片:IP首部长度 + 数据长度
⑤【标识】:分片重组时用于匹配同一原始数据报,一个分载包中不同分片的标识相同
⑥【标志位】:001->需要分片且后续还有分片,000->需要分片且当前为最后一个分片,010->不需要分片
⑦【片偏移】:以8字节为单位
⑧【生存时间】:TTL,数据包最大跳数限制,每经过一个路由器减1,为0时丢弃,防止数据包因路由环路无限循环
⑨【协议类型】:6->TCP,17->UDP,1->ICMP
⑩【首部校验和】:仅校验IP首部,例子中tmp[31:0]=16'h4500+16'h033c+16'h496c+16'h0000+16'h8011+16'hc0a8+16'h0001+16'hc0a8+16'h0002=32'h0002930C; ip_check_sum[15:0]=~(tmp[31:16]+tmp[15:0])=~(16'h930E);

Ⅲ. UDP帧头

③【长度】:UDP帧头8byte + 数据长度,长度-8byte是普通包的当前包数据长度,或是分载包不同分片的总数据长度,即同一IP首部标识的UDP帧长度统计
④【校验和】:IPV4可置0,代表不使用

二、ARP包

1. 完整以太网帧的结构图

以太网帧头 + ARP协议报文

2. 举例分析图

3. 帧结构信息详解

Ⅰ. 以太网帧头

同上

Ⅱ. ARP协议报文

①【硬件类型】:1->以太网,6->IEEE 802网络
②【协议类型】:0800-> 需要解析IPV4地址对应的MAC地址,86DD-> 需要解析IPV6地址对应的MAC地址
③【MAC长度】:以1字节为单位
④【IP长度】:以1字节为单位
⑤【操作码】:1->ARP请求,2->ARP应答

三、ICMP包

1. 完整以太网帧的结构图

以太网帧头 + IP帧头ICMP帧头 + 数据部分

2. 举例分析图

3. 帧结构信息详解

Ⅰ. 以太网帧头

同上

Ⅱ. IP帧头

同上

Ⅲ. ICMP帧头

①【类型】:ICMP报文类型,请求->8,响应->0
②【码】:子类型(回显请求固定为0)
③【校验和】:校验ICMP报文(帧头+数据)
④【标识符】:用于匹配请求与响应(通常为进程ID)
⑤【序列号】:请求包序号,每发一次加1

四、注意事项

1. UDP传输限制

① 以太网帧最小64字节(包含4byte的帧校验序列FCS)
② UDP包最大65535字节(包含8byte的UDP帧头)
③ 当传输包大于MTU大小时,会被拆分成分载包,标识一致

2. PC端修改MTU的方法

① 管理员运行cmd
② netsh interface ipv4 show subinterfaces
③ netsh interface ipv4 set subinterfaces "以太网1" mtu=8992 store=persistent

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐