TCP/IP学习笔记二:地址解析协议ARP 数据格式

来源:互联网 发布:小金口网络问政 编辑:程序博客网 时间:2024/05/17 21:44
      要了解ARP,看名字与功能就可以了,但是,作为研究的技术人员,还要了解它具体的工作原理,即如何在产品中应用,尤其是嵌入式产品,往往对硬件成本要求较高,但又要有联网的功能。因此,了解底的联网的知识很有必要。这里,我主要学习一下以太网,TCP/IP是必要学习的基础,当然只是学习其中比较关心的与底层的,软件在硬件之上运行,其实软件也是硬件的种。软件与硬件的结合点,其实只是换了一种观念。在键盘上打字或是声控或是其他方式的所谓软件与硬件的互动,其实,都是在操作硬件,硬件抽象一点,就是软件。
       硬件有了保存电压的东西,就有了存储器。有了存储器,就可以存指令了。有了指令,就是软件了。以上是自己对软件硬件的一种粗浅的认识。因为要学习以太网,往往跟自己画的什么网络变压器,RJ45什么的想到一起,也就是,有了硬件,还需要进一步用软件的方式去实现通讯。为了可靠与快速的多机通讯,就有了约束,有了章法,于是有了互联的协议。大家都按这个规定或是规范去办事,就可以有效率的办事。
      ARP的数据格式,详细的请查看《TCP/IP详解卷一》,那里有专门的章节介绍ARP等,网络上搜索了一下,找到了如下的图片,不错,非常的直观。
 


 


光文字不行,有图片,那就好理解了。
以太网的头部:Header。怪不得开始看Uip的代码时,对缩小的字母hdr不理解,原来是头的意思,源码如下:

struct arp_hdr {
  struct uip_eth_hdr ethhdr;
  u16_t hwtype;  //硬件类型
  u16_t protocol;   //协议类型
  u8_t hwlen; //硬件地址长度
  u8_t protolen;  // 协议地址长度
  u16_t opcode; //操作字段
  struct uip_eth_addr shwaddr;   //发送方的硬件地址:MAC
  u16_t sipaddr[2];    //发送方的IP地址
  struct uip_eth_addr dhwaddr;   //接收方的硬件地址:MAC
  u16_t dipaddr[2];     //接收方的IP地址
};

其实以上的定义,在uip中,应该算是整个arp的数据结构。


硬件类型字段:指明了发送方想知道的硬件接口类型,以太网的值为1;
协议类型字段:指明了发送方提供的高层协议类型,IP为0800(16进制);
硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;
操作字段:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;
发送方的硬件地址:(0-2字节):源主机硬件地址的前3个字节;
                           (3-5字节):源主机硬件地址的后3个字节;
发送方IP协议地址:(0-1字节):源主机硬件地址的前2个字节;
                           (2-3字节):源主机硬件地址的后2个字节;
目的方的硬件地址   (0-1字节):目的主机硬件地址的前2个字节;
                           (2-5字节):目的主机硬件地址的后4个字节;
目的方IP协议地址:(0-1字节):目的主机的IP地址
前2个字节 
                           (2-3字节):目的主机的IP地址后2个字节 。 


hd就是头Header 的意思了。看来自己真的知识太浅,理解力太差了。


上面arp的头,我看得头大,还得慢慢一步步来理解。看看以太网的头是什么?


/**
* The Ethernet header.
*/
struct uip_eth_hdr {
  struct uip_eth_addr dest;   //目标地址
  struct uip_eth_addr src;    //源地址,找别人,也得报上自己的名字。
  u16_t type;    //帧类型 ARP 为:0x0806
};

uip_eth_addr是什么格式的?IP格式的吗?继续查看如下:


/**
* Representation of a 48-bit Ethernet address.
*/
struct uip_eth_addr {
  u8_t addr[6];
};
6个字节,48位。搞了半天,是一个48位硬件地址,我一般称为MAC地址。 


以下就是网络类型的定义。

#define UIP_ETHTYPE_ARP 0x0806   //现在开始了解ARP
#define UIP_ETHTYPE_IP  0x0800   //IPV4 常用的。
#define UIP_ETHTYPE_IP6 0x86dd  //这个不常见,基本不用,可能以后物联网了,所有东西都要联网,手机PDA等等之类的,就要用它了。




以太网的头,明白了很多。ARP呢?好好学习。继续。

0 0
原创粉丝点击