拓扑类型
- 点对点网络
- Link Control Protocol
- 建立和配置连接
- Network Control Protocol
- 每个支持的网络层协议都有一个 eg:IP数据包在PPP协议的IPCP里发 - 星型拓扑
- 一个switch在中间转发所有流量,每条路径上点对点不会冲突
- 如果switch上出现拥塞,switch可能发假的冲突信号抑制过多流量
- Link Control Protocol
(TODO:两个设备还是会冲突吧)
- 广播网络
- Medium Access Control:解决碰撞,公平高效地分享介质
- Aloha
- Carrier Sense Multiple Access/Collision Detection (CSMA/CD)
- 用于Ethernet
- 可以冲突,冲突了退避
- 工作过程:信号在介质上传播的最长时间是a
- 如果介质占用,等到介质空闲
- 如果介质空闲,立即开始发送
- 开始发送,开始发送后监听介质2a时间,看是否冲突
- 最多a时间后发生冲突,最多a时间听到冲突
- 假设A在介质一端,B在介质另一端,A发送信号后接近a时间B发送,A需要接近2a时间收到冲突信号
- 如果检测到冲突,发送冲突信号,停止发送,进入指数退避
- 等待时间槽为2a
- 冲突第i次,从\(0~2^i - 1\)中随机一个数,等待这么多个2a长时间再尝试发送
- i >= 10时随机数保持 0~2^10 - 1
- 连续冲突16次放弃发送
- Carrier Sense Multiple Access/Collision Avoidance (CSMA/CA)
- IEEE 802.11 Wlan:无线一些情况下无法检测冲突,因此要避免冲突
- Hidden terminal:(a)中Host A无法知道Host C正在通信,导致冲突
- Exposed terminal:(b)中Host C以为信道忙,等着不通信,其实这个时候可以和D通信
- 两种模式
- Infrastructure mode:固定AP,大家都和路由器通信。换ap有专门的hand off方法
- ad-hoc mode:host可以组网,转发数据
- 工作过程
- Distributed Coordination Function (DCF) Inter-Frame Space (DIFS)
- 发送之前随机等待一段时间,如果信道一直空闲开始发送
- 如果要发送时信道占用
- 等到发送完毕
- 等DIFS
- 之后等退避时间。退避过程中如果信道占用暂停计时,等到计时完毕尝试发送
- Request to Send / Clear to Send:解决hidden terminal问题
- 发送前发RTS,带上需要占用信道的时间
- 目标空闲回CTS,所有能和目标通信的host都会收到CTS,这段时间就算介质空闲也是占用的
- 传输完成后回复ack
- Distributed Coordination Function (DCF) Inter-Frame Space (DIFS)
MAC地址
不同的数据链路层协议不同。Ethernet地址48位,全球唯一
- 前24位:vendor component,每个生产商一个
- 第八位标记multicast
- 后24位:group identifier,每个设备不同
ARP
Address Resulution Protocol
- 将网络层地址转成数据链路层地址
- 不同的网络/数据链路层用不同的地址,ARP有不同的组合
- L2协议,ARP帧永远不会过路由器
- Proxy ARP是路由器在另一个冲突域代发的
ARP Table
每条记录通常20min过期。每当设备收到ARP帧,会首先将其中的IP<->MAC对应关系写到ARP Cache里。
内容
- IP
- MAC
- Flag
- permanent:手动配置的记录不会过期
- pub:host会回复找这条MAC的IP
- incomplete:发了request没回复
帧格式
长度:28 Bytes(IP V4 <–> MAC,不同协议长度不同)。发的时候如果放在Ethernet帧中,最短要求46 Bytes,有18 Bytes的pad
- Hardware Type:数据链路层地址类型
- Protocol Type:网络层地址类型。比如IP 0x0800
- Hardware length:数据链路层地址长度
- Protocol length:网络层地址长度
- Operation:操作类型。1 ARP Request,2 ARP Reply,3 RARP Request,4 RARP Reply。
- Sender hardware address:发送者数据链路层地址
- Sender protocol address:发送者网络层地址
- Target hardware address:目标数据链路层地址
- Target protocol address:目标网络层地址
(TODO:跟着google doc更新)
过程
L3下来的数据包需要L2转发时
- 查ARP Table看有没有这个IP对应的MAC
- 如果没有广播一个ARP Request,SHA和SPA写自己的MAC和IP,TPA写目标IP,THA在Request中会被忽略
- 目标设备收到一个TPA == 自己IP的ARP Request,单播一个ARP Reply到发送的设备,把自己的MAC写到THA中,之后把Target和Souce对换
Proxy ARP
- 两个host实际是在不同的冲突域,但是IP/子网掩码配置让他们觉得自己是一个网段,会发ARP。
- Proxy ARP是路由器代替主机回ARP请求,THA是目标host IP,TPA是路由器端口IP。
- 可以向外部屏蔽局域网细节,可以用于NAT
- 路由器在收到包之后会用L3的信息转发,一个端口可以代理多个host
Gratuitous ARP
Sender和Target信息都是Sender信息的广播ARP帧
可以用于
- 向局域网广播自己MAC地址的变化
- 新加入网络时检查自己的IP是否已经被占用
MTU
数据链路层中每个帧中最大的Payload长度,不算自己的协议头和尾
- Ethernet,PPP:1500 Bytes
- FDDI:4352 Bytes
- PPP(低延迟):296 BYtes
- Ethernet Jumbo Frame:9000 Bytes
Path MTU Discovery:找到路径上所有二层连接里最小的的MTU
- 设置IP Flag中的Don’t Fragment
- 发一个大数据包,等ICMP Unrechable
- Payload里有MTU of next-hop
Destination Unreachable - Fragmentation required, and DF flag set
Bridge
IEEE 802.1d 网桥
- 从一个冲突域向另一个冲突域转发数据包。进出协议相同时帧完全不会被修改
- 如果两个冲突域协议不同,网桥可以做翻译
优点
- 大规模局域网可以在bridge之间拉p2p骨干,之后bridge连多个设备,增加局域网距离
- 扩大局域网规模
- 分割冲突域,减少冲突
- 更安全,设备只能看到自己冲突域的信息
数据转发
Filtering table:记MAC所在的端口
- 目标MAC
- 设备所在端口
- TTL:默认300s
地址学习:收到一个数据包就记录下发送者MAC和收到的端口
转发:查Filtering table
- 找到了MAC:转发到所在端口
- 找不到:转发到收数据包端口外的所有端口
生成树协议
环的危害
- 广播风暴:一个环中所有网桥都不知道往哪转的数据包会被一直转发,占用大量带宽
- 不一定是广播,只要所有网桥都不知道往哪发就会flood,造成风暴
- Filtering table震荡:对于Bridge 1和Bridge 2,Host 1一直是一会在LAN A一会在LAN B,正常的数据包可能也会转到错误的地方并丢失
解决:去除拓扑中的环 -> 生成树协议
关键概念
- Port ID:2 Bytes,1 Byte 优先级 + 1 Byte 端口号
- Bridge ID:8 Bytes,2 Bytes 优先级 + 6 Bytes MAC -> 网桥中端口号最小的端口MAC
- Root Bridge:拓扑中Bridge ID最小的网桥
- Root Port:每个非根网桥到根网桥代价最小的端口,代价相同选Port ID小的
- 代价可以是跳数,带宽。。。
- Root Path Cost:根端口到根网桥的代价
- Designated Port:一个LAN上到根网桥代价最小的端口
- 两个网桥有代价相同的端口,选BID小的
- 一个网桥两个端口代价相同,选PID小的
- Designated Bridge:一个LAN Designated Port所在的网桥
建树
- 找BID最小的网桥
- 找每个网桥到根网桥代价最低的端口
- 代价相同选PID小的
- 找每个LAN所有端口里到根网桥代价最小的
- 两个网桥代价相同选BID小的
- 两个端口代价相同选PID小的
- 所有的根端口和指定端口转发数据,其他所有端口block,只发BPDU这种控制信息
收敛
- 所有网桥往出发BPDU,当自己是根网桥
- 比较收到的所有BPDU,如果有更小的把人家当根网桥,继续发BPDU,每个端口发出的BPDU是不完全一样的
- 发BPDU
- 收到更小的根网桥
- 拓扑发生改变
- 发BPDU
- 一个端口可以听一个LAN里所有端口的BPDU,自己是不是指定端口就有B数了
- 一个网桥综合所有端口收到的BPDU选自己的根端口
- 除了根端口和指定端口,block所有其他的
注意
- 根网桥不一定全是指定端口,可能一个LAN上有两个端口,要block一个