本篇博文以上一篇文章TCP/IP/ARP/ICMP首部分析为基础,根据STM32中以太网程序来着重看一下,以太网数据包的解析过程。
我们以一个简单的服务器应用为主线,进行以太网数据包的解析。在贴程序之前我们先看一下对于以太网数据包各部分的宏定义。
1. //******************* ETH ********************
2.
3. // 目标地址(6),源地址(6),类型/长度(2)
4. #define ETH_HEADER_LEN 14
5.
6. // 类型/长度的定义
7. #define ETHTYPE_ARP_H_V 0x08 // ETH包类型/长度ARP包标识符高位
8. #define ETHTYPE_ARP_L_V 0x06 // ETH包类型/长度ARP包标识符低位
9. #define ETHTYPE_IP_H_V 0x08 // ETH包类型/长度IP包标识符高位
10. #define ETHTYPE_IP_L_V 0x00 // ETH包类型/长度IP包标识符低位
11.
12. // Ethernet type field (2bytes)
13. #define ETH_TYPE_H_P 12 // ETH包类型/长度偏移地址
14. #define ETH_TYPE_L_P 13 // ETH包类型/长度偏移地址
15.
16. // 目的地址与源地址的位置
17. #define ETH_DST_MAC 0 // ETH包目的MAC偏移地址
18. #define ETH_SRC_MAC 6 // ETH包源始MAC偏移地址
19.
20. //******************* ARP ********************
21. #define ETH_ARP_OPCODE_REPLY_H_V 0x0 // ARP包操作类型字节:ARP响应高位
22. #define ETH_ARP_OPCODE_REPLY_L_V 0x02 // ARP包操作类型字节:ARP响应低位
23.
24. #define ETHTYPE_ARP_L_V 0x06
25.
26. //#define ETH_ARP_DST_IP_P 0x26 // arp.dst.ip
27.
28. #define ETH_ARP_OPCODE_H_P 0x14 // ETH包中ARP包类型,ARP头中存储操作类型高位的地址
29. #define ETH_ARP_OPCODE_L_P 0x15 // ETH包中ARP包类型,ARP头中存储操作类型低位的地址
30.
31. // arp.src.mac
32. #define ETH_ARP_SRC_MAC_P 0x16 // ETH包中ARP包类型,ARP头中存储源始MAC的首地址
33. #define ETH_ARP_SRC_IP_P 0x1c // ETH包中ARP包类型,ARP头中存储源始IP的首地址
34. #define ETH_ARP_DST_MAC_P 0x20 // ETH包中ARP包类型,ARP头中存储目的MAC的首地址
35. #define ETH_ARP_DST_IP_P 0x26 // ETH包中ARP包类型,ARP头中存储目的IP的首地址
36.
37. //******************* IP ********************
38. #define IP_HEADER_LEN 20 // IP包头文件长度
39.
40. #define IP_SRC_P 0x1a // ETH包中IP包类型,IP头中存储源始IP地址的首地址
41. #define IP_DST_P 0x1e // ETH包中IP包类型,IP头中存储目的IP地址的首地址
42. #define IP_HEADER_LEN_VER_P 0xe // ETH包中IP包类型,IP头中存储版本的首地址
43. #define IP_CHECKSUM_P 0x18 // ETH包中IP包类型,IP头中存储校验和的首地址
44. #define IP_TTL_P 0x16 // ETH包中IP包类型,IP头中存储生存时间的首地址
45. #define IP_FLAGS_P 0x14 // ETH包中IP包类型,IP头中存储标志的首地址
46. #define IP_P 0xe // ETH包中IP包类型,IP头的首地址
47. #define IP_TOTLEN_H_P 0x10 // ETH包中IP包类型,IP头中存储包裹总长高位的地址
48. #define IP_TOTLEN_L_P 0x11 // ETH包中IP包类型,IP头中存储包裹总长低位的地址
49.
50. #define IP_PROTO_P 0x17
51.
52. #define IP_PROTO_ICMP_V 1 // ETH包中IP包类型,IP头中协议代码1表示ICMP
53. #define IP_PROTO_TCP_V 6 // ETH包中IP包类型,IP头中协议代码6表示TCP
54. #define IP_PROTO_UDP_V 17 // ETH包中IP包类型,IP头中协议代码17表示UDP
55.
56. //******************* ICMP ********************
57. #define ICMP_TYPE_ECHOREPLY_V 0 // ETH包中IP包类型ICMP包,ICMP头类型代码回射应答
58. #define ICMP_TYPE_ECHOREQUEST_V 8 // ETH包中IP包类型ICMP包,ICMP头类型代码回射请求
59. //
60. #define ICMP_TYPE_P 0x22 // ETH包中IP包类型ICMP包,ICMP头类型代码的首地址
61. #define ICMP_CHECKSUM_P 0x24 // ETH包中IP包类型ICMP包,ICMP头校验和的首地址
62.
63. //******************* UDP ********************
64. #define UDP_HEADER_LEN 8 // ETH包中IP包类型UDP包,UDP头长度
65. //
66. #define UDP_SRC_PORT_H_P 0x22 // ETH包中IP包类型UDP包,UDP头源始端口号高位地址
67. #define UDP_SRC_PORT_L_P 0x23 // ETH包中IP包类型UDP包,UDP头源始端口号低位地址
68. #define UDP_DST_PORT_H_P 0x24 // ETH包中IP包类型UDP包,UDP头目的端口号高位地址
69. #define UDP_DST_PORT_L_P 0x25 // ETH包中IP包类型UDP包,UDP头目的端口号低位地址
70. //
71. #define UDP_LEN_H_P 0x26 // ETH包中IP包类型UDP包,UDP头UDP长度高位地址
72. #define UDP_LEN_L_P 0x27 // ETH包中IP包类型UDP包,UDP头UDP长度低位地址
73. #define UDP_CHECKSUM_H_P 0x28 // ETH包中IP包类型UDP包,UDP头UDP校验和高位地址
74. #define UDP_CHECKSUM_L_P 0x29 // ETH包中IP包类型UDP包,UDP头UDP校验和低位地址
75. #define UDP_DATA_P 0x2a // ETH包中IP包类型UDP包,UDP包数据区首地址
76.
77. //******************* TCP ********************
78. #define TCP_SRC_PORT_H_P 0x22 // ETH包中IP包类型TCP包,TCP头中存储源始端口高位的地址
79. #define TCP_SRC_PORT_L_P 0x23 // ETH包中IP包类型TCP包,TCP头中存储源始端口低位的地址
80. #define TCP_DST_PORT_H_P 0x24 // ETH包中IP包类型TCP包,TCP头中存储目的端口高位的地址
81. #define TCP_DST_PORT_L_P 0x25 // ETH包中IP包类型TCP包,TCP头中存储目的端口低位的地址
82.
83. // the tcp seq number is 4 bytes 0x26-0x29
84. #define TCP_SEQ_H_P 0x26 // ETH包中IP包类型TCP包,TCP头中存储数据序号的首地址
85. #define TCP_SEQACK_H_P 0x2a // ETH包中IP包类型TCP包,TCP头中存储确认序号的首地址
86.
87. #define TCP_FLAGS_P 0x2f // ETH包中IP包类型TCP包,TCP头中存储标志字节的地址
88. #define TCP_FLAGS_SYN_V 2
89. #define TCP_FLAGS_FIN_V 1
90. #define TCP_FLAGS_PUSH_V 8
91. #define TCP_FLAGS_SYNACK_V 0x12 // ETH包中IP包类型TCP包,TCP头中同步比特确认值
92. #define TCP_FLAGS_ACK_V 0x10 // ETH包中IP包类型TCP包,TCP头中确认比特值
93. #define TCP_FLAGS_PSHACK_V 0x18 // ETH包中IP包类型TCP包,TCP头中PSH比特确认值
94.
95. // TCP数据头中没有可选选项字节
96. #define TCP_HEADER_LEN_PLAIN 20 // ETH包中IP包类型TCP包,TCP头长度(如果不包含可选选项)
97. #define TCP_HEADER_LEN_P 0x2e // ETH包中IP包类型TCP包,TCP头中存储偏移的首地址
98. #define TCP_CHECKSUM_H_P 0x32 // ETH包中IP包类型TCP包,TCP头中存储包校验和地址
99. #define TCP_CHECKSUM_L_P 0x33 // ETH包中IP包类型TCP包,TCP头中存储包校验和地址
100. #define TCP_OPTIONS_P 0x36 // ETH包中IP包类型TCP包,TCP头中存储可选选项的首地址
上面的宏定义中记录了在各个协议首部一些关键数据的位置及关键代码的参数。对于占用多个字节的参数高位在前
在以太网中数据包的解析主要有4条线路,分别是
ETH ---> ARP
ETH ---> IP ---> TCP ---> 应用程序
ETH ---> IP ---> UDP ---> 应用程序
ETH ---> IP ---> ICMP
上一篇:STM32以太网程序解析三
下一篇:STM32关于printf重定向到串口
推荐阅读最新更新时间:2024-11-10 10:28
推荐帖子
- AD14.3 :PCB中制作任意LOGO
- 哪位大神会AD14.3:PCB中制作任意LOGO,求制作方法,谢谢!file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\272085450\QQ\WinTemp\RichOle\HZ7X$~U3WSB.pngfile:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\272085450\QQ\WinTemp\RichOle\3HO`@HVY$SOAD)
- zttian PCB设计
- LPC1788运行在SDRAM中,不知道为什么运行速度比在FLASH中运行变慢了。
- 使用LPC1788,APP运行在SDRAM地址0XA0000000处,感觉程序执行速度明显变慢了。APP应用程序原本在FLASH地址为0X2000处执行没有问题的。(1)、BootLoader基本情况,使用CPUCLK=120MHZ,EMCCLK=60MHZ,PCLK=60MHZ,跳转到SDRAM中执行APP,中断向量表存放在SRAM。(2)、APP基本情况,使用CPUCLK=120MHZ,EMCCLK=60MHZ,PCLK=60MHZ,TFT显示,NAND使用Yaffs2文件系统,SD卡使
- cybinlyc NXP MCU
- 这个创意你想到了吗?妮维雅RFID儿童手环
- 这是段妮维雅的广告,主要介绍基于RFID技术的儿童手环应用;把RFID芯片整合到宣传单上,妈妈们可以从杂志上直接摘下来,戴在孩子手腕上,接着在手机上配对手环信息,再设定孩子可跑远的范围;当孩子远离妈妈设定的范围时,应用就会提醒父母,从而让父母可以愉快的享受阳光,而不用处处担心孩子的安全。不知道RFID技术的有效范围是多少?看起来成本应该不高。这个创意你想到了吗?妮维雅RFID儿童手环这个RFID可以做得到?wg
- eric_wang 移动便携
- LM3s8962体验之八……异常与中断
- 一、简介异常:也就是意外突发事件,该请求来自外面,来自片上外设秒外扩的外设。可是说是异步的。中断:是因内核活动产生的,如在执行命令和访问存储器时产生。应是同步。Corter-M3的异常响应系统,支持众多的系统异常和外部中断。编号1-15的对应异常,》15的是外部中断。如下所示:异常:通过上表可以看出,编号4-6,11-12,14-15共
- sdjntl 微控制器 MCU
- 小试microbit
- 开机动画播放音乐如果您对microbit非常感兴趣,欢迎加入我们的众筹,一起制作中国版的microbit小试microbit牛,很炫酷啊{:1_103:}看起来很炫酷啊,是不是还支持mbed?shihuntaotie发表于2016-12-718:26看起来很炫酷啊,是不是还支持mbed? 是,可以用mbed开发,板载了DAPLink仿真器,和CMSIS-DAP差不多https://developer.mbed.org/
- dcexpert MicroPython开源版块
- 【2024 DigiKey创意大赛】环境智眼-可视化智能环境观测器
- 环境智眼-可视化智能环境观测器作者:小神123一、作品简介环境智眼是一款革命性的智能环境观测器,它能够实时监测和分析各种环境参数,如温度、湿度、空气质量等。通过集成的高精度传感器阵列和强大的数据处理能
- 小神123 DigiKey得捷技术专区