基本术语
节点(nodes):主机和路由器都被称为节点
链路(links):连接相邻节点的通信信道(有线链路、无线链路、局域网)
帧(frame):链路层将网络层的数据包封装到帧中
链路层通过链路将网络数据报从一个节点传输到另一个节点
链路层提供的服务
- 成帧
将数据报封装成数据帧,添加头部和尾部
帧同步(确定链路开始与否) - 链路接入
多个节点共享单个广播链路时需要考虑如何协调节点的帧传输问题
首部中的MAC地址用来标识源地址和目的地址 - 可靠交付
与传输层可靠交付类似,在无线链路等链路中,用于本地纠正(在链路上)一个差错;在可靠的链路中可以不需要 - 流量控制
- 差错检测和纠正
帧中的1可能被反转为0(信号噪声、信号衰减),这时需要检测,不同于传输层,链路层的一些协议还可以直接精准定位出错的位置,并且纠正错误 - 全双工和半双工通信控制
全双工:链路两端节点可以同时双向传输
半双工:链路两端可以互相传输,但不能同时
链路层实现位置
位于网络适配器中
网卡间通信
差错检测和纠正
基本原理,在数据D后增加冗余比特R
发送方发送DR数据,接收方得到后将其拆分,再根据计算得到R’,通过检验R’和R是否一致来判断是否有数据丢失
差错编码可以分为检测码和纠正码
对于检测码,差错编码可以检测到r位的错误(如果编码集的汉明距离为ds=r+1)
汉明距离:两个码字之间的不同位的位数
编码集的汉明距离:任意两个码字之间汉明距离的最小值
对于纠错码可以实现r位纠错(汉明距离为2r + 1)
奇偶校验码
Internet校验和(checksum)
发送端:
把数据内容划分为16位的二进制,接着对补码进行求和(最高位的进1返回最低位继续加),最后取这个值的反码
接收端:
将数据内容划分为16位的二进制(包括校验和),接着对他们的和取反码,验证是否是全1,如果不是则出现错误
循环冗余码(CRC)
对于数据D,找到一个r+1位的比特模式G,通过在D后添加r位的校验R,可以验证D中突发长度小于r+1的错误
D * 2r=nG XOR R
即R = (D * 2r)mod G
多路访问控制
MAC(Multiple Access Control)
点对点链路:拨号接入的PPP,以太网交换机与主机间的点对点链路
除了点对点链路,还存在着广播链路(共享介质),常用于卫星网络,802.11无线局域网
在广播链路中,由于共享介质,因此当出现两个及以上的结点同时传输时,会出现干扰(碰撞)
因此需要引入多路访问控制协议:采用分布式算法决定何时可以传输数据
理想MAC协议
给定一个速度为R bps的广播信道
- 当只有一个结点传输时,速率达到R
- 当存在多个结点时,每个结点平均速率达到R/M(M个节点)
- 分散控制,不会因为某个主结点故障而导致整个系统崩溃
- 协议简单,实现不昂贵
信道划分协议
TDM时分多路复用
将时间划分为多个时间帧,并进一步将时间帧划分为时隙,将时隙分配给每个结点,确保在每个时间帧中的固定时隙都是由该节点进行传输
TDM消除了碰撞,并且确保公平
TDM缺陷在于即使只存在一个结点需要发送时,也需要等待到指定的时隙进行发送
FDM频分多路复用
将信道按照频率划分为多个频带,类似于TDM,同样包含了TDM的优缺点
码分多址(CDMA)
Code Division Multiple Access
每个结点按照不同的编码进行传送,能够保证不同结点可以按照这种方式进行同时传输
随机接入协议
每个传输结点以信道的全部速率发送,当检测到碰撞时,反复重发他的帧,直到该帧能够无碰撞地发送成功(不立刻重发,等待一定的随机时延)
时隙ALOHA
假设所有帧都由L比特组成,时隙划分为传输一个帧的时间(L/R),并且确保每个帧都在时隙的开始进行发送,出现两个节点同时发送帧时,即检测到冲突
时隙ALOHA的主要思路是:
当不出现冲突时,该节点在下一个时隙继续发送新的帧
当出现冲突时,该节点在往后的时隙均以同样的概率p发送这个帧,直到发送不冲突为止
C表示冲突,E表示空闲,S表示成功发送
优点:
可以以全部的速率传输数据
高度分散化:只需要同步时隙
简单
缺点:
当出现冲突时会浪费时隙
浪费了空闲的时隙
可能可以在传输之前尽早发现有其他节点已经在发送数据了
必须要求时钟同步
时隙ALOHA的效率:N个节点有很多帧需要传输,在每个时隙均以p概率传输
对于给定节点,发送成功的概率为p(1-p)N-1,对于所有节点,出现成功的概率为Np(1-p)N-1
因此最大效率为取Np(1-p)N-1的极限,为1/e = 0.37
ALOHA
非时隙,当有新的帧出现时,立刻发送,这样一来冲突的可能性会增大
效率方面
比时隙ALOHA更差
载波侦听多路访问(CSMA)
上述两个随机访问协议可以称得上是“自私”的协议,因为在已知其他节点发送数据的情况下仍在发送自己的数据,导致双方均无法发送,因此引入CSMA,在发送之前先进行载波侦听,是否有其他的节点的帧正在发送,如果没有再进行发送
然而CSMA仍存在冲突的可能
这是源于信号传播的延迟
在t0时刻B广播数据帧,而当t1时刻,由于传播延迟,导致B的数据帧并没有达到D节点,但此时D节点已经需要发送数据帧了,D对信道进行检测,发现并不存在来自于其他节点的数据帧传播,就也会发送自己的数据帧,这样就导致了冲突
如果双方仍继续发送冲突的数据帧,就会导致浪费信道资源
CSMA/CD(CSMA with Collision Detection)
在上述问题的情况下引出了具有碰撞检测的CSMA,对于冲突进行检测,当检测到出现冲突时,停止数据帧的传输
在有线局域网中易于实现,可以直接通过信号的强弱检测是否存在冲突
而在无线网络中无线信号衰减很快无法通过信号强度检测,因此在无线网络中很少使用
CSMA/CD协议中边发送边进行监听,不发送则不进行监听
在CD协议中还需要存在一个限制条件:
由于该协议中不发送时不进行监听,因此考虑极端情况下
在上图中,A发送的信号到了快要达到B时,B发送了数据,此时B方能够快速检测到冲突并且停止传送,而A并不能立即检测到,需要等待来自B的冲突信号回到A,因此从发送到检测到冲突至少需要2dmax/v(RTT)的时间,而由于不发送时不进行监听,在发送完成后无法意识到发生了冲突,该数据帧丢失,所以需要在发送完成之前就收到冲突的信号:L/R >= 2dmax/v,不能让整个数据帧在收到冲突信号之前完全发送完毕
效率方面
即在传播时延不存在时,效率可以接近1
而传输时延尽可能大时,会很快占据信道,即会容易被检测到冲突,别的节点就不会发送,效率也会接近1
轮转访问协议(take turns)
信道划分:网络负载重时效率高,轻时效率低
随机访问协议:负载重时效率低(冲突开销),轻时效率高
轮转访问协议综合了二者优势
轮询(polling)
主节点轮流邀请其他节点发送数据,其他节点只有在被邀请发送时才能进行发送,因此不存在冲突的可能性,并且是轮流邀请的,确保了公平性
存在的问题在于:
- 轮询的开销
- 等待时间
对于从节点来说,需要等待主节点询问时才能发送 - 单点故障
主节点崩溃时完全崩溃
令牌传递(token passing)
控制令牌通过一个节点轮流传到下一个节点,只有获取令牌的节点可以发送,大多数令牌传递构成了一个环形网络
令牌就是一个特殊帧
问题:
- 令牌的开销
- 等待时间
- 单点故障
任意一个节点故障时,令牌可能丢失
DOCSIS:用于电缆因特网接入的链路层协议
该协议用到了上述所有种类的协议,便于理解
一个电缆接入网通常通常在电缆网头端将几千个住宅电缆调制解调器与一个电缆调制解调器端接系统(CMTS)连接
DOCSIS将下行(CMTS到调制解调器)和上行(反之)网络通过FDM划分为多个频率信道,每个下行带宽为6MHz,上行为6.4最大
在下行过程中,仅有单一的CMTS传输,不存在多路问题
在上行过程中,多个调制解调器都共享上行信道,可能潜在出现碰撞(是不是就是家里宽带上行速率远小于下行的原因)
每条上行信道被划分为时间间隔,类似于TDM,每个时间间隔包含了一个微时隙序列,在该微时隙中可以向CMTS传输,CMTS规定各个调制解调器可以在指定的微时隙中进行传输
CMTS发送MAP的控制报文,指定哪个调制解调器可以传输;在调制解调器方面,需要发送包含请求帧,来请求自己需要的微时隙来发送数据
这个请求帧被放置在一个特殊的微时隙中,以随机接入的方式进行传输,因此可能出现碰撞
检测这个碰撞的方式是通过监听CMTS是否发送MAP报文响应请求帧
ARP协议
MAC地址
MAC地址(LAN地址,物理地址,以太网地址),用于局域网内部标识一个帧从哪一个接口发出,到达哪一个物理相连的地址
MAC地址是适配器上固有的,即适配器出厂时就已经确定
MAC地址在每个适配器上是独有的
ARP地址解析协议
Address Resolution Protocol
在给定IP地址的情况下,得到需要转发到的MAC地址
在每个节点上,都存有一个ARP表,表中存储了IP地址,MAC地址和TTL
同一局域网内
A想要给同局域网内的B发送一个数据报
如果B的MAC地址不在A的ARP表中,则A需要先广播ARP查询分组(MAC地址均为1),其中包含了B的IP地址,接下来局域网中的所有适配器均能接受到该广播,进而对自己的IP地址进行匹配,不匹配则不接受
B接收到该广播后返回给到A自己的MAC地址,A在接收到反馈信息后将B的MAC和IP地址存储到自己的ARP表中,再将自己的数据报发送
ARP是“即插即用”协议,节点自主创建ARP表,无需干预
从一个LAN到另一个LAN
当A需要向B发送数据报时,需要首先知道:
- B的IP地址
- R的左接口的IP地址
- R的左接口的MAC地址
发送的数据报需要包含A的源IP地址和MAC地址
而目的IP地址为B的目的IP地址,目的MAC地址需要为R的左接口(如果目的MAC是B的MAC地址,那么在局域网内所有节点收到后均会在对比自己MAC地址后遗弃,不会进行转发)
R路由器在接收到该数据报后,提取其中的ip数据报,通过查阅自己的转发表知道对应的目的IP地址需要通过哪个接口进行转发
接着R将ip数据报封装到新的数据帧中,其中源MAC地址为右接口(即发送口)的MAC地址,目的MAC地址是下一跳的MAC地址
以太网
- 总线bus
所有节点在一个冲突域中 - 星型(目前主流)
通过中心交换机,每个节点拥有单独的冲突域
无连接:发送帧的网卡和接收帧的网卡之间不存在握手过程
不可靠:接收网卡不向发送网卡发送确认消息
差错帧直接丢弃,如果高层协议(如TCP)含有确认重传等机制则可以恢复
二进制指数后退的CSMA/CD算法
CSMA/CD回顾:
- 在发送数据帧之前先监听信道,如果信道空闲则发送数据帧
如果信道忙碌则一直等待直到空闲能够发送 - 发送帧时,如果没有检测到其他节点的数据发送,则会发送直到结束
如果检测到其他节点的数据,则立即停止发送,并发送阻塞信号 - 终止发送后进入二进制指数退避
在第m次冲突后
取n = max(10,m)
从{1,2…2n-1}中随机取一个数k
等待512 * k比特的传输延迟时间,再返回第一步进行监听
在这个算法中,连续冲突的次数越多,随机等待时间就会越长
以太网帧结构
- 前导码
共八个字节,前七个字节均为10101010,第8个字节为10101011
用于发送网卡和接收网卡之间的时钟同步(一般不算前导码的长度) - 目的MAC地址&源MAC地址
各六个字节
接收端接收后检验MAC地址是否为自己需要的,需要则接收,否则抛弃 - 类型
2B,指示封装的上层协议(如IP数据报) - 数据
最小为46字节,因为CSMA/CD协议中,监听的过程必须在发送的过程中,因此在发送完成之前监听信号必须返回到达发送端,即RTT>L/R
R=10Mbps, RTTmax=512微秒,L/R=RTT
L=R * RTT=64B,len(DATA)=64-18=46 - CRC(4B)
差错检测,有差错则丢弃
以太网标准
交换机
链路层设备
实现存储-转发以太网帧
检验到达帧的MAC地址,选择性向一个或多个输出链路转发帧
利用CSMA/CD访问链路,发送帧
交换机特性:
- 透明
主机感知不到交换机的存在 - 即插即用
- 自学习
交换机:多端口间同时传输
连接到交换机的每个主机,都利用独享链路连接,该链路支持全双工
对于每个主机,都是自己构成冲突域,因此不会和其他主机冲突
交换机可以并行地与多个主机进行交换
交换机转发表
交换机通过转发表来决定每个帧将要去往哪里
交换表包含了:源MAC地址,目的MAC地址对应的接口,时间戳
自学习
交换机转发表通过自学习的方式创建
当源主机向交换机发送了数据帧时,交换机将源主机的MAC地址和对应接收到的接口记录在转发表中
交换机帧转发/过滤
- 交换机接收到数据帧时,记录源MAC地址和接收的接口到转发表中
- 检索转发表中是否包含目的MAC地址
- 如果检索到转发表中包含需要的MAC地址
如果目的MAC地址处于源接口,则丢弃该数据帧(防止环)
如果目的MAC地址不处于源接口,将数据帧转发到路由表给出的接口中
如果检索不到需要的MAC地址,那么将数据帧向所有接口(不包括源接口)进行转发
交换机互联
当网络中的主机数多时,采取交换机互联
在这样多个交换机互联的情况下,如何通过A向G发送数据帧,需要让S1知道向S4进行转发,即知道交换机之间的转发过程,这个过程也采取自学习的方式
组织机构网络
一般的组织结构网络如上图所示
路由器连接到外部网络
接着内部的交换机通过多级交换机连接到各个主机上
这样的网络内部构成IP子网,在这个子网中,任何一个节点进行广播会使得整个子网中的所有节点接收到该广播,因此又称为广播域
路由器vs交换机
两者均为存储转发设备
路由器:网络层设备(检测网络层分组的首部)
交换机:链路层设备(检测链路帧的首部)
二者均使用转发表
路由器:利用路由协议进行计算得到转发表,根据IP地址进行转发
交换机:通过自学习的方式得到转发表,根据MAC地址进行转发
可以看出,交换机相对更适应小型网络进行转发
虚拟局域网(VLAN)
在上图所示,CS EE CE之间分别连接在各自的交换机上,如果要实现隔离,通过路由器可以直接实现,然而现实中可以不使用路由器进行隔离
考虑以下问题:
- 如果CS中的一台主机需要迁移到EE中,如何实现
- 所有广播域中的节点广播(ARP,DHCP)都需要遍历整个网络,在安全性、效率上可能不满足要求
因此引入了VLAN
VLAN通过虚拟局域网将LAN中的各个主机分为不同的多个虚拟的局域网
通过将交换机的端口进行分组实现
即使EE和CS都连接在物理上同一个交换机上,实际上看作是连接到了两个不同的交换机
VLAN的特性
- 流量隔离
在VLAN划分的情况下,可以进行流量隔离,例如来自端口1-8的流量只发送往端口1-8
VLAN也可以通过MAC地址进行划分 - 动态成员
可以通过软件动态定义VLAN的成员,来实现动态管理
为了实现VLAN之间的转发,需要通过路由器连接到该交换机上,就如同连接在了两个不同的交换机中
跨越多个交换机的VLAN
上述情况考虑了通过一个交换机实现的VLAN,实际上还有跨越多个交换机的情况
实现上图中两个交换机的VLAN
如果通过多条线缆进行连接,每一条线缆都会占用两个交换机的各一个端口,在这个情况下明显效率不够
因此引入了中继端口
通过上图中空白的端口来进行两个交换机之间VLAN的交互
而如何判定归属于哪个VLAN的问题需要引入VLAN的判断信息
因此提出了802.1q协议,添加了VLAN ID来判断去往哪个VLAN
Web页面请求过程
准备:DHCP、UPD、IP和以太网
假设Bob要启动他的PC连接到学校的以太网
- Bob的PC生成一个DHCP请求报文
DHCP request 报文放入具有目的端口67和源端口68的UDP报文
源IP地址设为0.0.0.0,目的IP地址设置为255.255.255.255,即广播报文 - IP数据报被放入以太网帧中
目的MAC地址被设为FF:FF:FF:FF:FF:FF - 交换机在收到广播以太网帧后向所有端口发送广播
- 路由器接受到广播帧
路由器将以太网帧拆分得到IP数据报,发现IP数据报为广播,再将其中的UDP报文抽取出来,最后得到DHCP报文,此时DHCP服务器获取了request报文 - 服务器发送ACK报文
源IP地址设置为服务器的IP地址,源MAC设置为服务器端口的MAC地址,DHCP ACK报文中包含了DNS服务器,网关地址,分配的IP地址等信息;目的MAC地址设为PC的MAC地址 - ACK报文到达交换机
交换机在第3步时通过自学习得到了PC的端口和MAC地址,能够将该报文准确地发给PC - Bob收到ACK报文
PC将报文提取出来,获得默认网关、DNS等信息,并且获取了自己的IP地址
准备:DNS和ARP
Bob在浏览器上键入www.google.com时,浏览器通过生成一个TCP套接字开始,套接字用于向Google发送HTTP请求,为了获取Google的IP地址,需要使用DNS协议
8. Bob的PC生成一个DNS查询报文
DNS查询报文装进UDP报文中,目的端口为53,UDP报文放入IP数据报中,包含了目的IP地址,即前面获取的DNS服务器地址,以及自己的源IP地址
9. DNS请求报文装入以太网帧中
以太网帧包含了源MAC地址,但Bob不知道DNS服务器的MAC地址,因此需要使用ARP协议
10. ARP查询
Bob的PC生成一个ARP查询报文,该报文被放至在一个目的MAC地址为FF:FF:FF:FF:FF:FF的广播以太网帧,交换机将该帧交给所有连接的设备
11. ARP回答
网关路由器接受到ARP查询,将以太网帧拆分发现目的IP地址是自己的IP地址,因此发出一个ARP回答,源ip和MAC为自己,目的ip和MAC为Bob的机器,再发送给交换机,由交换机交给Bob
12. Bob收到ARP回答
Bob在期中抽取得到网关路由器的MAC地址
13. Bob的PC终于可以使用DNS查询
DNS查询的目的IP地址为DNS服务器IP地址,MAC地址为网关路由器的MAC
准备:域内路由选择到DNS服务器
- 网关路由器接收到帧并抽取IP数据报
网关路由器根据目的IP地址和自己的转发表决定需要发送给下一个路由器(Comcast网络路由器) ,并选择需要转发到这个路由器的链路 - Comcast路由器收到该帧
抽取IP数据报后根据转发表确定出接口,接着向DNS服务器逐步转发,转发表由域间协议和域内协议完成 - IP数据报到达DNS服务器
服务器在DNS数据库中找到www.google.com的IP地址,该IP地址是由源权威DNS服务器缓存的
接着DNS服务器将发送一个回答报文回到Bob - Bob的PC从DNS回答报文中抽取IP地址,准备完成
服务器交互:TCP和HTTP
- Bob生成TCP套接字时,必须向服务器执行三次握手
Bob首先向服务器的80端口发送TCP SYN报文,目的IP地址为Google的IP地址,MAC地址为网关路由器 - 在学校网络Comcast网络和谷歌网络中路由器朝着Google的地址发送
使用路由器中的转发表 - SYN数据报到达Google
Google服务器抽取SYN报文并生成一个tcp套接字与Bob连接,产生TCP SYNACK报文段
该报文段被放入IP数据报中,最后放入链路层,连接到Google的第一跳路由器 - SYNACK报文到达Bob
操作系统将其分解得到SYNACK报文,进入连接状态 - Bob准备向服务器发送字节
浏览器生成包含要获取的URL的HTTP GET请求报文,GET报文写入套接字,并放入一个数据报中,交付给到Google - www.google.com的HTTP服务器获取GET报文
生成一个HTTP响应报文,将web内容放入HTTP响应体中,并将报文放入TCP套接字中 - 回答报文通过转发回到Bob
Bob的浏览器从套接字读取HTTP响应,得到网页HTML,终于显示了Web网页