MAC协议

MAC协议

  • MAC 头部(用于以太网协议)
  • IP 头部(用于 IP 协议)

首先,发送方将包的目的地,也就是要访问的服务器的 IP 地址写入 IP 头部中。这样一来,我们就知道这个包应该发往哪里,IP 协议就可以根据这一地址查找包的传输方向,从而找到下一个路由器的位置,也就是图中的路由器 R1。接下来,IP 协议会委托以太网协议将包传输过去。这时,IP 协议会查找下一个路由器的以太网地址(MAC 地址),并将这个地址写入 MAC 头部中。这样一来,以太网协议就知道要将这个包发到哪一个路由器上了。路由器中有一张 IP 协议的表,可根据这张表以及 IP 头部中记录的目的地信息查出接下来应该发往哪个路由器。为了将包发到下一个路由器,我们还需要查出下一个路由器的 MAC 地址,并记录到 MAC 头部中,大家可以理解为改写了 MAC 头部。这样,网络包就又被发往下一个节点了。

MAC(Medium Access Control)协议

MAC 地址是在网卡生产时写入 ROM 里的,只要将这个值读取出来写入 MAC 头部就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 0                   1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination |
+- -+
| Ethernet |
+- -+
| Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source |
+- -+
| Ethernet |
+- -+
| Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ethernet Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv6 |
+- -+
| header |
+- -+
| and |
+- -+
/ payload ... /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Destination Ethernet Address: 48 bits

    接收方 MAC 地址

  • Source Ethernet Address: 48 bits

    发送方 MAC 地址

  • Ethernet Type: 16 bits

    以太网类型。下面是一些常见的类型,一般在 TCP/IP 通信中只使用 0800 和 0806 这两种。

    • 0000-05DC:IEEE 802.3
    • 0800   :IP 协议
    • 0806   :ARP 协议
    • 86DD   : IPv6
parse_mac.jsview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function parseMAC(mac) {
let _readerIndex = 0;
let srcMac = [], dstMac = [], type;

for (let pos = 0; pos < 6; pos ++) dstMac.push(mac.readUInt8(_readerIndex++));
for (let pos = 0; pos < 6; pos ++) srcMac.push(mac.readUInt8(_readerIndex++));

type = mac.readUInt16BE(_readerIndex);

return {
srcMac: srcMac.map(v => v.toString(16)).join(':'),
dstMac: dstMac.map(v => v.toString(16)).join(':'),
type: type.toString(16)
}
}

console.log(parseMAC(Buffer.from('01005e7ffffa507b9d0bd1f40800', 'hex')));

ARP(Address Resolution Protocol)

  • 查看所有缓存

    1
    2
    3
    4
    5
    6
    $ arp -a 
    bogon (10.0.1.1) at c:51:1:e2:ab:64 on en0 ifscope [ethernet]
    bogon (10.0.1.5) at 68:ef:43:2c:7b:7e on en0 ifscope [ethernet]
    bogon (10.0.1.15) at 70:1c:e7:47:ef:50 on en0 ifscope [ethernet]
    localhost (10.0.1.255) at ff:ff:ff:ff:ff:ff on en0 ifscope [ethernet]
    ...
  • 查询指定网络接口的缓存

    1
    2
    3
    4
    5
    6
    7
    $ arp -i en0 -a
    bogon (10.0.1.1) at c:51:1:e2:ab:64 on en0 ifscope [ethernet]
    bogon (10.0.1.15) at 70:1c:e7:47:ef:50 on en0 ifscope [ethernet]
    localhost (10.0.1.255) at ff:ff:ff:ff:ff:ff on en0 ifscope [ethernet]
    ? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
    ? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet]
    ...
  • 查询指定主机的arp条目

    1
    $ arp -a 172.16.0.108
  • 删除指定主机的arp条目

    1
    2
    $ sudo arp -d 10.0.1.8
    10.0.1.8 (10.0.1.8) deleted
  • 设置指定主机与MAC地址的映射

    1
    $ arp -s 172.16.0.108 00:50:56:82:52:2c

参考

本站采用「署名 4.0 国际」进行许可。