我们首先来了解一下物理层的作用。
* 物理层的主要目的是实现比特流的透明传输,为数据链路层提供服务,物理层接口解决了用几根线,多大电压,每根线什么功能,以及几根线之间是怎么协调的问题。
* 物理层介质解决了数据载体材质以及价格优缺点的问题。
* 通信技术解决了每根导线上数据传输的速度和导线上最快能传多少以及怎么高效使用导线的问题。
* 编码解决了数据变为电信号的问题。
* 交换技术解决了数据远距离传输的问题。
虽然物理层已经解决了这么多问题,但是物理层传输的数据还不够准确,而数据链路层的目的就是为了让物理层的数据传输更加可靠、更加准确。
数据链路层的作用
数据链路层在物理层和网络层的中间层,保证网路层的数据能可靠的透明的在物理层传输。
以太网的帧格式
* 源地址和目的地址是指网卡的硬件地址,即MAC地址,长度为48位,在网卡出厂时固化的。
* 帧协议类型字段有三种值,分别为IP、ARP、RARP。
* 帧末尾是CRC校验码。
MAC地址
* MAC地址是用来标识数据链路层中相连的节点。
* MAC地址6个字节,长度为2^6=48个比特位。一般用16进制数字加上冒号的形式来表示。(08:00:27:03:fb:19)
* MAC地址在网卡出厂的时候就确定了,不能修改,MAC地址通常是唯一的。(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突)
我们之前在网络层提到了IP地址,那么MAC地址和IP地址有什么区别?
其实,IP地址描述的类似于路途的起点和终点,而MAC地址描述的是路途上的每一个区间的起点和终点。就好比,我们需要到一个地方(西安-北京),我们中间可能会有一些中转站,而这些中转站就可以看作是MAC地址,而北京、西安就可以看作是IP地址。
MTU
MTU是指数据链路层向网络层发数据的最大传输单元,不同网络类型的MTU也不同,其中以太网的MTU为1500.
如果一个数据包从以太网路由到拨号链路上,数据包长度大于MTU,则需要对数据包进行分片。以太网帧的数据长度规定最小为46字节,最大为1500字节,ARP数据包长度不够46字节,就需要在后面不填充位。
MTU对IP协议的影响
受到数据链路层的MTU的限制,对于较大的IP数据包需要进行分包。
我们回顾一下IP协议报头格式:
将较大的IP包分成多个小包,并将每个小包的都填上相同的标签,即将16位标识置为相同。
每个小包IP协议的3位标识中,第2位置为0,表示允许分片,第3位表示结束标记,如果是最后一个包,第3位置1,否则只0.
到达对端再将这些包,按照顺序分组,拼接到一起返回给传输层。
一旦任意一个小包丢失,接收端的重组就会失败,IP层不会重新传输数据,会交给上一层TCP重发。所以,分包是不太好的。
MTU对UDP协议的影响
UDP传输在网络层是IP(首部为20),在传输层是UDP(首部是8),一个数据从上到下需要添加报头消息,在数据链路层不能超过1500,则UDP在传输层超过1472(1500-20-8=1472),就会在网络层分成多个IP数据报。
如果多个IP数据报有任意一个丢失,就会引起接收端网路层重组失败,UDP还没有重传机制,丢失了就丢弃了,所以,UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。
MTU对TCP协议的影响
TCP的数据报也受数据链路层MTU的影响,TCP的单个数据报的最大消息长度MSS(Max Segment Size),MSS值在TCP首部的选项中。
TCP在建立连接的过程中,通信双方会进行MSS协商。双方在发送SYN时,会在TCP头部写入自己能支持的MSS值。双方得到对方的MSS值后,选择较小的作为最终的MSS值。
MSS和MTU的关系
ARP协议
作用:将IP地址转化为MAC地址。
在网络通信中,源主机的应用程序需要知道目的主机的IP地址和端口号,但不知道目的主机的硬件地址。数据包首先是被网卡接收到再去处理上层的协议,如果接收到的数据包的硬件地址与本机不符,就直接丢弃。
每台主机都维护一个ARP缓存表(IP-MAC对照表),可以用命令:arp -a查看。
注:缓存表中有过期时间,一般为20分钟,如果20分钟内没有再次使用某个表项,则该表项失效,下次还需要发送ARP请求获得目的主机的硬件地址(MAC)。
字段 |
解释 |
帧类型 |
0800(IP数据报),0806(ARP请求/应答),8035(PARP请求/应答) |
硬件类型 |
指的是链路层网络类型,1为以太网 |
协议类型 |
指的是要转换的地址类型,0x800为IP地址 |
硬件地址长度 |
以太网的为6字节 |
协议地址长度 |
IP地址为4字节 |
OP |
为1表示ARP请求,为2表示ARP应答 |
源主机发出ARP请求,询问该IP地址的主机MAC地址,并将这个请求广播到本地以太网。目的主机接收到广播的ARP请求,发现其中IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的MAC地址写在应答包中。最后,源主机与目的主机的通过MAC地址进行通信。