搜索
bottom↓
回复: 42

AVRNET学习笔记 ETHERNET ARP部分

  [复制链接]

出0入0汤圆

发表于 2013-2-12 23:01:19 | 显示全部楼层 |阅读模式
本帖最后由 xukai871105 于 2013-2-12 23:02 编辑

1.前言
       嵌入式以太网开发是一个很有挑战性的工作。通过几个月的学习,我个人觉得大致有两条途径。第一条途径,先通过高级语言熟悉socket编程,例如C#C++,对bindlistenconnectaccept等函数熟悉之后,上手lwIP或uIP。第二种途径,通过分析嵌入式以太网代码,结合TCPIP协议栈规范一点一点实践代码。第一种途径效率高,开发周期短,编写的代码性能稳定,第二种途径花费时间长,代码功能不完善,但是由于紧紧结合TCPIP规范,可以了解的内容较多,适合学习。本文通过分析和修改AVRNET源码,逐步实现TCPIP协议栈的各个子部分,包括ETHERNET部分,ARP部分,IP部分,ICMP部分,UDP部分,TCP部分和HTTP部分。
       本文先实现ethernet部分和ARP部分。
1.2 其他说明
硬件平台 Atmega32 + proteus 7.10 sp0+WinPcap
编译平台 AVR Studio 6
仿真设置
       在仿真的过程中,需要保持有线网卡处于连接状态。通过不断的尝试我发现使用proteus仿真以太网时并不能抓取无线网卡的数据,使用无线网卡将得不到正确的仿真结果。在实践之前,需要通过ipconfig命令查看PC机的IP地址和MAC地址,AVRIP地址设定必须和PC机在同一个网段中。例如
PCIP192.168.1.101
AVR IP 192.168.1.15
局域网访问
       如果有AVR开发板或者其他CPU的开发板的话,可以把开发板的以太网端口连接到路由器LAN端口,只要保证开发板的IP地址和PC机的IP地址在同一个网段,无论有线还是无线都可以获得仿真结果。
广域网访问
       如果有固定的电信网IP地址的话,可以在路由器中设置静态端口映射,把某个端口映射成局域网内的IP地址和端口号。若没有固定IP地址的话,可使用花生壳虚拟一个域名。由于设置步骤较多,再次不详细介绍。
2.初始化
       以太网协议栈的实现离不开以太网驱动芯片。以太网驱动如何实现请参考——ENC28J60学习笔记,相关链接http://www.amobbs.com/thread-5519381-1-2.html。TCPIP的实现离不开两个基本地址,IP地址和MAC地址。在AVRNET项目中通过以下代码定义和实现。
  1. // MAC地址结构体
  2. typedef struct _MAC_ADDR
  3. {
  4.     BYTE byte[6];
  5. }MAC_ADDR;
  6. // IP地址结构体
  7. typedef struct _IP_ADDR
  8. {
  9.   BYTE byte[4];
  10. }IP_ADDR;
  11.   // 初始化MAC地址
  12.   avr_mac.byte[0] = 'A';
  13.   avr_mac.byte[1] = 'V';
  14.   avr_mac.byte[2] = 'R';
  15.   avr_mac.byte[3] = 'P';
  16.   avr_mac.byte[4] = 'O';
  17.   avr_mac.byte[5] = 'R';

  18.   // 初始化IP地址
  19.   avr_ip.byte[0] = 192;
  20.   avr_ip.byte[1] = 168;
  21.   avr_ip.byte[2] = 1;
  22.   avr_ip.byte[3] = 105;
复制代码
       MAC地址和IP地址均为自定义的结构体,结构体中为一个字节数组。严格来说,MAC地址不能胡乱定义,应严格遵守相关规范,如果条件允许的话可以使用带有全球唯一的MAC地址的EEPROM芯片。局域网仿真时,AVRIP地址必须要和PCIP地址处于同一个网段,即使是广域网实现AVRIP地址也应和路由器的IP在同一个网段中。
3.实现ETHERNET
       TCPIP是一系列协议的组合,其中最有名的为TCP协议和IP协议。但是千万不要忽视最底层的协议结构——ETHERNETETHERNET包括14个字节,可以称之为以太网首部,其中前六个字节为目标MAC地址,紧着的6个字节为源MAC地址,最后的两个字节为协议类型。以太网的实现通信时必须要知道双方的MAC地址,发送方不明确接收方的地址可以通过ARP协议寻找目标MAC地址,如果依然没有结果则可只能把该报文转发给路由器,让路由器处理该报文。协议类型只需关心两种,0800IP协议和0806ARP协议。
