计算机网络-数据链路层复习笔记
Table of Contents
数据链路层概述 #
术语 #
结点 #
数据链路层完成物理链路上的传输。它不理解网络层及以上的东西。所以主机和路由器对数据链路层来说都直接统称为“机器”即可。这里文雅一点,称为结点。
链路 #
链路就是连接相邻结点的信道。因此只要能传输比特,就可以称为链路。
因此,链路可以是有线的或者无线的。
链路层服务 #
成帧 #
对IP数据报加头(主要包含MAC地址)加尾(主要包括差错编码信息)。注意这里的差错编码信息和网络层及以上使用的校验和不是一种东西。
帧同步 #
帧就是比特流。如何从连续的比特流中识别出一个帧一个帧的,就是帧同步要解决的问题。例如使用带填充转义的帧定界符。
介质访问控制 #
共享通信介质的使用权管理。判断数据是否发生冲突。
可靠传输问题(仅限相邻节点间) #
6大协议。和传输层的协议一样。可靠传输主要用于误码率高的链路上的传输。例如无线链路。至于有线链路则显然没有必要。
流量控制 #
如题。
差错检测和差错纠正 #
对于很多链路层协议,虽然不保证可靠传输,但是一定能保证差错检测。
差错检测主要应对衰减与噪声。解决方式是丢弃或重传,视协议而定。
全双工与半双工通信控制 #
实现全双工和半双工通信。
链路层实现 #
载体 #
由网络接口卡(NIC)实现。
具体工作 #
主要是实现网卡和网卡之间的通信。
差错编码和校验和 #
差错编码的原理 #
在原来的01编码上额外增加冗余信息,使得本来相互独立的位之间产生了关联。
发送方以某种方式计算此冗余信息,接收方以完全相同的方式计算冗余信息。如果这两个冗余信息相等,则可以认为是没有发生差错。
差错编码不一定百分之百可靠。如果出错了,但是又检测不出来,则说明它错的一塌糊涂。
编码集的汉明距离 #
两个码字,它们之间的不同二进制位数称为汉明距离。
编码集的汉明距离即这个编码集中,出现的汉明距离的最小值。
汉明距离和编码集的自检错能力 #
如果某种编码集的汉明距离是r+1,则此编码集可以自动检测r位的差错。假设一个码字,其中错了r位,则此时此码字与上一有效编码的距离是r,与下一有效编码的距离是1,而且其实只要这个错的位数>1,就能断定它是从上一有效码字突变而来,因此可以顺利完成检错。例如,对于BCD,其汉明距离是1,则如果不加其他冗余位对其进行检错,则其不可能自己检查出自己的错误,因为1-1=0.此时如果加入冗余位,则可以让汉明距离+1,则可以保证100%地检查出错误。(因为如果只错1位,则不符合编码的汉明距离了:因为不存在和其他码字汉明距离为1的该编码集中的有效编码。)
汉明距离和编码集的自纠错能力 #
如果某种编码的汉明距离是2r+1,则此编码集可以自动纠错r位的错误。假设一个码字,其中错了r位,则它距离上一有效码字的距离是r,距离下一有效码字的距离是r+1,则由于它距离上一有效码字更近,故它应该本来是上一码字,即完成了纠错。即:所谓纠错,就是把它纠错到与它距离最近的有效码字。这也是根据概率得出的结论。
都是基于概率最大化原则 #
无论是纠错码还是检错码,它们都是基于概率最大化原则。不排除真的错的一塌糊涂,使得出错位数直接超出检错范围r或纠错范围r。那是真没办法。
因此,没有100%纠错检错的校验码,只有100%纠错检错特定位数的校验码。
Internet校验和(Checksum) #
Internet校验和常用于IP、UDP、TCP等封装校验。
发送端 #
- 如果是对封装结构检验,则将checksum字段置0.
- 将待校验的数据按2字节为一组,得到若干个2字节大小的整数。
- 将这些整数按补码相加。
- 相加产生了很多进位。把这些进位再加到最低位。(实际操作中是,上述那些2字节整数的相加结果是4字节整数。此时把它的高2字节加到这个4字节整数的低位上去。)
- 将这个4字节整数取反,即checksum。
接收端 #
将收到的封装结构按同样的方式(分割成若干2B整数,补码相加,再加高位的2B),拿到新的checksum。如果此checksum是0,则说明收到了正确的数据。
原理:接收方收到的封装结构中,checksum字段不是0,而是正确的checksum的反码。如果我们此封装结构写成“封装结构(checksum=0)+checksum”的形式,然后只对封装结构(checksum=0)部分计算checksum,然后再加上老checksum,则如果传输正确则结果为0,因为这意味着新checksum=老checksum。(在假设封装结构的checksum置0了的情况下)。
循环冗余校验码 CRC #
检错能力比Internet校验和更加强大,可以实现99%+;假设CRC的长度为r位,则可以检测r+1位差错。由于只需要简单的XOR即可实现,硬件实现简单,所以广泛应用于低层设备。CRC的长度不受待校验数据长度的限制,可以使用定长CRC,因此如果待校验数据比较长,那么就相当于CRC的编码效率非常高。但是无论如何,请注意,CRC只能校验最多同时它长度+1处位错误。
编码模式 #
<D,R>,其中D是待检错数据,R是CRC,位数是r;再定义一个生成模式G,其位数是r+1.生成模式G为发送方和接收方所共同持有。
若满足关系<D,R> XOR G=0,即说明数据没有出现差错。注意,XOR又称为“摩尔除”,因此经常用除法去表示CRC的计算过程。
编码模式(数学表示) #
即:需要满足:
(D<<r)^R=n*G.//被G整除
即(D<<r)=n*G&R//&和^是相反运算。
(D<<r)/(n*G)=1&R
(D<<r)/(n*G)=R.
即:原始数据左移CRC的长度位,为CRC留出空间,然后除G,其余数就是CRC,然后把之前空出来的0用CRC代替即可得到带有CRC校验的原数据编码。
发送方如何利用CRC算法得到CRC #
利用上述推导:<D,0>^G=R.
接收方如何利用CRC算法校验数据 #
利用本身的性质:<D,R>^G=0.
多路访问控制协议 MAC #
如何协调广播链路的发送 #
链路通常分为两类,点对点链路和广播链路。前者例如打电话。后者例如早期总线式以太网、802.11、甚至是开Party大家共享空气链路。
干扰问题 #
如果两个信号源同时在广播链路里发送,则信号混浊了。不能用了。这时候接收方接收的信号是多个信号的混合。通信失败。
分布式算法 #
结点本身就可以做出决策。不需要中心结点为大家做协调。体现在这里,就是每个结点都可以根据信道状态自行对是否要发送信号做出正确的决策。即:不需要外部控制信道来控制大家的行为!
算法设计期望 #
- 大家可以平分链路带宽。(如果只有一人发送,那么就占有全部带宽。)
- 使用分布式算法。无需统一的时钟或信号控制。
MAC协议分类 #
分类 | 解释 |
---|---|
信道划分MAC协议 | 即信道的多路复用。由于信道被预先划分,所以不会产生数据冲突。例如TDMA,FDMA,CDMA,WDMA。 |
随机访问MAC协议 | 信道不是预先硬分配,而是大家随时使用全部带宽。允许发生冲突。由于允许冲突,所以有冲突的恢复机制。 |
轮转访问MAC协议 | 信道被轮流使用(使用全部带宽)。 |
信道划分MAC协议 #
当网络负载重,共享信道效率高,而且非常公平。因此有线电视网络彩绘使用这种协议。
当网络负载轻,效率非常低下。
TDMA 时间划分多路访问 Time Division Multiple Access #
规定周期,每个周期由若干等长的时间片连续构成。每个时间片对应一个主人。这个主人如果要发送信息,则只能等到当前轮到了它对应的时间片再发送。发送的时间长度只能局限在此时间片长度中。
问题:效率低。存在未使用时间片。浪费。
FDMA 频带划分多路访问 Frequency Division Multiple Access #
把信道的不同频带作为链路。所有发送方都把自己的信号调制到各自对应频率,占用各自的频带进行发送。
问题:效率低。如果某些时间发送方不发送,频带也没空出来。
例子:有线电视。
随机访问MAC协议的特点 #
当负载轻时,由于可以随机访问,所以信道效率高。
但是负载重的时候,会产生冲突浪费。
信道划分MAC协议能完全保证不发生冲突,因为发送方发送的信道或时机等等问题都被预先规定得死死的,大家都遵循规定好的规则去办事。
但是信道划分MAC的效率很低,因为这种规则是死规则,没有任何变通的可能性。因此只要某些发送方一刻停止占用其信道,这个信道就浪费一刻。
随机访问MAC协议中,没有人去为这些结点进行协调,所以大家发送的时候不知道链路状态。这是损人不利己的,从而导致大家的信息都混为一谈,全部废弃。
由于发生冲突属于家常便饭,所以随机访问MAC协议的重点在于发现冲突和恢复冲突。
时间槽Slot的 ALOHA协议 #
Slot ALOHA的前提 #
时间被划分成等长的Slot。
数据帧大小相等——确保大家占用信道的时间一致,且保证Slot所能传输的数据长度就是一个帧的长度。
只能在每个Slot开始的瞬间发送——由于Slot的时间间隔本身就只够一个帧发出去的,所以必须从头开始利用时间。除了每个Slot开始瞬间以外,其他时刻都不允许发送帧。
每个结点之间时钟同步——显然。
Slot ALOHA冲突 #
冲突发生在当两个结点同时抢占一个Slot进行发送时。
Slot ALOHA冲突检测 #
发送方会等待接收方的ACK。如果没有收到ACK,则说明本次发生遇到了冲突。
Slot ALOHA帧发送 #
如果某发送方当前有待发送的帧,则将在下一个Slot立即发送。如果发生冲突,则有p的几率在下一帧继续发送。
即:只有第一次发送是100%,之后都是p几率抛硬币发送。
Slot ALOHA的缺点 #
存在空闲Slot问题;并不能理智地检测信道情况;必须要求时钟同步。
Slot ALOHA的效率分析 #
对Np(1-p)^(n-1)求最大值,并使N趋近于无穷,可知最大值是1/e=0.37.即:信道被成功利用的时间只是全部时间的37%。
纯ALOHA协议 #
纯ALOHA协议是不带时间槽的协议。因此它不需要时钟同步了。
纯ALOHA只要在发送站有数据帧要发送时,就会不管三七二十一立即发送!由此可以想象到:它的效率会更低,因为整个系统变得无序起来。事实上,纯ALOHA协议的效率是Slot ALOHA的一半。
纯ALOHA的易损时间区 #
假设某发送站打算在t0时刻发送数据帧,则如果在(t0-1,t0+1)时间段内有其他发送站发送了数据帧,则必然产生冲突。事实上,如果假设纯ALOHA的帧长度和Slot ALOHA一样,则这个易损时间区的长度就是2倍的Slot ALOHA中的Slot。
纯ALOHA的效率 #
由于只有在相当于2倍的Slot ALOHA的Slot时间间隔内发送才不会冲突,所以相当于Slot变成了2倍,但是实际帧长本来就没变化,所以效率是Slot ALOHA的1/2.
从数学角度分析,即假设在每一个时刻,每个发送站的发送几率是p,则成功概率是p(1-p)^(N-1)(1-P)^(N-1),第一个p是发送者的,第一个1-p是在[t0-1,t0]内无其他发送站发送,第二个1-p是在[t0,t0+1]内没有其他站发送。这些同时成立才是一次成功的发送。对此式求最大值,并令N趋近无穷,可知最大值是1/2e,即Slot ALOHA的一半。
载波监听多路访问 CSMA Carrier Sense Multiple Access #
这种协议的主要特点在于:它们在发送前,一定是先听一下,信道上有无别人说话,如果没有才会去发送。这相比于ALOHA就会聪明一些:ALOHA的情商为负数,因为它在说话之前完全不考虑别人的存在;但是CSMA就会比较替他人着想。因为如果这个时候发送就是损人不利己。
“坚持” #
所谓坚持,就是发送站会以什么样的态度对待目前忙的信道。它对于信道忙碌,是保持继续监听还是等待一段时间再来监听的两种做法,区分出1-坚持、p-坚持和非坚持。其佛系程度递增。
坚持 | 张老师的类比 |
---|---|
1-坚持 | 排队买冰激凌,不排到我就不走(只要信道忙就一直侦听) |
p-坚持 | 排队买冰激凌,看到队很长,我有一定概率决定我是否还要坚持排队吃这个冰激凌。(只要信道忙,那我有p的概率继续保持监听,1-p的概率等待一段时间再去监听。)p-坚持是综合了1-坚持和非坚持的特点。它有p的几率是1-坚持,有1-p的几率是非坚持。 |
非坚持 | 队很长,先不排队了,逛逛其他地方等会再来看看(只要信道忙,我不监听它,我随机等待一段时间再监听看) |
当然,如果突然监听到当前信号不忙了,那么直接发送即可。
CSMA并不能从发送的角度完全地解决冲突的发生 #
情况1:巧了,两个发送站都发现此时刻信道空闲,那么它们同时开始发送。
情况2:没那么巧,但是两个发送站发送的间隔非常近。这是较早的发送站发送的信息由于信号传播延迟没有被较晚发送的那个发送站监听到导致的。
CSMA/CD 带碰撞检测的载波监听多路访问 CSMA With Collision Detection #
发之前听,边发边听,不发不听。即:发送之前先监听信道(CSMA过程),发出去了才开始检测是否发生冲突(CD过程)。
即:“发之前听”是它作为CSMA协议应当遵守的基本要求;“边发边听”是CD方法的具体体现。
此协议较原始的CSMA的改进在于,在发送数据的同时仍然在监听信道。这样,如果发生了上述情况1或者情况2,都能检测到混合信号,从而立即停止后续发送。注意,这里的停止指的是在比特位层面的停止,即从此比特位直接终断发送!
这样做,可以在出现CSMA无法解决的那种情况1和情况2刚刚发生的瞬间就检测到。这是CD这个协议存在的意义,即彻底补充原始CSMA的那个BUG。从而大幅度减少信道浪费。因为这么做是直接省下了一个帧的发送时间呢!
如何检测发生冲突 #
检测信号的强度。如果检测到线路上的信号强度大于本身发送的信号强度,则说明出现了叠加信号。
时空观念 #
对于每个站点,其对于信号的监听是基于其所处空间下,当前时间的信号强度的。参照我画的图,横轴是空间,纵轴是时间。从左往右,是当前时间下,各个位置的信号情况;从上往下,是当前位置下,不同时间的信号强度。想一想信号的传播延迟,就会考虑到这时间和空间的微妙规律。
为什么发送站能一直监听到自己发送的东西 #
因为传输延迟。自己能收到自己前若干毫秒发送的东西。
如果这个东西的 信号强度过高,则说明冲突了。
CSMA/CD的最小帧长限制 #
由于CSMA/CD一旦结束数据发送,就不再监听信道,所以一定要保证”异常的信号强度要在发送站发送结束之前就到达发送站处“。这就需要每个帧的传输延时要足够大,给冲突传播过来争取时间。
在冲突检测的最差情况,就是D站在决定要发送的后0.0000000000000000000000000000000001微秒,B站发送的信号就进入到D站的耳朵了,但是D站已经开始发送了。此时,D站非常快地终止了发送,但是异常信号还需要走一个传播延迟才能回到B站的耳朵。因此B需要2倍的传播延时才能检测到冲突,也就是说传输延迟应当是传播延迟的两倍以上,协议才可以正常工作。
2倍传播延时和RTT的关系 #
2倍传播延时即2倍的信号在线路上走所需时间。如果中间不经过路由器转发,则这个就=RTT。
但是如果中间经过路由器,则RTT远大于此2倍延时。因此也常说:传输延迟应该>=RTT.
但是这里说RTT也意义不大。因为在同一个冲突域中,不可能出现路由器这种东西。
为什么以太网只能作为局域网(为什么带宽越大,要求的主机间的距离越近,或最小帧长越长) #
根据最小帧长,如果带宽增大,则传输延迟降低,则也应当同时降低传播延迟,或者响应尝试提升帧长以中和此变化。
CSMA/CD效率 #
根据结论公式,在理想情况下,效率=1.比ALOHA好多了。
CSMA/CA 带碰撞避免的载波监听多路访问协议 #
为什么无线网络就不能冲突检测了? #
信号的衰减是平方反比级别。因此叠加而来的信号强度和发送站发送出去的信号强度基本没有区别。(其他站的信号强度过来已经远小于这个发送站的初始强度了。直接被发送站的信号强度淹没。)
轮转访问MAC协议的特点 #
性能是介于信道划分MAC协议和随机访问MAC协议之间的。在上述两者的擅长的点,轮转访问不如它们;在上述两者不擅长的点,轮转访问比他们好。
额外开销:无论是询问,还是令牌,它们都是特殊的数据。需要占用资源。
等待延迟:发送站都需要等到轮到自己才能发送。
单点故障:轮询的中心站点产生单点故障、令牌的各发送站如果把令牌弄丢了….
轮询访问协议 #
特点 #
所有的发送站被轮流询问是否要发送数据,每个发送站当且仅当被询问到才可以发送数据。
需要一个主动发出询问的中心结点负责对各个发送站进行询问。
适用于傻瓜发送站。因为发送站不需要有自己判断的能力。
缺点 #
可能发生单点故障:如果中心结点宕机,则整个系统gg。
令牌协议 #
特点 #
令牌是一个特殊帧,令牌在发送站之间按逆时针传递,令牌是唯一的,只有持有令牌的发送站才能发送数据。一个发送站如果没有数据发送就直接把令牌给下一个结点,否则就把数据发送完再给下一结点。
数据是自生自灭的,发出数据的发送站等数据在环形网络上绕行一圈,回到发送站处再把数据销毁。然后令牌给下一个发送站。
适用于环形拓扑。
缺点 #
令牌的各发送站如果把令牌弄丢了….
和轮询访问的区别 #
令牌协议是完全分布式的协议。不需要第三者去协调。
ARP地址解析协议 Adress Resolving Protocol #
MAC地址 #
MAC地址又称为局域网地址。理论上,MAC地址只要保证在局域网内是唯一的,就不会出现问题。
目前要求MAC地址世界唯一,因为它是固定的。这样NIC卡在世界任意的局域网都能正常工作。
MAC地址是一个48位的地址。每8位作为一组,采用8进制,利用‘-’进行间隔表示。
MAC地址和IP地址的差别 #
IP地址是接口的网络层地址,MAC地址是接口的链路层地址。
IP地址用于标识数据报,MAC地址用于标识帧。
IP地址是层次化的,不可携带。即IP地址只能归属某个子网,你带不走它。MAC地址是仅与NIC卡绑定的,因此不管你在哪个子网,它都是不变的。
即IP地址类似于邮政编码,它与所在子网绑定;MAC地址类似于身份证号,它与NIC卡相绑定。NIC卡可以出现在世界任意位置,在不同位置其IP地址就是入乡随俗的。
ARP表 #
局域网中的每个主机都会维护一张ARP表。此ARP表反映了局域网中各个主机的IP地址和MAC地址映射关系,并外加一个TTL(默认为20min)。如果某关系到了TTL,则它被从此表中清除。这样做是为了保持最新。
在发送IP数据报前,先查询ARP表 #
如果目标主机的IP地址能在表中找到对应MAC地址,则可以进行发送。否则,利用ARP协议寻找B的IP。
同一局域网内的通信(走数据链路层设备即可) #
如果目标IP地址不在本地ARP表中存在映射,则需要通过ARP协议查询此IP地址对应的MAC地址是什么。
ARP查询分组 #
ARP查询分组是一个特殊分组,其MAC目的地址是一个广播地址,即FF-FF-FF-FF-FF-FF(在MAC地址中,全1也代表广播)。此分组中包含了待查询的IP地址。ARP查询分组的作用是查询拥有此IP地址的网络接口,其MAC地址是什么。
ARP应答分组 #
由于是以链路层广播的方式发送ARP查询分组,所以局域网内的所有主机都会收到。
当IP地址与ARP查询报文内IP地址相同的主机收到此分组,就会向发送上述ARP查询分组的主机进行单播,返回自己的MAC地址。
于是,ARP查询分组发送方就得到了此IP地址对应的MAC地址,并把它放进ARP表中,并设置TTL。
是即插即用的协议 #
无需配置,主机即可自动开始获取。
不同局域网内通信(需要走网络层设备) #
这种通信是最常见的通信,描述了边缘主机是如何和互联网内的其它主机进行通信的。
例如不同局域网内的A要给B发送数据,A能够知道这个IP地址不属于此局域网,所以A会考虑把此数据报发给默认网关。则A先通过DNS或其他方式得知B的IP地址,然后A通过用户填写的或DHCP服务器获取的默认网关得到本局域网的出口接口地址(第一跳路由器的接入接口地址),然后A通过ARP协议知道第一跳路由器的接入端口的MAC地址,从而可以把报文发送给第一跳路由器。第一跳路由器拿到以后拆包,根据路由表找到下一条路由器,构造到下一条路由器之间链路所需格式的帧(例如从802.11到802.3)并替换源目的地址(替换源和目的MAC地址,并且如果是内网转外网采用NAT,还需要替换源IP和目的IP),经过若干路由器的类似操作,到达目的局域网,然后目的局域网的默认网关路由器根据其ARP表利用局域网内部通信,把报文最终发给主机B。
即:如果不在同一局域网内,则就不需要知道目的主机的MAC地址了,因为这没有意义**。直接走网络层通信的流程就可以!**
这里体现出了路由器的帧格式转换的功能。
以太网 Tthernet #
应用广泛,造价低廉,速度一直能满足要求(因为支持范围广)。
更加先进的交换式以太网 #
总线型以太网和星型以太网 #
早期使用总线型。后期使用集线器或交换机构成逻辑上总线,物理上星型的以太网。
总线型就是像计组中的系统总线一样。星型就是包含一个中心结点的拓扑。中心结点称为中心交换机。
冲突域 #
处在此区域内的主机只要发送就可能产生冲突的区域,或者说是CSMA/CD协议能够正常工作的区域。
广播域 #
如果这个网络只由交换机连接,它的出口接入一个路由器端口,那么如果这个路由器端口发送一个MAC地址为全F的帧,则这个区域的所有交换机或主机都能收到,因此这个区域成为一个广播域,又称IP子网(因为根据定义,路由器接出来的这部分网络称为IP子网)。
交换机和集线器 #
前者是数据链路层设备,后者是物理层设备。
交换式以太网 #
交换式以太网就是采用中心交换机作为中心结点的星型以太网。交换机能够隔离冲突域。因此交换式以太网不存在结点之间的冲突。每个结点独享一个冲突域。
以太网服务 #
以太网提供无连接、不可靠的服务。无连接在于连接无需握手建立,无需维护;不可靠在与并不采用任何Rtc机制(例如最基本的ACK)。以太网只负责对数据进行校验,如果出错则直接丢弃。因此这里印证了,数据校验和可靠传输完全是两个概念。
如何实现面向连接、可靠传输 #
都由高层协议实现。
以太网采用二进制指数退避的带1-坚持的CSMA/CD协议 #
采用1-坚持的CSMA协议 #
以太网采用1-坚持,即监听信道,一旦空闲了就直接开始发送,无需等待。
采用CSMA/CD协议 #
即:不发送就不保持监听,只要发送就保持监听。因此只要监听过程中不冲突就说明发送成功。
增加拥塞信号jam signal机制 #
如果某个结点检测到了冲突,就立即中止,并直接发送jam signal强信号。这个信号使得所有在线路上跑的信号都被冲突了,意在让大家都知道线路冲突,同时停止发送,并同时进入二进制指数退避状态。
采用二进制指数退避 #
所谓退避,就是等待一段时间再发送。可等待的时间范围呈指数级上升,所以称为指数退避。因为都是2的n次方,所以是二进制指数退避。
jam signal出现后,所有NIC同时进入二进制指数退避状态。
规定n=min(m,10),其中m是累积冲突次数。如果m<10,n=m,否则n=10,即n增长到10就不会增长了。
取集合{0,1,2,…,2^n}。NIC会在这个集合中任意取数K,并等待K*512bits个bits的传输延迟。之后再尝试发送。如果又有冲突,则m+1,否则m=0(对单个NIC而言。其他NIC如果还冲突则还是更新自己的m).
可见,连续冲突越多,退避集合范围越大,平均等待时间越长。
基于二进制指数退避进行网络崩溃报告 #
如果退避了16次还冲突,则认为是网络瘫痪导致的。则向上级报告错误即可。
经典以太网帧格式(IEEE 802.1) #
前导码(不算入帧长度) #
8字节。不算入帧长度。
10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011
即:7个10101010,最后一个是10101011.
就像“一二一 一二一”一样,用于发送方和接收方时钟同步。即帧定界的作用。告诉接收方这个帧从哪里开始,从哪里结束。
目的和源MAC地址 #
如果全F则为广播,见到就会收下;否则如果不是自己的地址就丢弃,是自己的地址就收下。
上层协议类型 #
指明里面封装了什么。
填充 #
保证最小帧长是64B。因此应该保证数据部分最小是64-6(源MAC)-6(目的MAC)-2(上层类型)-4(CRC)=46B。
64是怎么来的?在经典以太网中,RTT一般是512us.
不同的以太网标准 #
相同处 #
帧格式完全相同。
不同处 #
速率不同:从2Mbps到10Gbps都有;
传输介质不同:光纤(BASE-T2,BASE-T4))或双绞线(BASE-SX,BASE-FX)。
组合上述两点,构成协议名称:例如100BASE-FX。
交换机 #
交换式以太网的重要设备就是交换机,因此常称交换机为“以太网交换机”。
特点 #
链路层设备(对上层透明) #
交换机是链路层设备——它拆包拆不到网络层。对上层的透明就体现在拆包深度上面。
选择转发 #
交换机的作用在于将接收到的帧有选择地转发出去。可能从一个口转发,这称为转发;可能从所有其他口转发,这称为泛洪;当然也可能不转发。
即:交换机的转发是多、1或0的。
遵循CSMA/CD协议进行转发 #
交换机自己也是网络接口(发送站)。遵循CSMA/CD协议进行发送。
并行转发 #
交换机的A口到B口的通信可以同时和其C口到D口的通信同时进行。
隔离冲突域 #
由于可以隔离冲突域,所以星型以太网上,所有主机都绝对不会冲突。
支持全双工通信 #
交换机通过自己的机制,可以实现以太网上的全双工通信!
存储转发 #
类似于路由器,交换机也是存储转发机制。这样才能拆包和实现全双工通信。
支持直通传输 Cut Through #
就是把数据帧边收边发,不存在停留等待。
路由器不支持这一点,但是部分交换机支持!
由于目的MAC地址在帧头第一个信息,所以交换机刚收到帧头就能确定其应该走哪个端口,后续比特位来了就直接转发走了,不做停留。
交换表 #
无法与其他交换机确立拓扑关系 #
交换表中存储的是自己连接的主机或其他交换机的转发规则。它不区分这到底是主机还是交换机。
只考虑窝边草 #
交换机的交换表和路由器的转发表的获得方式完全不同。
交换机不存在什么高大上的算法,它只管自身周围的交换,不用考虑全局问题,诸如网络情况,因为链路层还是太低级。
逆向自学习 #
所谓自学习,就是如果某客户机发送数据,中间经过此交换机,则交换机就记录下来这个客户机从哪个端口给了它数据,这个客户机的MAC是多少。这就是逆向学习。
同时,每条记录都有TTL。这类似于ARP协议,用于维持最新。超时重新获取。
一对一 #
交换表中,对每个端口都绑定了一个MAC地址,所以不能像路由器那样进行路由聚合,所以交换机也就只适用于局域网。
转发机制 #
转发有三种情况:多、1、0.
泛洪 #
如果目的MAC在转发表中不存在,则往所有端口转发。这就是泛洪。
选择转发 #
如果目的MAC在转发表中存在,则转发到它对应的端口。
不转发 #
如果目的MAC和源MAC在同一冲突域(网段),则不用转发。
交换机连接 #
把交换机的端口也看作主机的端口即可。因为交换机不区分主机和其他交换机。
路由器Router,交换机Switch,网桥Bridge和集线器Hub的对比 #
首先注意,Swtich和Bridge的方式相同,特性相同,认为是一种东西。
机器 | Hub | Switch | Bridge | Router |
---|---|---|---|---|
层次 | 物理层 | 链路层 | 链路层 | 网络层 |
直接连接 | 1 | - | - | - |
直通传输 | 1 | 1 | 1 | - |
即插即用 | 1 | 1 | 1 | - |
隔离冲突域 | - | 1 | 1 | 1 |
路由优化 | - | - | - | 1 |
隔离广播域 | - | - | - | 1 |
高级功能(例如NAT) | - | - | - | 1 |
VLAN #
虽然接入同一个Switch的用户在同一个LAN中,但是通过VLAN可以实现广播域的隔离(不负责它们之间的通信。这也是VLAN和路由器的区别!),看起来就像它们各自在各自的LAN中一样。这种隔离方式隔离出的这两个区域称为VLAN。
流量隔离 Traffic Isolation #
流量隔离就是隔离广播域。对同一个Switch,属于不同VLAN的端口连接的机器不在同一个广播域中。
也就是说,VLAN使得Switch具有了路由器的功能。(仅限网络拓扑角度来说。)
完全的流量隔离 #
这种隔离非常完全。因为Switch虽然能通过VLAN提供Router的这种拓扑上的功能,却实现不了这两个广播域之间的数据交换。如果要实现这两个广播域之间的数据交换,则还需要在他们之间接一个路由器(为什么不是接交换机?因为接了就白隔离了。也正是因为此,Switch的VLAN只能分离广播域,却不能实现它们之间的数据交换)。
基于端口或MAC地址的VLAN(依据端口或MAC组成一个VLAN) #
对于一个Switch,可以把若干个端口或把若干个MAC地址划分到同一个VLAN中。
灵活性 #
VLAN支持动态成员。可以随意添加或者删除成员!
跨越多Swicth构成的VLAN #
例如某VLAN由Switch1的1-6口和Switch2的2-4口构成,则如何连接它们,使得构成一个完整VLAN?
方法1是:既然可以看成是两个独立VLAN构成一个大VLAN,则让他们构成同一个广播域即可。用线直接连接这两个VLAN中的某个接口即可,粗暴地连接了两个广播域。
但是,如果不只有这一个VLAN需要这么构成,而是还有若干VLAN也集中在这两个Switch上,或者有的VLAN跨越非常多的Switch,则连线非常复杂。
方法2是:将若干Switch都用中继端口连接。中继端口是交换机上的两个特殊端口,可以用于与其他Switch进行连接,从而实现数据互通。然后具体由内部软件处理VLAN划分即可。这样,只需要把涉及到的交换机串联起来就可以,非常简洁明了。
IEEE 802.1q #
为了实现上述的方法2,由于不管哪个VLAN的帧都会从中继线上跑,到了下一交换机后需要正确分发这些帧到对应的VLAN中,所以帧里面需要添加VLAN ID字段来确定这个帧到底属于哪个VLAN。 IEEE 802.1q与802.1的区别只是在多出的与VLAN ID有关的字段。具体见我的图集。
多出的字段 | 作用 |
---|---|
协议ID | 固定为0x8100,表示是802.1q |
VLAN ID | 如题 |
优先级字段 | 类比IP中的QoS,ToS |
PPP 点对点数据链路协议 Point-to-Point Protocol #
PPP是针对点对点链路的。它与广播链路的显著不同在于,无需MAC控制(不存在信道争用);不需要MAC寻址(因为只有发送方和接收方两个角色)。
常见的点对点链路控制协议:HDLC(High Level Data Link Control)、PPP。
PPP协议不需要处理的事项 #
差错纠正、流量控制——由上层协议解决。况且作为一个点对点链路,顺序传输这点是可以天生满足(乱序产生的根源在与路由器选择了状况不同的链路)。
多点链路——本来就点对点,不存在这种情况。
上层协议多路分用 #
和其他链路层协议一样,使用“上层协议”字段进行区分。
网络层协商 #
可以通过其他协议配置网络层参数,例如IP地址等。
连接活性检测 #
检测链路状态,向上层协议通知链路失效。
比特透明传输的实现——字节填充 #
PPP的帧头帧尾都有帧定界符,即。
如果数据中也有相同的这种二进制串,则会导致帧的提前结束。因此发送方在串01111110
前添加转义串01111101
,在01111101
前也添加01111101
。这样,接收方见到转义串01111101
就删除,然后如果后面有这个01111101
则说明是数据,无需去除。然后再正常处理。
PPP帧结构 #
字段 | 含义 | 长度 | 固定值 |
---|---|---|---|
帧定界符 | 1B | 0111 1110 | |
地址 | 无效 | 1B | 1111 1111 |
控制字段 | 无效(便于未来协议扩充) | 1B | |
上层协议 | 实现上层多路分用 | 1B-2B | |
数据 | 任意 | ||
CRC校验 | 2B-4B | ||
尾部帧定界符 | 1B | 0111 1110 |
一般情况下,发送方和接收方可以协商帧的格式,从而动态调整帧的格式。例如一般可以省出5B,即上层协议采用1B,CRC采用2B,控制字段和地址字段这些无意义的字段直接省略。即1+1+1+2.
PPP链路的建立 #
首先要完成链路层的配置(配置PPP协议),然后要完成网络层的配置(例如配置IP协议或其他网络层协议。)。
配置PPP链路 #
双方进行一系列协商,包括最大帧长和身份认证。
配置IP信息 #
通过IPCP(IP Control Protocol)报文的交换完成。
IEEE 802.11 #
无线局域网基本概念 #
工作频段 #
2.4-2.485GHz或5-6GHz
802.11n #
多天线技术,使得传输速率非常高。
工作模式 #
基础设施(基站, base station)模式、自组网(ad-hoc)模式。一般家里路由器那种都是前者。基站模式是AP接入到Internet网络中去,ad-hoc模式是一系列主机动态地在一定范围内构成一个网络。
基本服务集BSS, Basic Service Set,又称单元 Cell #
由基站 Base Station和无线主机构成。
信标帧 Beacon Frame #
一种特殊的帧,包含AP的服务集标识符 SSID Service Set Identification和MAC地址。
主机搜索与关联AP #
主机通过主动扫描或被动扫描模式发现AP。前者是无线主机主动发送请求帧,探测周围的AP,等待回复;后者是无线主机直接探测周围的Beacon Frame。
AP发现后,主机发出关联请求帧,AP返回关联响应帧,主机与AP建立关联成功。
CSMA/CA协议 CSMA With Collision Avoidance #
802.11中的干扰或冲突 #
以802.11b为例,其把2.4GHz-2.485Ghz划分成11个频段,每个AP都会随机选取一个频段,但是如果两个很近的AP选择了同一频段,则会冲突;如果选择了相邻频段,则会干扰。
暴露站和隐藏站问题 #
由于暴露站和隐藏站问题,就算信号衰减不利害也不能用CSMA/CD。
之前说过信号衰减的问题。
此外,还存在一个问题,就是假设大家都离得很近,信号完全可以用CSMA/CD检测到。但是,如果存在暴露站和隐藏站的问题,仍然无法解决。暴露站和隐藏站问题是在有线通信中不存在的问题!
假设A和B通信,C也和B通信,它们离得很近,所以尝试使用CSMA/CD协议。但是A和C之间有信号无法穿过的屏障,A和C互相探测不到对方区域的信道,不知道对方是否发送,则A和C永远都认为对方没有在发送,则此时如果它们同时给B发送数据,则冲突了。
作为CSMA协议的特点 #
CSMA/CA也是CSMA协议的一种,所以会在发送数据前先监听信道。这是作为CSMA协议的基本要求。当信道空闲,再监听DIFS时间,如果这段时间都没有问题,就开始发送。
类似于CD方式,又比CD更严格的特点 #
利用帧间间隔时间区分帧的发送优先级 #
帧间间隔时间的作用是,让各个发送方在监听到信道空先后,再多监听一段时间的信道,如果没问题再开始发送。显然,如果某些帧的等待时间稍短,则这些帧就可以被由先发送,因为间隔时间长的那些发送方会发现在自己等待的间隔时间中,信道又不空闲了。(假设双方一开始是同时检测到信道空闲的。)
例如,ACK是在信道空闲后,再监听SIFS(短帧间间隔时间)的时间如果还是空闲,则可以发送。然而,发送方发送数据帧是在信道空闲后,再等待DIFS(分布式帧间间隔时间)的时间间隔,且有DIFS远大于SIFS.如果还是空闲则可以发送。则显然ACK的优先级比数据帧要高。
边发边听,冲突就停止,然后随机退避 #
类似于CD,也是边发边听。如果突然发现冲突了,则停止发送,然后类似于802.1采用的二进制指数退避(但是这里不是),利用随机退避算法,等待一段随机时间。等这段时间过去了,再等待DIFS时间,如果这段DIFS也没问题,则开始发送。
发送完仍然监听,等待ACK信号 #
CSMA/CA与CSMA/CD的显著区别在此:CD以发送出去作为帧发送成功的标志,是不可靠的;CA以发出去然后能收到ACK为发送成功的标志,是相对可靠的。因此,CD发送完就不监听了,但是CA还在保持着监听。
如果收到了ACK,则成功。如果没有收到,则说明发送失败。此时应该增加随机退避的时间长度。
应用场景 #
由于有CA方式的存在,所以上述这一套类似于CD的方式实际上不会用于数据帧的传输过程(因为数据帧的传输过程是100%不会冲突的)。这个的应用场景只是在RTS、CTS帧发送协商信道预约的过程中发挥作用。(即:在信道没有预约好的时候,利用类似CD的方式通信。)
CA方式的灵魂:完全避免冲突 #
利用信道提前预约的方式,100%地避免在数据传输过程中发生冲突。
虽然信道预约需要提前发送若干帧进行协商,也可能导致冲突,但是这些帧一般比较短,就算冲突了也不可能造成太多浪费。
信道预约 #
这使得信道在一段时间内能够100%地不被其他发送站占用,而只能是指定的发送站发送数据。
RTS帧, Request-To-Send #
想要争用信道的发送站检测到空闲后就等一个DIFS(分布式帧间间隔时间),然后提前给AP或者BS发送一个RTS帧,指明其要使用多久信道。如果该RTS帧没有出现冲突,那么AP/BS就会响应此请求。
如果两个站同时要给AP/BS发送RTS,产生了冲突,则AP/BS不会对任何一方进行响应。两个发送站过了一会发现没有收到CTS,则知道发生了冲突,则各自开始退避算法,都退避随机长度时间。那么,退避时间较短的一方首先进入DIFS等待期,率先会发送RTS。因此,这个随机退避算法能非常自然地处理两方发送先后的问题。
CTS帧, Clear-To-Send #
AP/BS会在等待一个SIFS(短帧间间隔时间)之后,广播一个CTS帧给所有连接到他的发送站。这样,即便是隐藏站也知道自己不应该发送数据了。CTS中包含了需要占用信道多长时间,收到CTS的特许发送站可以在这段时间内发送数据了。收到CTS的非特许发送站会知道自己要闭嘴这么长时间了,等过了这么长时间再去尝试发送RTS。
ACK帧 #
当AP/BS把授权量CTS的发送站的数据帧接收后,经过SIFS时间会广播一个ACK帧。(注意,ACK帧是广播的。)
RTS和CTS的高明之处 #
节约信道资源:利用非常低的成本完全避免了暴露站隐藏站和冲突问题。即便是RTS或者CTS出现冲突,由于帧很小,也不会浪费多少信道。换来的收益却是巨大的。
化分布式为统一控制:AP/BS化身为信道指挥官,指挥所有发送站对信道的使用。所有发送站在统一的指挥下,变得井然有序,于是能做到100%的CA。
各帧的优先级 #
帧 | 帧间间隔时间 |
---|---|
RTS | 分布式帧间间隔时间DIFS |
CTS | 短帧间间隔时间SIFS |
数据帧(在收到CTS后) | 短帧间间隔时间SIFS |
ACK(对数据帧的确认) | 短帧间间隔时间SIFS |
802.11帧格式 #
字段 #
字段 | 解释 |
---|---|
帧控制 | 内含此帧的非常多的选项信息 |
时间duration | 即RTS/CTS中的“拟占用时间” |
MAC Address1,2,3,4 | 地址(在是否ad-hoc网络、是否途径AP的方向为来自或去往的情况下有不同的含义) |
seq num | 用于Rdt的帧序号。(特别是用于分片后的控制) |
CRC | - |
数据 | 长度可为0-2312B的数据。 |
表/字段
帧控制字段 #
帧控制字段 | 解释 |
---|---|
版本号 | - |
类型 | 802.11帧类型。可以是RTS,CTS,ACK,DATA. |
To AP | 去往AP的帧。用于区分Address123用途. |
Fm. AP | 来自AP的帧。用于区分Address123用途. |
MF | 还有分片(一定要注意,802.11帧是支持分片的) |
表/帧控制字段
地址字段含义 #
我们只讨论在经过AP接入其他网络这种模型下的含义。
这种模型下,采用多个MAC地址可以帮助AP在其有线网络部分和无线网络部分进行寻址。
地址字段 | 在经过AP接入其他网络这种模型下的含义 |
---|---|
MAC Address1 | AP网络中的,直接目的地址(只能是AP或BSS内的主机) |
MAC Address2 | AP网络中的,直接源地址(只能是AP或BSS内的主机) |
MAC Address3 | AP连接的其他网络中的,另一通信端的地址(只能是非此BSS内的主机或其他设备) |
MAC Address4 | 仅用于ad-hoc模式,与当前模型无关 |
地址字段 | TA=0&&FA=1 | TA=1&&FA=0 |
---|---|---|
MAC Address1 | 目的地址 | AP地址 |
MAC Address2 | AP地址 | 源地址 |
MAC Address3 | 源地址 | 目的地址 |
MAC Address4 | - | - |
表/地址字段含义
可见,在这种模型下,MAC Address1和MAC Address2仍然保持着“目的地址在第一个,源地址在第二个”的含义。且,MAC Address3就显得是额外加上的,其实确实是额外加上的。因为它本身不属于BSS的范围。
帧转换 #
802.11的AP还负责完成帧转换,且深藏共与名,希望自己对两个网络来说是透明的。因为AP是连接在802.3网络上的,所以两侧的帧协议是不同的!!以上述模型为例,当802.11经过AP转换成802.3时,其源地址为实际发出802.11帧的主机的地址(而不是AP地址!),其目的地址是802.3网络的目的地址!