网络协议栈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地址,直到把数据传输到目的地址,或者把数据扔掉。