AVRNET项目中通过以下代码实现:
  1. // 协议类型 ARP报文
  2. #define ETH_TYPE_ARP_V    0x0806
  3. #define ETH_TYPE_ARP_H_V  0x08
  4. #define ETH_TYPE_ARP_L_V  0x06
  5. // 协议类型 以太网报文
  6. #define ETH_TYPE_IP_V     0x0800
  7. #define ETH_TYPE_IP_H_V   0x08
  8. #define ETH_TYPE_IP_L_V   0x00
  9. // 以太网报文头部长度 14
  10. #define ETH_HEADER_LEN    14
  11. // 目标MAC地址
  12. #define ETH_DST_MAC_P     0
  13. // 源MAC地址
  14. #define ETH_SRC_MAC_P     6
  15. // 协议类型
  16. #define ETH_TYPE_H_P      12
  17. #define ETH_TYPE_L_P      13
  18. void eth_generate_header ( BYTE *rxtx_buffer, WORD_BYTES type, BYTE *dest_mac )
  19. {
  20.   BYTE i;
  21.   // 配置以太网报文 目标MAC地址和源MAC地址
  22.   for ( i=0; i<sizeof(MAC_ADDR); i++)
  23.   {
  24.     rxtx_buffer[ ETH_DST_MAC_P + i ] = dest_mac[i];
  25.     // avr_mac为全局变量
  26.     rxtx_buffer[ ETH_SRC_MAC_P + i ] = avr_mac.byte[i];
  27.   }
  28.   // 配置协议类型 IP报文或ARP报文
  29.   rxtx_buffer[ ETH_TYPE_H_P ] = type.byte.high;
  30.   rxtx_buffer[ ETH_TYPE_L_P ] = type.byte.low;
  31. }
复制代码
eth_generate_header函数实现了填充以太网首部的功能,第一个输入参数为发送接收缓冲区。第二个参数为IP类型,在AVRNET项目中传入的参数不是0800IP协议类型就是0806ARP协议类型。第三个参数为目标MAC地址,由于本机MAC地址作为了全局变量,可以在函数内部填充到缓冲区中。
4.实现ARP
       为了使用最少的代码实现TCPIP功能,假设通过IP发送报文时已经确认了目标的IP地址,AVRNET总是先被动的通过ARP先让PC机知道其MAC地址,这样当PC机发送UDP或者TCP报文时,在报文中已经包含了PC机的IP地址,AVR仅需从rxtx_buffer中取出PCIP地址。如果没有这样的假设的话,AVR需要有一张MAC表,每次发送报文时需要查找该表并不断更新。ARP协议是一个找邻居的过程,是一个广播找MAC的过程。发出者通过广播报文确认某个IPMAC地址。ARP首部包括,2字节硬件类型,2字节协议类型,1字节硬件长度,1字节协议长度,2字节操作码,6字节发送者硬件地址,4字节发送者IP地址,6字节目标硬件地址和4字节目标IP地址。
       在使用ARP协议时需要注意三点,第一,操作码分为两种——ARP请求和ARP响应,ARP请求的编码为1ARP响应的编码为2,先有请求后有响应。第二,发送ARP协议请求时请求方明确对方IP地址,但是不明确对方MAC地址,所以在请求报文中MAC地址全部以0替代。第三,由于不知道对方的MAC地址,所以只能通过广播帧发送以太网数据,所以以太网首部的前6个字节被FF填充。
