让我们从整个协议最底层开始,先来看看数据链路层主要都做了哪些事:
首先上面两台电脑需要通信,先将它们物理连接起来,然后就可以传送高低电位了,高电位表示1,低电位表示0。但是单纯的0和1没有任何的意义,我们必须人为的规定解读方式,比如:多少个0和1作为一组信号?每个信号位有什么含义?……
还记得不?我们前面说过互联网早期的时候好多公司都有自己的网络协议。但是最后逐渐被“以太网”占据了主导地位,以太网规定,一组电信号构成一个数据包,叫做“帧”。每一帧分为两个部分:标头(Head)和数据(Data)。
“标头”包含数据包的一些说明项,比如发送者(源物理地址)、接受者(目的物理地址)、数据类型、CRC校验码等等。”数据”则是数据包的具体内容。具体的帧结构如下图所示:
“标头”的长度,固定为18字节(6+6+2+4=18)。”数据”的长度,最短为46字节,最长为1500字节(MTU Maximum Transmission Unit 最大传输单元)。因此,整个”帧”最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送。你可以使用ifconfig命令来查看自己网卡的MTU,下图是我的网卡情况。
从上面“帧”的结构中可以看到,“标头”包含了“源物理地址”和“目的物理地址”,其实这就是我们常说的MAC地址。以太网规定,连入网络的所有设备,都必须具有”网卡”接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做MAC地址。
每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。(同样,ifconfig命令就可以查看网卡的MAC地址,上张截图中有我的网卡MAC地址,你找找看)
当然,现在有了地址也只是第一步,可是我的网卡怎么会知道你网卡的MAC地址呢?
答:有一种ARP协议,可以解决这个问题。这个留到后面再说,这里只需要知道,以太网数据包必须知道接收方的MAC地址,然后才能发送。
其次,就算有了MAC地址,系统怎样才能把数据包准确送到接收方?
答:以太网采用了一种很”原始”的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。
上图中,1号计算机向2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会收到这个包。它们读取这个包的”标头”,找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做”广播”(broadcasting)。
现在,我们假设全球的电脑都是用网线直接相连的,那有了数据包的定义(帧)、网卡的MAC地址、广播的发送方式。只要知道目的MAC地址我们就可以实现给世界各地任何电脑发送数据了。比如A可以直接广播B网卡的MAC地址大胆表白,发送“我爱B”,然后全球所有的网卡都会收到这条消息,但是只有B的网卡才会接受这条消息,也就是“我只爱B”,是不是很浪漫,没毛病。
好,回过头来看看,我们现在已经从两台网线直接相连的电脑发展到全球电脑都能通信了,真棒!那请你思考下广播的这种方式到底合适吗?请将自己的想法评论在下面。