网络协议栈8:connect()函数之前之以太网首部

IP(网络层)下传的数据就传输到了链路层,对于我们常用的设备来说,这个层次最主要的设备,就是网卡了,完整的称号是以太网卡,因为网卡有多种格式的,而我们常见到的是以太网卡。

以太网的首部如下:

 

数据结构如下

struct ethhdr {

  unsigned char       h_dest[ETH_ALEN]; /*目标MAC地址*/

  unsigned char       h_source[ETH_ALEN];  /* MAC地址*/

  unsigned short  h_proto;       /*帧中数据协议类型*/

};

其中成员h_proto可以使用的数据

#define ETH_P_LOOP   0x0060        /* Ethernet Loopback packet    */

#define ETH_P_ECHO   0x0200        /* Ethernet Echo packet      */

#define ETH_P_PUP 0x0400        /* Xerox PUP packet        */

#define ETH_P_IP    0x0800        /* Internet Protocol packet */

#define ETH_P_ARP 0x0806        /* Address Resolution packet  */

#define ETH_P_RARP      0x8035      /* Reverse Addr Res packet    */

#define ETH_P_X25 0x0805        /* CCITT X.25          */

#define ETH_P_ATALK 0x809B        /* Appletalk DDP     */

#define ETH_P_IPX 0x8137        /* IPX over DIX           */

#define ETH_P_802_3 0x0001        /* Dummy type for 802.3 frames  */

#define ETH_P_AX25   0x0002        /* Dummy protocol id for AX.25  */

#define ETH_P_ALL 0x0003        /* Every packet (be careful!!!) */

#define ETH_P_802_2 0x0004        /* 802.2 frames      */

#define ETH_P_SNAP   0x0005        /* Internal only       */

 

 

这里的首部类型涉及到802.3帧和以太网帧的区分,就是长度跟类型字段的区别。

 

 

网卡发送数据,就是通过IP地址的ARP转换之后得到的目的端的MAC地址,作为唯一的目的地址发送的,但是此时的目的地址并不一定就是我们在指定的最终的地址,而是有可能是整个网路中下一个路由的MAC地址,只有整个网路都走完了,到达了最后的目的地址了,这是的MAC地址才是我们指定的目的IP所对应的MAC地址。在整个网路的传输过程中,路由器还会频繁的使用的ARP/RARP协议查找下一站的MAC地址,直到把数据传输到目的地址,或者把数据扔掉。

posted on 2012-01-08 11:41  image eye  阅读(1290)  评论(0编辑  收藏  举报