为了便于ARP功能的实现,AVRNET在arp.h文件中定义了以下宏定义
  1. #define ARP_PACKET_LEN          28
  2. // ARP请求
  3. #define ARP_OPCODE_REQUEST_V    0x0001
  4. #define ARP_OPCODE_REQUEST_H_V  0x00
  5. #define ARP_OPCODE_REQUEST_L_V  0x01
  6. // ARP响应
  7. #define ARP_OPCODE_REPLY_V      0x0002
  8. #define ARP_OPCODE_REPLY_H_V    0x00
  9. #define ARP_OPCODE_REPLY_L_V    0x02
  10. // 硬件类型 10M以太网
  11. #define ARP_HARDWARE_TYPE_H_V   0x00
  12. #define ARP_HARDWARE_TYPE_L_V   0x01
  13. // 协议类型 IPV4
  14. #define ARP_PROTOCOL_H_V        0x08
  15. #define ARP_PROTOCOL_L_V        0x00
  16. // 硬件地址长度
  17. #define ARP_HARDWARE_SIZE_V     0x06
  18. // 协议地址长度
  19. #define ARP_PROTOCOL_SIZE_V     0x04
  20. // 硬件类型 2字节
  21. #define ARP_HARDWARE_TYPE_H_P   0x0E
  22. #define ARP_HARDWARE_TYPE_L_P   0x0F
  23. // 协议类型 2字节
  24. #define ARP_PROTOCOL_H_P        0x10
  25. #define ARP_PROTOCOL_L_P        0x11
  26. // 硬件地址 1字节
  27. #define ARP_HARDWARE_SIZE_P     0x12
  28. // 协议地址长度 1字节
  29. #define ARP_PROTOCOL_SIZE_P     0x13
  30. // 操作码 2字节
  31. #define ARP_OPCODE_H_P          0x14
  32. #define ARP_OPCODE_L_P          0x15
  33. // 发送者硬件地址 6字节
  34. #define ARP_SRC_MAC_P           0x16
  35. // 发送者IP地址 4字节
  36. #define ARP_SRC_IP_P            0x1C
  37. // 目标硬件地址 6字节
  38. #define ARP_DST_MAC_P           0x20
  39. // 目标IP地址 6字节
  40. #define ARP_DST_IP_P            0x26
复制代码
在没有操作系统的支持下,一般通过一个无线循环实现子功能的实现。AVRNET项目中,通过某个process不断查询是否存在网卡数据,如果有网卡数据则立刻保存源MAC地址。,因为AVRNET项目中没有维护ARP表,所以必须及时记录发送发的MAC地址,方便向它返回数据。紧着便是查询该报文是否为ARP请求,如果是ARP请求则返回ARP响应。具体代码如下
  1. void server_process ( void )
  2. {
  3.   MAC_ADDR  client_mac;
  4.   IP_ADDR   client_ip;
  5.   BYTE      rxtx_buffer[MAX_RXTX_BUFFER];
  6.   WORD      plen;

  7.   /* 获得新的IP报文 */
  8.   plen = enc28j60_packet_receive( (BYTE*)&rxtx_buffer, MAX_RXTX_BUFFER );

  9.   if(plen==0)
  10.     return;
  11.     /* 保存该报文的源MAC地址,即保存客服端的MAC地址 */
  12.   memcpy ( (BYTE*)&client_mac, &rxtx_buffer[ ETH_SRC_MAC_P ], sizeof(MAC_ADDR) );
  13.   /* 检查该报文是不是ARP请求 */
  14.   if ( arp_packet_is_arp( rxtx_buffer, (WORD_BYTES){ARP_OPCODE_REQUEST_V} ) )
  15.   {
  16.     /*返回ARP响应 */
  17.     arp_send_reply ( (BYTE*)&rxtx_buffer, (BYTE*)&client_mac );
  18.     return;
  19.   }
  20. }
