文章

数据链路层

计算机网络整体梳理了比较宏观的只是,但是在一些问题上还是让人有很多问号。比如为什么数据链路层要使用广播发消息、为什么最小报文得是64Byte。

本以为数据链路层没什么太多好说的,但细细一看,东西还挺多,而且还挺关键。

  1. 为什么局域网要使用广播
  2. NIC
  3. 为什么最小帧是64B
  4. 到底什么是Ethernet
    1. 集线器hub - 物理层上扩大以太网
    2. 网桥bridge、交换机switch - 数据链路层上扩大以太网
    3. 超高速以太网
    4. 以太网的认证 - PPPoE
  5. 感想

为什么局域网要使用广播

首先强调一点,我理解的广播有两个:

  1. 第一个就是物理上的广播,是局域网的基本通信方式,描述的是一种物理层面的非常底层的通信方式;
  2. 第二个是逻辑上的广播,是和单播、多播的概念相并列的。有数据链路层的广播,甚至路由器也有广播的方式和别的路由器通信,这都是逻辑上的广播;

首先说物理上的广播:局域网采用广播的机制发送消息,一台主机发送数据,消息在总线上传播,所有其他主机在总线上的接口都会收到这个数据。因为广播对于发送者来说是很简单的,发出去就行了,压力很小。而且整个网络的搭建会很简单,维护成本低。之所以能这么搞,因为局域网范围很小,仅仅是一个局域内的,所以主机很少。Internet上就不能这么通信,要不然网络就炸了。

再说逻辑上的广播:以太网的基本通信方式就是使用物理上的广播把数据传播出去。所以一台主机的网卡会收到局域网内的所有mac帧。在收到帧之后,网卡会判断目的mac地址是不是自己,如果不是自己,就丢弃帧。所以只有目的网卡会收到帧,解析其内容。从逻辑上来看,这就相当于是源主机和目的主机的一对一通信,所以叫单播。也就是说局域网通过物理广播这一方式实现了逻辑上的单播。而和单播相对应的逻辑上的广播,则是指帧的目的mac地址写的全F,代表任何网卡都可以收。此时物理上用的是广播传播帧,逻辑上也是“广播”的概念,因为大家都收到了。

NIC

Network Interface Card,网卡,也叫适配器adapter。其实现在电脑的主板上不再插入单独的网卡,直接嵌入适配器,所以叫适配器更准确。

适配器上本身有处理器和存储器(RAM、ROM),和局域网的通信是以串行方式传输的。适配器和计算机之间的通信时通过主板上的IO总线并行传输的。所以适配器的功能就是进行串行和并行的转换。而且由于二者的数据率不同,适配器还要有缓存,对数据进行存储。

电脑告诉适配器:

  • 从存储器什么位置把多少数据发到局域网;
  • 在存储器什么位置存下你从局域网上收到的数据;

适配器工作在物理层 + 数据链路层,但不负责网络层(IP数据报):

  1. adapter收发帧不需要计算机的CPU
  2. adapter收到差错的帧直接丢掉,不需要计算机处理(所以局域网主机太多,过多的广播应该对其他主机构不成压力,更大的缺点是对总线的占用)
  3. adapter收到正确的帧,通过中断通知计算机,并交付到网络层;
  4. 计算机发送IP数据报时,把IP数据报交给适配器,组装成mac帧;

适配器的地址MAC地址就焊在它的ROM里。计算机的逻辑地址IP地址存储在计算机里。所以adapter处理不了网络层的内容。

NIC还有一种特殊的 混杂模式(promiscuous mode),所有收到的mac帧都收了,不管目的mac地址是不是自己的。有种监听的感觉。但是给人的感觉更像是debug模式,使用这种模式理解网络中的协议很有用。

为什么最小帧是64B

规定,最小mac帧是64B。但规定总得有个缘由吧,科学是有迹可循的,不能一拍脑袋就随便说个数。

