多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
既然谈到MAC地址,那就不得不说一下以太网帧结构了,每个网卡都有唯一一个物理地址,在硬件中进行数据帧传输的时候就必须有正确的目的物理地址,例如以太网的48位MAC地址就是存储在网卡内部存储器中。 以太网帧结构如图 10‑1所示: ![](https://box.kancloud.cn/81f5eb2c217ac153016a75c0b15ffc8d_753x148.png) 一看这个以太网帧结构,就觉得它有7个字段,但是事实上,前同步码与帧开始符字段不能算是真正的以太网帧数据结构,他们是在网卡发送的时候添加进去的,为了数据的准确传输。 以太网帧以一个7字节的前同步码(Preamble)字段开始。该前同步码的值都是10101010;而后紧接着一个字节的帧开始符,其值是10101011。前同步码字段的作用是实现物理层帧输入输出的同步,而帧开始符表示着以太网帧的开始,剩下的5个字段才是真正的以太网数据帧结构。 目标MAC地址(6字节):这个字段包含目标网卡的MAC地址,当一个网卡收到一个以太网数据帧,如果该数据帧的目标地址是网卡自身的MAC地址或者是MAC广播地址,它都将该帧的数据字段的内容传递给网络层;如果它收到了具有任何其他MAC地址的帧,则将该数据帧丢弃。 源MAC地址(6字节):这个字段包含了传输该帧到局域网上的适配器的MAC地址。 类型字段(2字节):类型字段允许以太网复用多种网络层协议。为了理解这点,我们需要记住主机能够使用除了IP以外的其他网络层协议。事实上,一台给定的主机可以支持多种网络层协议,以对不同的应用采用不同的协议。因此,当以太网帧到达网卡中,网卡需要知道它应该将数据字段的内容传递给哪个网络层协议。如IP协议、ARP协议等。 注意了:当这个字段的值小于1518时,它表示后面数据字段的数据长度,当大于1518的时候才表示递交给哪个协议。 数据字段(46~1500字节):这个字段承载了IP数据报。以太网的最大传输单元(MTU)是1500字节。这意味着如果IP数据报超过了1500字节,则主机必须将该数据报分片(关于分片会在后续讲解)。数据字段的最小长度是46字节,这意味着如果IP数据报小于46字节,数据报必须被填充到46字节。当采用填充时,传递到网络层的数据包括IP数据报和填充部分,网络层使用IP数据报首部中的长度字段来去除填充部分。 CRC(4字节):CRC字段包含了以太网的差错校验信息。 在以太网帧中,目标MAC地址可以分成三类,单播地址、多播地址和广播地址。单播地址通常是与某个网卡的MAC地址对应,它要求以太网第一个字节的bit0(最先发出去的位)必须是0;而多播地址则要求第一个字节的bit0为1,这样子多播地址就不会与任何网卡的MAC地址相同,可以被多个网卡同时接收;广播地址的48位MAC地址全为1,也就是FF-FF-FF-FF-FF-FF, 同一局域网内的所有网卡都会收到广播的数据包。 所有的以太网计算都向网络层提供不可靠的无连接服务,也就是说在网卡发送数据的时候,不会向目标网卡进行事先的通知(握手),网卡只在以太网帧中封装好来自上层的数据报,然后把数据报发送到局域网上。同样的当一个网卡接收一个以太网数据帧的时候,它也不会进行回复确认,如果当网卡执行CRC校验不通过的时候,它也不会发送否定确认,这样子当一些以太网帧不通过CRC校验时,网卡只是将其丢弃,而发送的一方就不会知道它传输的数据是否达到并且通过校验。