复制代码
4.1 查询ARP报文
       查询该报文是否是针对AVRARP报文需要确认三点,第一:确认以太网首部中的协议类型是否为ARP协议类型,ARP协议类型的值为0806H。第二,查询该ARP报文是否为ARP请求,该步骤需要到ARP首部中查询ARP操作码,ARP请求的操作码为1。第三,查询该ARP请求中的MAC地址是否和本机MAC匹配。
       最后通过宏定义ARP_DEBUD决定是否通过串口输出发起者IP地址和MAC地址。通过串口打印可以确认该ARP报文的发起者。
  1. BYTE arp_packet_is_arp ( BYTE *rxtx_buffer, WORD_BYTES opcode )
  2. {
  3.   BYTE i;

  4.   // 该报文为ARP报文
  5.   if( rxtx_buffer[ ETH_TYPE_H_P ] != ETH_TYPE_ARP_H_V || rxtx_buffer[ ETH_TYPE_L_P ] != ETH_TYPE_ARP_L_V)
  6.     return 0;
  7.   // 确认ARP操作码 ARP请求 1 ARP应答2
  8.   if ( rxtx_buffer[ ARP_OPCODE_H_P ] != opcode.byte.high || rxtx_buffer[ ARP_OPCODE_L_P ] != opcode.byte.low )
  9.     return 0;
  10.   // 匹配IP地址
  11.   for ( i=0; i<sizeof(IP_ADDR); i++ )
  12.   {
  13.     if ( rxtx_buffer[ ARP_DST_IP_P + i] != avr_ip.byte[i] )
  14.       return 0;
  15.   }

  16.   // 通过串口输出
  17.   #ifdef ARP_DEBUG
  18.   printf("ARP Message!\n");
  19.   printf("Source IP:%d.%d.%d.%d\n",\
  20.         rxtx_buffer[ARP_SRC_IP_P+0],rxtx_buffer[ARP_SRC_IP_P+1],\
  21.         rxtx_buffer[ARP_SRC_IP_P+2],rxtx_buffer[ARP_SRC_IP_P+3]);
  22.   printf("Source MAC:%02X-%02X-%02X-%02X-%02X-%02X",\
  23.         rxtx_buffer[ARP_SRC_MAC_P+0],rxtx_buffer[ARP_SRC_MAC_P+1],\
  24.         rxtx_buffer[ARP_SRC_MAC_P+2],rxtx_buffer[ARP_SRC_MAC_P+3],\
  25.         rxtx_buffer[ARP_SRC_MAC_P+4],rxtx_buffer[ARP_SRC_MAC_P+5]);

  26.   #endif     
  27.   return 1;
  28. }
复制代码
4.2 生成ARP首部
       生成ARP首部还是紧紧围绕两个地址展开,即目标MAC地址和目标IP地址,在ARP响应过程中,源MAC地址和IP地址现在转变为了目标MAC地址和IP地址。
  1. void arp_generate_packet ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip )
  2. {
  3.   unsigned char i;

  4.   // 硬件类型 0001 10M以太网
  5.   rxtx_buffer[ ARP_HARDWARE_TYPE_H_P ] = ARP_HARDWARE_TYPE_H_V;
  6.   rxtx_buffer[ ARP_HARDWARE_TYPE_L_P ] = ARP_HARDWARE_TYPE_L_V;

  7.   // 协议类型
  8.   rxtx_buffer[ ARP_PROTOCOL_H_P ] = ARP_PROTOCOL_H_V;
  9.   rxtx_buffer[ ARP_PROTOCOL_L_P ] = ARP_PROTOCOL_L_V;

  10.   // 硬件地址长度
  11.   rxtx_buffer[ ARP_HARDWARE_SIZE_P ] = ARP_HARDWARE_SIZE_V;

  12.   // 协议地址长度
  13.   rxtx_buffer[ ARP_PROTOCOL_SIZE_P ] = ARP_PROTOCOL_SIZE_V;

  14.   // 目标硬件地址和源硬件地址
  15.   for ( i=0; i<sizeof(MAC_ADDR); i++)
  16.   {
  17.     rxtx_buffer[ ARP_DST_MAC_P + i ] = dest_mac[i];
  18.     rxtx_buffer[ ARP_SRC_MAC_P + i ] = avr_mac.byte[i];
  19.   }

  20.   // 目标IP地址和源IP地址
  21.   for ( i=0; i<sizeof(IP_ADDR); i++)
  22.   {
  23.     rxtx_buffer[ ARP_DST_IP_P + i ] = dest_ip[i];
  24.     rxtx_buffer[ ARP_SRC_IP_P + i ] = avr_ip.byte[i];
  25.   }
  26. }
复制代码
4.3 响应ARP请求
       ARP响应可以体现出TCP IP报文产生的基本过程,即层层包装。先包装以太网首部,在包装ARP首部,最后通过ENC28J60发送即可。
  1. void arp_send_reply ( BYTE *rxtx_buffer, BYTE *dest_mac )
  2. {
  3.   // 生成以太网报文
  4.   eth_generate_header ( rxtx_buffer, (WORD_BYTES){ETH_TYPE_ARP_V}, dest_mac );

  5.   // ARP报文类型为ARP响应
  6.   rxtx_buffer[ ARP_OPCODE_H_P ] = ARP_OPCODE_REPLY_H_V;
  7.   rxtx_buffer[ ARP_OPCODE_L_P ] = ARP_OPCODE_REPLY_L_V;
  8.   // 生成ARP请求,传入请求者MAC地址,请求者IP地址
  9.   arp_generate_packet ( rxtx_buffer, dest_mac, &rxtx_buffer[ ARP_SRC_IP_P ] );

  10.   // 发送以太网报文
  11.   enc28j60_packet_send ( rxtx_buffer, sizeof(ETH_HEADER) + sizeof(ARP_PACKET) );
  12. }