首先看看以太网用的是协议:CSMA/CD,Carrier Sense multiple Access with Collision Detection,带有碰撞检测的载波监听多接入。

明显有两个要点:

  1. 碰撞检测;
  2. 载波监听多接入;

在以太网上,大家都是连在一根总线上,如果有一台主机在发数据,同时另一台也发,那数据就在总线上叠加了,或者说“碰撞了”。也就是说,当一台主机发数据的时候,总线资源相当于是被占用的,别人不能用。怎么保证只有一个人在用?

分批次用是一种办法:比如分时。这一秒我用,下一秒你用。如果下一秒你不需要用呢?那这一秒就浪费了。既然分时,就得有个协调者,协调者让谁用,谁才能用,就像红绿灯一样。

也可以没有协调者,谁想用谁用。但是一旦发现有人在用,那自己立刻退出,不再试图占用了。这样就不需要协调者的角色存在,网络就会很简单。

那怎么知道有人在用?首先,主机发消息之前检测一下信道,是不是有人在用。只有没人用,自己才尝试去用。但检测的时候没人用,并不能保证接下来用的时候一定没人用。假设总线上有两台主机,a发送数据,到达b的时间是t,那a最晚什么时候知道发生碰撞了?当a的数据刚好要到达b,b此时发了个数据,发生了碰撞,此时碰撞时间最晚。然后碰撞信号返回,又经过t的时间到达a,此时a知道发生碰撞了。也就是最迟需要2t的时间。这个时间就叫做争用期Contention Period。只有在争用期内,以太网是可能发生争用发生碰撞的。如果争用期内还没有碰撞,那就不会再有碰撞了。因为这时候b再想发数据,去检查信道的时候肯定会发现已经有人在用,就不会再发了。

如果主机发了数据,却又不知道有没有发生碰撞,那主机是没办法决定要不要继续发下一个帧的。怎么才能让主机确切知道这个帧有没有发送成功呢?如果一个帧比较大,大到在争用期内无法发送完,那么这个帧要么还没发完就碰撞了,此时主机会终止帧的发送;要么发完了还没有碰撞,此时主机就知道不会再碰撞了,也就是帧一定是发送成功了。

没发完的不完整的帧会被接收者丢弃,相当于没发。

现在根据最小帧为64 byte这一规定倒推一下:

  1. 已知电磁波在总线上的传播速率是光速的2/3,也就是2*10^8 m/s;
  2. 已知当时的网速是10Mb/s;
  3. 64B数据也就是512bit,发送完需要51.2微秒;
  4. 所以当时的争用期规定的是51.2微秒,从a到b一来一回的时间;

根据争用期倒推a和b的距离:

\frac{5.12 \times 10 ^{-5}}{2} \times (2 \times 10^8) = 5120m

也就是说,当时认为,局域网内a和b的距离最大为5km左右,不能再大了。正是根据这个假定,给出了帧最小为64 byte这一规定。

给出最小帧长度,就是为了一整个帧不能在争用期内发完。

  • 如果a和b再远一些,争用期会再延长,此时64 byte发完了还不知道是否能发生碰撞。所以a和b不能更远了;
  • 如果网速变快了,那相当于发送帧的时间变短了,此时帧岂不是又能在争用期内发送完了?是的。所以如果网速变快了,理论上最小帧大小也要变大;

所以想使用CSMA/CD这个协议,就一定要有最小帧这一限制。

但是因为总线上可能有集线器、交换机之类的东西,转发数据的时候会额外消耗时间,所以一般最大距离都不能达到5km。

到底什么是Ethernet

说了半天,到底什么是以太网?

以太网基本是局域网的代名词。但我觉得随着网络的发展,再这么认为就有失偏颇了。

以前,以太网是局域网的布网形式之一,基本就是一根总线,上面接入了多个主机。就像鱼骨架一样,一根主骨,一堆分叉,每个分叉一个主机。因为以太网使用CSMA/CD,允许主机随机接入(想发消息就发,如果检测到冲突了就先不急着发),比令牌环形式的局域网(受控接入)之类的要高效,所以以太网形式的局域网就占据了主流。

