您的位置:首页 > 理论基础 > 计算机网络

[Linux网络编程]以太网封装格式及相关结构体

2010-12-22 15:02 302 查看
木草山人声明:

本文非教学资料,不涉及理论。文章只是个人的一些笔记,其中的对与错,我不清楚,因为都是从书上、资料中学到的。虽然做过实践测试,但不保证100%正确。能力有限,错误难免,欢迎指正。

 

以太网MAC帧有两种标准,一种是IEEE的802.3标准,另外一种是以太网V2标准(注:来自《计算机网络》)。后者用得比较多。

不过,国外的书中找不到MAC帧这种说法,只说“以太网封装格式”。下面这张图片就是从《TCP/IP详解》中截图出来的。图片中的数字表示字节。一个IP数据包范围是46字节~1500字节,这是有根据的。

 



 

 

可以看到,IP包与ARP包是独立的,或者说它们下面的就是以太帧了。传输层(或以上)的各种数据包(报文)就是填充到上面那个图中的第2个框图的“IP数据报”的。

在Linux中,以太网帧头部的结构体如下:

/* 10Mb/s ethernet header */

struct ether_header

{

  u_int8_t  ether_dhost[ETH_ALEN]; /* destination eth addr */

  u_int8_t  ether_shost[ETH_ALEN]; /* source ether addr */

  u_int16_t ether_type;          /* packet type ID field */

} __attribute__ ((__packed__));

其中的ETH_ALEN为6,因为地址为6个字节,共48位——这个地址就是常说的物理地址,或MAC地址。它的第3个成员ether_type是以太帧类型,有如下这些:

/* Ethernet protocol ID's */

#define ETHERTYPE_PUP  0x0200          /* Xerox PUP */

#define ETHERTYPE_SPRITE 0x0500  /* Sprite */
#define ETHERTYPE_IP  0x0800  /* IP */

#define ETHERTYPE_ARP  0x0806  /* Address resolution */

#define ETHERTYPE_REVARP 0x8035  /* Reverse ARP */
#define ETHERTYPE_AT  0x809B  /* AppleTalk protocol */

#define ETHERTYPE_AARP  0x80F3  /* AppleTalk ARP */

#define ETHERTYPE_VLAN  0x8100  /* IEEE 802.1Q VLAN tagging */

#define ETHERTYPE_IPX  0x8137  /* IPX */

#define ETHERTYPE_IPV6  0x86dd  /* IP protocol version 6 */

#define ETHERTYPE_LOOPBACK 0x9000  /* used to test interfaces */

(注:上面2段代码片段来自<net/ethernet.h>)

加粗那三个对应着图上的那三个类型。

 

其实,对于打豆豆的人员来说,很多硬件相关、底层的东西我们是可以不去关注的。比如,上面的图,就是我们能看的到的,但那些数据包到了物理层,会额外加上8个字节,它是由硬件生成的,不用我们管。——一听到硬件实现、透明这些词,我们很兴奋!因为这些东西不用我们管,多好!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息