复制代码
5.实例
       通过一个实例让PC机确认AVRMAC地址,PC机试图通过ping命令发送一个ICMP报文,ping命令时非常常用的确认网络是否连接的命令,例如发送ping192.168.1105,由于PC机不明确该IP地址的MAC地址,所以会先发送一个ARP请求。AVR可以捕获这一ARP请求,并通过串口输出PC机的IP地址和MAC地址。如果正确输出了PC机的IP地址和MAC地址,并且通过arp命令可以查看到AVR的网卡即说明以上代码运行成功。此时先不用理会是否可以ping通,这个会在以后的文章中实现。
       在开始之前可以通过ipconfig /all指令查询本机的IP地址和MAC地址,通过arp -a指令查询PC机中ARP缓冲表。如果有必要可以使用arp –d清除缓冲表的所有内容。
通过ipconfig /all 查询PCIP地址和MAC地址
通过arp命令查询arp缓存表
图 仿真结果1
图 串口打印结果
图 更新之后的ARP缓冲区
从仿真的结果可以看出,AVR成功收到了ARP请求,并返回了ARP响应,PC机更新了ARP缓冲表,加入了AVRIP地址和MAC地址。即图中的192.1168.105,对应的MAC地址为41-56-52-50-4f-52,正是AVRNETASCII编码的16进制表达。
(工程文件中,icmp,udp,http均已实现,还包括enc28j60的驱动)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-2-12 23:31:12 | 显示全部楼层
记得有个老外开源用28j60的方案 楼主写的不错 一直想深入学习下 谢谢

出0入0汤圆

发表于 2013-2-13 07:32:31 | 显示全部楼层
謝謝學習網路的好資料.

出0入0汤圆

 楼主| 发表于 2013-2-13 12:32:35 | 显示全部楼层
tyqhaha 发表于 2013-2-12 23:31
记得有个老外开源用28j60的方案 楼主写的不错 一直想深入学习下 谢谢

是不是指的这个,这个里面的资料也很多!
http://www.tuxgraphics.org/elect ... 111.shtml#0lfindex0

出0入0汤圆

发表于 2013-2-13 15:36:53 | 显示全部楼层
xukai871105 发表于 2013-2-13 12:32
是不是指的这个,这个里面的资料也很多!
http://www.tuxgraphics.org/electronics/200611/article06111. ...

对,谢谢!

出0入0汤圆

发表于 2013-2-14 21:25:13 | 显示全部楼层
让大家都看看,宝典啊!

出0入0汤圆

发表于 2013-2-15 02:59:21 来自手机 | 显示全部楼层
留字备查,谢lz

出0入0汤圆

发表于 2013-2-15 23:18:01 | 显示全部楼层
不错,好资料,学习一下
谢谢了

出0入0汤圆

发表于 2013-3-27 10:28:08 | 显示全部楼层
楼主有一点错误
// 该报文为ARP报文
  if( rxtx_buffer[ ETH_TYPE_H_P ] != ETH_TYPE_ARP_H_V || rxtx_buffer[ ETH_TYPE_L_P ] != ETH_TYPE_ARP_L_V)
    return 0;

这里应该是不为ARP报文!返回0

出0入0汤圆

发表于 2013-3-27 10:30:14 | 显示全部楼层
收藏备用,LZ辛苦了

出0入0汤圆

 楼主| 发表于 2013-3-28 14:20:49 | 显示全部楼层