以太网的两大特点:

  1. 使用CSMA/CD;
  2. 使用mac帧;

直到现在,局域网也是以以太网的形式存在的。所以以太网基本就是局域网的代名词。

集线器hub - 物理层上扩大以太网

后来以太网不用一根总线了,改成了星型结构,中间是一个集线器。集线器有一堆插口,每个口可以插一个主机。插口和主机之间使用RJ-45接头,也就是现在的网线接头。插线内部则是有两根线组成,分别负责发送和接收。

集线器使用电子器件模拟电缆工作,所以虽然是星型的,逻辑上还是总线网,主机共享逻辑上的总线,使用CSMA/CD。

集线器是物理层的,每个接口就是转发bit,收一个转发一个。

集线器可以把多个局域网连起来,变成一个大局域网。但大局域网主机变多了,问题就来了:广播发送数据的方式导致的碰撞也变多了。用术语就是碰撞域collision domain变大了。

所以这样一来,通信效率就变低了。

网桥bridge、交换机switch - 数据链路层上扩大以太网

网桥工作在数据链路层,为什么说它工作在数据链路层?当然是因为它操作数据链路层的协议——mac帧。

它的一个端口收到帧之后,先判断目的mac帧的地址,如果在本网段,就不往其他端口转发(转发到其他网段)了。所以网桥能隔离碰撞域

网桥怎么判断帧的目的地是不是在本网段?通过转发表。转发表就两个字段:mac地址、端口。代表主机在哪个端口。收到一个帧,如果目的mac地址匹配,就发到对应的端口。

一开始转发表是白板:

  1. 网桥的一个端口收到一个帧,根据帧的source mac记下这个主机在这个端口;
  2. 查目的mac在哪儿,因为现在还是白板,所以没查到,就向所有端口转发;
  3. 就这样,随着收到的帧增多,网桥记下了所有的主机对应的端口;
  4. 此时再有帧过来,就可以根据mac地址转往主机所在的端口了;

非常简单。网桥一般是两个接口,连接两个网段。交换机就是有好多口的网桥。

交换机隔离冲突域,但不隔离广播域。广播报文(mac帧目的地址为全F)还是会转发给交换机各个接口上的网段。

路由器隔离广播域

交换机一般一个接口只接一个主机,所以一个主机是一个冲突域,也就是说没有任何两个主机会相互冲突!两台主机通信的时候,就像独占主线一样,可以进行无碰撞的传输。而主机和网桥之间的连线如果用双股线,是可同时收发数据的,所以交换机上的任意两个机器都可以进行全双工通信。所以交换机最大的优点是相当于给整个网络的带宽扩容了,N对口相当于让原有网络带宽翻了N倍。

超高速以太网

有了交换机,CSMA/CD实际上再也检测不到碰撞了,所以 交换机连接的全双工模式的以太网不再需要使用CSMA/CD协议了。但它依然还叫以太网,因为所用的帧还是mac帧。

仅仅是全双工模式下可以不使用CSMA/CD!假设主机和交换机间的连线里只有一股线既用作收数据,又用作发数据,相当于a和b两台主机还是像总线以太网一样,会发生碰撞,所以还需要使用CSMA/CD。

由于材质改变,以太网传输速度不再是10Mb/s了,出现了100Mb/s,甚至千兆网,万兆网。上文说过,在使用CSMA/CD的情况下,网速变快了,要么主机间记录得缩短,要么最小帧不能再是64byte了,得增大。

100Mb/s网络的以太网选择保持最短帧长不变,缩短主机的最大间距。10Mb/s时最大距离不到5km,假设是1km。现在100Mb/s速度提升十倍,间距需要缩短为1/10,即最大长度是100m。

