2019-04-21 10:36:08 +08:00
<!-- GFM - TOC -->
2019-03-27 20:57:37 +08:00
* [基本问题 ](#基本问题 )
* [1. 封装成帧 ](#1-封装成帧 )
* [2. 透明传输 ](#2-透明传输 )
* [3. 差错检测 ](#3-差错检测 )
* [信道分类 ](#信道分类 )
* [1. 广播信道 ](#1-广播信道 )
* [2. 点对点信道 ](#2-点对点信道 )
* [信道复用技术 ](#信道复用技术 )
* [1. 频分复用 ](#1-频分复用 )
* [2. 时分复用 ](#2-时分复用 )
* [3. 统计时分复用 ](#3-统计时分复用 )
* [4. 波分复用 ](#4-波分复用 )
* [5. 码分复用 ](#5-码分复用 )
* [CSMA/CD 协议 ](#csmacd-协议 )
* [PPP 协议 ](#ppp-协议 )
* [MAC 地址 ](#mac-地址 )
* [局域网 ](#局域网 )
* [以太网 ](#以太网 )
* [交换机 ](#交换机 )
* [虚拟局域网 ](#虚拟局域网 )
2019-04-21 10:36:08 +08:00
<!-- GFM - TOC -->
2019-03-27 20:57:37 +08:00
# 基本问题
## 1. 封装成帧
2019-03-09 08:07:55 +08:00
将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束。
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/29a14735-e154-4f60-9a04-c9628e5d09f4.png" width = "300" / > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
## 2. 透明传输
2019-03-09 08:07:55 +08:00
透明表示一个实际存在的事物看起来好像不存在一样。
帧使用首部和尾部进行定界,如果帧的数据部分含有和首部尾部相同的内容,那么帧的开始和结束位置就会被错误的判定。需要在数据部分出现首部尾部相同的内容前面插入转义字符。如果数据部分出现转义字符,那么就在转义字符前面再加个转义字符。在接收端进行处理之后可以还原出原始数据。这个过程透明传输的内容是转义字符,用户察觉不到转义字符的存在。
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/e738a3d2-f42e-4755-ae13-ca23497e7a97.png" width = "500" / > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
## 3. 差错检测
2019-03-09 08:07:55 +08:00
目前数据链路层广泛使用了循环冗余检验( CRC) 来检查比特差错。
2019-03-27 20:57:37 +08:00
# 信道分类
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
## 1. 广播信道
2019-03-09 08:07:55 +08:00
一对多通信,一个节点发送的数据能够被广播信道上所有的节点接收到。
所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞)。
2019-03-27 20:57:37 +08:00
主要有两种控制方法进行协调,一个是使用信道复用技术,一是使用 CSMA/CD 协议。
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
## 2. 点对点信道
2019-03-09 08:07:55 +08:00
一对一通信。
2019-03-27 20:57:37 +08:00
因为不会发生碰撞,因此也比较简单,使用 PPP 协议进行控制。
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
# 信道复用技术
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
## 1. 频分复用
2019-03-09 08:07:55 +08:00
频分复用的所有主机在相同的时间占用不同的频率带宽资源。
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/4aa5e057-bc57-4719-ab57-c6fbc861c505.png" width = "350" / > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
## 2. 时分复用
2019-03-09 08:07:55 +08:00
时分复用的所有主机在不同的时间占用相同的频率带宽资源。
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/67582ade-d44a-46a6-8757-3c1296cc1ef9.png" width = "350" / > < / div > < br >
2019-03-09 08:07:55 +08:00
使用频分复用和时分复用进行通信,在通信的过程中主机会一直占用一部分信道资源。但是由于计算机数据的突发性质,通信过程没必要一直占用信道资源而不让出给其它用户使用,因此这两种方式对信道的利用率都不高。
2019-03-27 20:57:37 +08:00
## 3. 统计时分复用
2019-03-09 08:07:55 +08:00
是对时分复用的一种改进,不固定每个用户在时分复用帧中的位置,只要有数据就集中起来组成统计时分复用帧然后发送。
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/6283be2a-814a-4a10-84bf-9592533fe6bc.png" width = "350" / > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
## 4. 波分复用
2019-03-09 08:07:55 +08:00
光的频分复用。由于光的频率很高,因此习惯上用波长而不是频率来表示所使用的光载波。
2019-03-27 20:57:37 +08:00
## 5. 码分复用
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
为每个用户分配 m bit 的码片,并且所有的码片正交,对于任意两个码片 < img src = "https://latex.codecogs.com/gif.latex? \vec{S}" class = "mathjax-pic" /> 和 < img src = "https://latex.codecogs.com/gif.latex? \vec{T}" class = "mathjax-pic" /> 有
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
<!-- <div align="center"><img src="https://latex.codecogs.com/gif.latex? \frac{1}{m} \vec{S} \cdot \vec{T}=0" class="mathjax-pic"/></div> <br> -->
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/308a02e9-3346-4251-8c41-bd5536dab491.png" width = "100px" > < / div > < br >
为了讨论方便,取 m=8, 设码片 < img src = "https://latex.codecogs.com/gif.latex? \vec{S}" class = "mathjax-pic" /> 为 00011011。在拥有该码片的用户发送比特 1 时就发送该码片,发送比特 0 时就发送该码片的反码 11100100。
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
在计算时将 00011011 记作 (-1 -1 -1 +1 +1 -1 +1 +1),可以得到
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
<!-- <div align="center"><img src="https://latex.codecogs.com/gif.latex? \frac{1}{m} \vec{S} \cdot \vec{S}=1" class="mathjax-pic"/></div> <br> -->
<!-- <div align="center"><img src="https://latex.codecogs.com/gif.latex? \frac{1}{m} \vec{S} \cdot \vec{S'}=-1" class="mathjax-pic"/></div> <br> -->
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/6fda1dc7-5c74-49c1-bb79-237a77e43a43.png" width = "100px" > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/e325a903-f0b1-4fbd-82bf-88913dc2f290.png" width = "100px" > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
其中 < img src = "https://latex.codecogs.com/gif.latex? \vec{S'}" class = "mathjax-pic" /> 为 < img src = "https://latex.codecogs.com/gif.latex? \vec{S}" class = "mathjax-pic" /> 的反码。
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
利用上面的式子我们知道,当接收端使用码片 < img src = "https://latex.codecogs.com/gif.latex? \vec{S}" class = "mathjax-pic" /> 对接收到的数据进行内积运算时,结果为 0 的是其它用户发送的数据,结果为 1 的是用户发送的比特 1, 结果为 -1 的是用户发送的比特 0。
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
码分复用需要发送的数据量为原先的 m 倍。
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/99b6060e-099d-4201-8e86-f8ab3768a7cf.png" width = "500px" > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
# CSMA/CD 协议
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
CSMA/CD 表示载波监听多点接入 / 碰撞检测。
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
- **多点接入** :说明这是总线型网络,许多主机以多点的方式连接到总线上。
- **载波监听** :每个主机都必须不停地监听信道。在发送前,如果监听到信道正在使用,就必须等待。
- **碰撞检测** :在发送中,如果监听到信道已有其它主机正在发送数据,就表示发生了碰撞。虽然每个主机在发送数据之前都已经监听到信道为空闲,但是由于电磁波的传播时延的存在,还是有可能会发生碰撞。
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
记端到端的传播时延为 τ,最先发送的站点最多经过 2τ 就可以知道是否发生了碰撞,称 2τ 为 **争用期** 。只有经过争用期之后还没有检测到碰撞,才能肯定这次发送不会发生碰撞。
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
当发生碰撞时,站点要停止发送,等待一段时间再发送。这个时间采用 **截断二进制指数退避算法** 来确定。从离散的整数集合 {0, 1, .., (2< sup > k</ sup > -1)} 中随机取出一个数,记作 r, 然后取 r 倍的争用期作为重传等待时间。
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/19d423e9-74f7-4c2b-9b97-55890e0d5193.png" width = "400" / > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
# PPP 协议
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
互联网用户通常需要连接到某个 ISP 之后才能接入到互联网, PPP 协议是用户计算机和 ISP 进行通信时所使用的数据链路层协议。
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/e1ab9f28-cb15-4178-84b2-98aad87f9bc8.jpg" width = "300" / > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
PPP 的帧格式:
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
- F 字段为帧的定界符
- A 和 C 字段暂时没有意义
- FCS 字段是使用 CRC 的检验序列
- 信息部分的长度不超过 1500
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/759013d7-61d8-4509-897a-d75af598a236.png" width = "400" / > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
# MAC 地址
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
MAC 地址是链路层地址,长度为 6 字节( 48 位),用于唯一标识网络适配器(网卡)。
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因此就有两个 MAC 地址。
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
# 局域网
2019-03-09 08:07:55 +08:00
局域网是一种典型的广播信道,主要特点是网络为一个单位所拥有,且地理范围和站点数目均有限。
2019-03-27 20:57:37 +08:00
主要有以太网、令牌环网、FDDI 和 ATM 等局域网技术,目前以太网占领着有线局域网市场。
2019-03-09 08:07:55 +08:00
可以按照网络拓扑结构对局域网进行分类:
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/807f4258-dba8-4c54-9c3c-a707c7ccffa2.jpg" width = "800" / > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
# 以太网
2019-03-09 08:07:55 +08:00
以太网是一种星型拓扑结构局域网。
2019-03-27 20:57:37 +08:00
早期使用集线器进行连接,集线器是一种物理层设备, 作用于比特而不是帧,当一个比特到达接口时,集线器重新生成这个比特,并将其能量强度放大,从而扩大网络的传输距离,之后再将这个比特发送到其它所有接口。如果集线器同时收到两个不同接口的帧,那么就发生了碰撞。
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
目前以太网使用交换机替代了集线器,交换机是一种链路层设备,它不会发生碰撞,能根据 MAC 地址进行存储转发。
2019-03-09 08:07:55 +08:00
以太网帧格式:
2019-03-27 20:57:37 +08:00
- **类型** :标记上层使用的协议;
- **数据** :长度在 46-1500 之间,如果太小则需要填充;
- **FCS** :帧检验序列,使用的是 CRC 检验方法;
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/164944d3-bbd2-4bb2-924b-e62199c51b90.png" width = "500" / > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
# 交换机
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
交换机具有自学习能力,学习的是交换表的内容,交换表中存储着 MAC 地址到接口的映射。
2019-03-09 08:07:55 +08:00
正是由于这种自学习能力,因此交换机是一种即插即用设备,不需要网络管理员手动配置交换表内容。
2019-03-27 20:57:37 +08:00
下图中,交换机有 4 个接口,主机 A 向主机 B 发送数据帧时,交换机把主机 A 到接口 1 的映射写入交换表中。为了发送数据帧到 B, 先查交换表, 此时没有主机 B 的表项,那么主机 A 就发送广播帧,主机 C 和主机 D 会丢弃该帧,主机 B 回应该帧向主机 A 发送数据包时,交换机查找交换表得到主机 A 映射的接口为 1, 就发送数据帧到接口 1, 同时交换机添加主机 B 到接口 2 的映射。
2019-03-09 08:07:55 +08:00
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/a4444545-0d68-4015-9a3d-19209dc436b3.png" width = "800" / > < / div > < br >
2019-03-09 08:07:55 +08:00
2019-03-27 20:57:37 +08:00
# 虚拟局域网
2019-03-09 08:07:55 +08:00
虚拟局域网可以建立与物理位置无关的逻辑组,只有在同一个虚拟局域网中的成员才会收到链路层广播信息。
2019-03-27 20:57:37 +08:00
例如下图中 (A1, A2, A3, A4) 属于一个虚拟局域网, A1 发送的广播会被 A2、A3、A4 收到,而其它站点收不到。
使用 VLAN 干线连接来建立虚拟局域网,每台交换机上的一个特殊接口被设置为干线接口,以互连 VLAN 交换机。IEEE 定义了一种扩展的以太网帧格式 802.1Q,它在标准以太网帧上加进了 4 字节首部 VLAN 标签,用于表示该帧属于哪一个虚拟局域网。
2019-04-23 17:49:10 +08:00
< div align = "center" > < img src = "https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/e98e9d20-206b-4533-bacf-3448d0096f38.png" width = "500" / > < / div > < br >
2019-03-27 20:57:37 +08:00
2019-04-21 00:17:45 +08:00
</ br >< div align = "center" > 🎨️欢迎关注我的公众号 CyC2018, 在公众号后台回复关键字 **资料** 可领取复习大纲,这份大纲是我花了一整年时间整理的面试知识点列表,不仅系统整理了面试知识点,而且标注了各个知识点的重要程度,从而帮你理清多而杂的面试知识点。可以说我基本是按照这份大纲来进行复习的,这份大纲对我拿到了 BAT 头条等 Offer 起到很大的帮助。你们完全可以和我一样根据大纲上列的知识点来进行复习,就不用看很多不重要的内容,也可以知道哪些内容很重要从而多安排一些复习时间。</ div ></ br >
2019-03-27 20:57:37 +08:00
< div align = "center" > < img width = "180px" src = "https://cyc-1256109796.cos.ap-guangzhou.myqcloud.com/%E5%85%AC%E4%BC%97%E5%8F%B7.jpg" > < / img > < / div >