OSI七层模型中的物理层和数据链路层处于模型最底部,可以说是网络协议的基层。
一、物理层(Physical)
物理层定义了接口标准、线缆标准、传输速率、传输方式等(比如路由器定义的接口是做什么的、水晶头怎么排布、光缆线的作用等)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1LDeOKLA-1623382316679)(http://blog.idbeny.com/bq7lc.jpeg@normal)]
1.1. 模拟信号、数字信号
模拟信号(Analog Signal)
- 连续的信号,适合长距离传输
- 抗干扰能力差,受到干扰时波形变形很难纠正
数字信号(Digital Signal)
- 离散的信号,不适合长距离传输
- 抗干扰能力强,受到干扰时波形失真可以修复
1.2. 数据通信模型
- 局域网通信模型
注意:网线不能超过100米(要想更远,再接一个交换机就好了)。
- 广域网通信模型
1.3. 信道(Channel)
信道:信息传输的通道,一条传输介质上(比如网线)上可以有多条信道。
单工通信
- 信号只能往一个方向传输,任何时候都不能改变信号的传输方向
- 比如无线电广播、有线电视广播
半双工通信
- 信号可以双向传输,但必须是交替进行,同一时间只能往一个方向传输
- 比如对讲机
全双工通信
- 信号可以同时双向传输
- 比如手机(打电话,听说同时进行)
二、数据链路层(Data Link)
链路:从1个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换节点。
数据链路:在一条链路上传输数据时,需要有对应的通信协议来控制数据的传输。
不同类型的数据链路,所用的通信协议可能是不同的。
- 广播信道:
CSMA/CD
协议(比如同轴电缆、集线器等组成的网络) - 点对点信道:
PPP
协议(比如2个路由器之间的信道)
数据链路层的3个基本问题:
- 封装成帧
- 透明传输
- 差错检验
2.1. 封装成帧
- 帧(Frame)的数据部分就是网络层传递下来的数据包(IP数据包,Packet)
- 最大传输单元MTU(Maximum Transfer Unit)
- 每一种数据链路层协议都规定了所能够传送的帧的数据长度上限
- 以太网的MTU为1500个字节
2.2. 透明传输
数据部分一旦出现了SOH
、EOT
,就需要进行转义。
由于在接收端在接收的时候把转义符还原了,感受不到数据的变化,所以是透明传输。
2.3. 差错检验
- 数据链路层首部是帧首部的一部分
FCS
是帧尾部的一部分,FCS
是根据数据部分+数据链路层首部
计算得出的- 接收端接收到信息后会计算出
FCS
并进行比较,如果发现不一致,网卡就会把这条信息丢弃(抓包工具也抓不到)
数据经过不同的数据链路层,对应的层会把之前的帧开始和结束符替换为自己的协议帧。
2.4. CSMA/CD协议
CSMA/CD(Carrier Sense Multiple Access with Collision Detectio),载波侦听多路访问/冲突检测(主要是为了支持单工通信和半双工通信)。
使用了CSMA/CD的网络可以称为是以太网(Ethernet),它传输的是以太网帧。
- 以太网帧的格式有:Ethernet V2标准、IEEE的802.3标准
- 使用最多的是:Ethernet V2标准
为了能够检测正在发送的帧是否产生了冲突,以太网的帧至少要64字节。
原因:如果A主机发送的帧很小,很快完成帧的发送,而两台冲突主机相距很远。在主机A发送的帧传输到B的前一刻,B开始发送帧。这样,当A的帧到达B时,B检测到冲突,于是发送冲突信号。假如在B的冲突信号传输到A之前,A的帧已经发送完毕,那么A将检测不到冲突而误认为已发送成功(有可能是碰撞导致的原数据回弹,也可能是B发送的冲突信号)。为了保证A在发送帧过程中产生冲突时还能接收到冲突信号,帧就必须足够长(大于A到B的距离),必须在B接收到帧的时候,A还处在发送帧的状态,这时候B如果发现冲突,A接收到冲突信号后就知道正在发送的帧有冲突了。因此必须有最小包长的限制(64字节是信道长度的两倍)。定义最小帧长度是为了使发送方能在一个帧的传输时间内检测到此帧是否在链路上产生冲突,如发生冲突,退避重发。在最小帧长度内没发生冲突后,此帧就不再会发生冲突,在随后的发送中链路中其他节点都可检测到此链路上的信号,即发送方占据此信道,为了避免单一主机占用信道过长,则规定了以太网的最大帧长是1518字节。
用交换机组件的网络,已经支持全双工通信,不需要再使用CSMA/CD,但它传输的帧依然是以太网帧。所以,用交换机组建的网络,依然可以叫做以太网。
2.5. Ethernet V2帧的格式
- 首部:目标MAC地址 + 源MAC地址 + 网络类型(IPV4/IPV6)
- 以太网帧:首部 + 数据 + FCS
- 数据的长度至少是:
64 - 6 - 6 - 2 - 4 = 46字节
以太网帧是没有帧开始和结束符的,但是以太网使用曼彻斯特编码,接收端接收帧过程只要发现没有信号跳变,就认为帧结束。但是在物理层是有帧开始定界符的。
当数据部分(从网络层传入的数据)的长度小于46字节时,数据链路层会在数据的后面加入一些字节填充,接收端会将添加的字节去掉。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NIZsgNQr-1623382316751)(http://blog.idbeny.com/5tmp6.png@normal)]
长度总结:
- 以太网帧的数据长度:
46 ~ 1500字节
- 以太网帧的长度:
64 ~ 1518字节(源MAC + 目标MAC + 网络类型 + 数据 + FCS)
2.6. PPP协议(Point to Point Protocol)
- Frame(F):PPP协议是有帧开始和结束符的,
0x7E
- Address(A):图中的值是
0xFF
,形同虚设,点到点信道不需要源MAC、目标MAC地址 - Control(C):图中的值是
0x03
,目前没有什么作用 - Protocol(协议):内部用到的协议类型(PPP协议的子分支协议)
虽然PPP帧和以太网帧的协议不一样,但是网络层的数据是一样的,仅仅是帧的首部和尾部发生了变化。
路由器和路由器直连时是PPP帧,如果在两个路由器之间加一个交换机,就不是PPP帧了,而是以太网帧。因为路由器之间是点对点,不需要知道对方的MAC地址,但是以太网帧是广播信道,每一台设备必须确认自己是否是接收方。
PPP协议也是需要进行字节填充的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPwDOw0n-1623382316760)(http://blog.idbeny.com/9yxg8.png@normal)]
- 将
0x7E
替换成0x7D5E
- 将
0x7D
替换成0x7D5D
2.7. 网卡
网卡接收到一个帧,首先会进行差错校验,如果校验通过则接收,否则丢弃。
Wireshark抓到的帧没有FCS,因为它抓到的是差错校验通过的帧,帧尾的FCS会被硬件去掉,所以抓不到差错校验失败的帧。