那千兆网呢?最短距离是10m?这就不现实了。所以千兆网选择增加最小帧长度了吗?没有!如果最大距离继续维持百兆网的100m,那千兆网的最小帧长度需要变成640 byte,发送短数据开销就太大了。假设只发送10byte有效数据,岂不是要填充600多byte无意义数据!所以千兆网增加了 分组突发packet bursting,一次一个接一个发一组mac帧,直到他们达到了1500 byte。这样逻辑上像是发了一个大号的帧。

相当于用了trick来维持原来的最小帧长度不变。

但是,以上都是在使用CSMA/CD的情况下才需要考虑的问题。如果使用全双工通信,就不需要使用CSMA/CD了,也就没有缩短距离或者增加最小帧长度的顾虑了。

所以在万兆网上,直接完全使用全双工,完全抛弃CSMA/CD,完全不用考虑传输距离了

这么一来,神奇的事情发生了——以太网不需要有距离限制了!可以部署几十上百公里的以太网了!现在以太网这种布网模式也可以用来部署广域网了。

以太网因为CSMA/CD,只能是距离比较近的局域网。现在超高速以太网弃用了CSMA/CD,也就没有距离必须近的限制了。

以太网是局域网的代名词啊!现在它可以被用来部署广域网了……哈哈哈……

以太网的认证 - PPPoE

以前以太网是用来部署局域网的,没什么需要认证的。所以以太网的帧格式mac帧根本没有认证相关的东西。

但现在以太网可以部署广域网了,这头是你的电脑,那头是ISP,你得交钱之后ISP才会把你的流量包放入Internet。而且ISP还要按照你发送的包的多少收你的钱。但你们俩在以太网上,用mac帧交流,mac帧没有用户名和密码信息,ISP怎么知道这个帧这是你发过来的?不知道你发了多少帧过来,怎么给你计费?

An ISP is your gateway to the Internet and everything else you can do online,翻译过来就是ISP是你和互联网之间的拦路虎,要想从此过,留下买路财!

  • https://whatismyipaddress.com/isp

但ISP也不容易,毕竟人家花了钱帮你办事儿了,收点儿钱也是应该的:

not everyone can be an ISP. It takes money, infrastructure, and a lot of very smart technicians. Your ISP maintains miles of cabling, employs hundreds of technicians, and maintains network services for its hundreds of thousands of subscribers. Depending on where you live, you typically have a choice of ISPs.

所以怎么办,拓展mac帧协议,加用户名、密码相关的字段?不行,这样就破坏了协议的兼容性。而且局域网里的mac帧也压根不需要这些东西。

如果对网络分层的概念理解深刻,显而易见这里最好的做法是使用mac帧封装一个帧,新的帧协议里带有用户名和密码用于认证。就像mac帧封装ip报文,ip报文封装tcp一样。而数据链路层有一个现成的协议,带有用户名和密码认证,那就是PPP(Point to Point Protocol)。而且更方便的是,ISP那边的数据链路层设备本身就是支持PPP认证的,所以现在mac帧封装PPP帧,到了ISP那边把mac帧剥掉,直接就能进行PPP认证了,可以复用之前的认证逻辑,非常省事儿。

这就是PPPoE,Point to Point Protocol over Ethernet。

PPP认证成功之后,ISP会分配一个IP给主机,接下来就可以上网了,没PPP什么事儿了。

那么为什么之前ISP会支持PPP呢?因为之前电话线上网,需要和ISP建立连接,用的就是PPP协议。

A PPP connection exists when two systems physically connect through a telephone line.

总结起来,就是因为交换机和全双工网线,以太网不需要再使用CSMA/CD协议了,所以以太网不再有距离限制了,所以以太网可以用来部署广域网了,所以以太网需要有认证功能了,所以mac帧需要封装PPP,也就是PPPoE。

感想

看上层的东西比较容易理解,有时候不需要太深究底层。但一旦明白了底层的东西,就会有一种恍然大悟的感觉,会对上层的理解更透彻,记忆也更深刻。

本文由作者按照 CC BY 4.0 进行授权