犯戒和尚 发表于 2013-3-27 10:28
楼主有一点错误
// 该报文为ARP报文
  if( rxtx_buffer[ ETH_TYPE_H_P ] != ETH_TYPE_ARP_H_V || rxtx_buf ...

是的,逻辑错误!改正!

出0入0汤圆

发表于 2013-4-3 16:13:39 | 显示全部楼层
请问楼主,ENC424J600你用没用呢

出0入0汤圆

发表于 2013-4-3 19:37:25 | 显示全部楼层
以后会用到 收藏

出0入0汤圆

 楼主| 发表于 2013-4-3 22:18:57 | 显示全部楼层
cuilikun 发表于 2013-4-3 16:13
请问楼主,ENC424J600你用没用呢

呵呵,没钱做硬件!要我如何是好呢!

出0入0汤圆

发表于 2013-4-3 23:57:36 | 显示全部楼层
飘过,好贴只是没时间看,但必须顶!!!!!!!!

出0入0汤圆

发表于 2013-5-10 22:21:49 | 显示全部楼层
楼主你好,现在正在做毕业设计,单片机要通过TCP/IP协议与上位机通信,只需要把下位机采集的数据发给上位机,需要保留那些功能呢?上位机要用什么实现呢?非常希望楼主能够提供帮助。

出0入0汤圆

 楼主| 发表于 2013-5-11 16:42:22 | 显示全部楼层
935815901 发表于 2013-5-10 22:21
楼主你好,现在正在做毕业设计,单片机要通过TCP/IP协议与上位机通信,只需要把下位机采集的数据发给上位机 ...

看了这部分帖子,你还需要IP协议和UDP协议!后面还有几个帖子的,你在论坛里面找找!

至于上位机吗,可以使用套接字通信,使用C#会简单些,当然python也非常简单!

出0入0汤圆

发表于 2013-7-9 20:36:09 | 显示全部楼层
楼主,你好,我现在在用STM32F4开发以太网功能,我接的是交换芯片不是PHY芯片,暂时想通过中断查询是否接收到报文或者发送报文成功,而不是通过移植协议栈,不知道这样可行不?我看到的资料都是移植的协议栈。

出0入0汤圆

 楼主| 发表于 2013-7-9 21:51:13 | 显示全部楼层
water0313 发表于 2013-7-9 20:36
楼主,你好,我现在在用STM32F4开发以太网功能,我接的是交换芯片不是PHY芯片,暂时想通过中断查询是否接收 ...

不知道这些能否帮你一下!
1.2 相关资料
ENC28J60学习笔记链接
http://www.amobbs.com/thread-5519381-1-1.html
AVRNET学习笔记 ETHERNET和ARP部分
http://www.amobbs.com/thread-5519452-1-1.html
AVRNET学习笔记 IP和ICMP部分
http://www.amobbs.com/thread-5519494-1-1.html
AVRNET学习笔记 UDP部分
http://www.amobbs.com/thread-5519530-1-1.html
AVRNET项目(国外)
http://www.avrportal.com/?page=avrnet
AVR webserver项目(国外)
http://www.tuxgraphics.org/elect ... 111.shtml#0lfindex0

出0入0汤圆

发表于 2013-7-10 10:23:03 | 显示全部楼层
xukai871105 发表于 2013-7-9 21:51
不知道这些能否帮你一下!
1.2 相关资料
ENC28J60学习笔记链接

感谢楼主的慷慨分享

出0入0汤圆

发表于 2013-7-26 21:40:00 | 显示全部楼层
楼主好东西啊  那我们要与电脑进行通信是不是一定要tcp或udp协议的啊

出0入0汤圆

 楼主| 发表于 2013-7-27 18:46:14 | 显示全部楼层
糖糖love丽 发表于 2013-7-26 21:40
楼主好东西啊  那我们要与电脑进行通信是不是一定要tcp或udp协议的啊

你问的问题真的很难回答!就好比你问我,使用电脑是不是一定要用windows系统一样难以回答!

出0入0汤圆

发表于 2013-7-27 18:51:32 | 显示全部楼层
xukai871105 发表于 2013-7-27 18:46
你问的问题真的很难回答!就好比你问我,使用电脑是不是一定要用windows系统一样难以回答!
...

额   主要我是新手  可能我没表达清楚意思   我主要是想问下我们在只有使用arp协议时能不能正常进行数据传输 而不用tcp等上层协议

出0入0汤圆

 楼主| 发表于 2013-7-27 18:57:24 | 显示全部楼层
糖糖love丽 发表于 2013-7-27 18:51
额   主要我是新手  可能我没表达清楚意思   我主要是想问下我们在只有使用arp协议时能不能正常进行数据 ...

很明确的告诉你,ARP协议是不可以传输数据的!

再次,请你详细看看ARP协议的作用,或许会有不好的收获!

从你的疑惑来说,我感觉你可能想遵守IEEE802.3协议标准,而不想遵守TCP IP协议标准。
如果是这种情况的话,前14个字节要符合IEEE802.3标准,后面的可以自己定义。例如 POWERLINK协议。

不过这样的方式的话,调试会比较困难。

出0入0汤圆

发表于 2013-7-27 19:44:49 | 显示全部楼层
xukai871105 发表于 2013-7-27 18:57
很明确的告诉你,ARP协议是不可以传输数据的!

再次,请你详细看看ARP协议的作用,或许会有不好的收获! ...

再问楼主一个问题啊  多谢了   是不是以太网协议只有IEEE802.3协议或者TCP IP协议  而arp协议的话是属于TCP IP协议的  那么遵守IEEE802.3协议的话就不需要用arp协议了

出0入0汤圆

发表于 2013-7-27 20:13:06 | 显示全部楼层
学习了, mark

出0入0汤圆

 楼主| 发表于 2013-7-28 07:05:07 | 显示全部楼层
糖糖love丽 发表于 2013-7-27 19:44
再问楼主一个问题啊  多谢了   是不是以太网协议只有IEEE802.3协议或者TCP IP协议  而arp协议的话是属于T ...

可能我也说的不是很对,下面的你可以参考一下!
1.TCP IP协议建立在IEEE 802.3协议的基础上
2.ARP协议属于TCP IP协议的IPV4版本,在IPV6版本上并没有ARP协议,ARP被ICMPV6替代
3.使用ENC28J60或是其他以太网驱动芯片时,可不遵守TCP IP协议栈。
4.如果要实现第3点,请问您想做什么呢。

出0入0汤圆

发表于 2013-7-28 12:22:05 | 显示全部楼层
非常不错,学习了

出0入0汤圆

发表于 2013-7-31 00:19:02 | 显示全部楼层
多谢了  这个真的是internet入门非常好的教材

出0入0汤圆

发表于 2013-7-31 00:35:02 | 显示全部楼层
谢谢楼主的资料,有时间琢磨琢磨,谢谢。

出0入0汤圆

发表于 2013-10-9 15:47:21 | 显示全部楼层
楼主的帖子发的都很好,都很值得学习,顶

出0入0汤圆

发表于 2013-10-12 20:05:07 | 显示全部楼层
有空了学学,对这个还是比较好奇……谢谢分享。

出0入0汤圆

发表于 2013-12-31 14:34:00 | 显示全部楼层

收藏,
非常不错,学习了

出0入0汤圆

发表于 2014-1-1 13:45:39 | 显示全部楼层
AVRNET是个网络协议么?

出0入0汤圆

 楼主| 发表于 2014-1-1 21:52:54 | 显示全部楼层
luvemcu 发表于 2014-1-1 13:45
AVRNET是个网络协议么?

不是,是一个开源项目!

出0入0汤圆

发表于 2014-1-10 10:25:23 | 显示全部楼层
mark,努力学习中

出0入0汤圆

发表于 2014-2-20 19:12:10 | 显示全部楼层
收藏收藏

出0入0汤圆

发表于 2014-3-22 15:33:53 | 显示全部楼层
楼主你好,在学习你的帖子,AVRNET是不是根据以太网协议然后自己做的栈啊

出0入0汤圆

发表于 2014-4-20 10:34:11 | 显示全部楼层
楼主你好,在学习你的帖子

出0入0汤圆

发表于 2014-11-2 12:13:38 | 显示全部楼层
收藏,学习

出0入0汤圆

发表于 2014-11-7 17:58:06 | 显示全部楼层
认真的看了一遍,受益匪浅,继续看你其他的帖子

出0入0汤圆

 楼主| 发表于 2014-11-10 17:08:53 | 显示全部楼层
wk930523 发表于 2014-11-7 17:58
认真的看了一遍,受益匪浅,继续看你其他的帖子

我的博客里面写的更详细些,你可以关注一下!

出0入0汤圆

发表于 2014-11-10 18:15:41 | 显示全部楼层
xukai871105 发表于 2014-11-10 17:08
我的博客里面写的更详细些,你可以关注一下!

这几天陆续把你的帖子全都看了一遍,真是受益匪浅,很是敬佩楼主这样的开源精神和做事认真的态度。
现在已经对网络通信的过程有了一个大致的了解,开发板上例程的效果也看到了,下一步改一改程序深入研究一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 00:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表