零、前言
本章主要讲解Linux网络中的数据链路层-以太网协议
一、数据链路层
- 示图:
- 数据传输大部分是跨网段进行的,而多个主机共同组成一个网段,不同的网段通过路由器连接(路由器同样也是主机),所以数据跨网段传输实质就是数据在主机间传输
- 网络层IP提供的是跨网络发送数据的能力,而链路层解决的则是两台主机在同网段间的通信问题,即用于两个设备(同一种数据链路节点)之间的数据传递
二、以太网协议
1、认识以太网
- “以太网” 不是一种具体的网络,而是一种技术标准,既包含了数据链路层的内容,也包含了一些物理层的内容
- 例如规定了网络拓扑结构,访问控制方式,传输速率等,例如以太网中的网线必须使用双绞线,传输速率有10M, 100M, 1000M等
- 以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等
- 常见局域网技术:
- 以太网:以太网是一种计算机局域网技术,一种应用最普遍的局域网技术
- 令牌环网:令牌环网常用于IBM系统中,在这种网络中有一种专门的帧称为“令牌”,在环路上持续地传输来确定一个节点何时可以发送包
- 无线LAN/WAN:无线局域网是有线网络的补充和扩展,现在已经是计算机网络的一个重要组织部分
注:虽然网络中各个局域网所采用的通信技术可能的不同的,但是IP屏蔽了底层网络的差异(数据进行路由选择时需要通过IP层,IP层根据分发的局域网的技术进行对应的封装),对于网络通信双方的IP层及其往上的协议来说,它们并不需要关心底层具体使用的是哪种局域网技术
2、以太网原理
- 以太网中所有的主机共享一个通信信道,当局域网中的一台主机发出数据后,该局域网中的所有主机都能够收到该数据,只不过每个主机都只关心发送给自己的数据罢了
- 因为以太网共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰,数据相互碰撞后成为垃圾数据
- 站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用
- 局域网中的每个主机发送出去的数据与其他主机发送的数据产生了碰撞,就会执行碰撞避免算法,等待一段时间后再进行数据重发
注:网络抓包不仅能够抓到发送给自己的报文数据,也能抓取到发给别人的报文数据,实际就是因为在进行网络抓包时,主机将从局域网中收到的所有报文数据都向上交付了而已;网卡有一种模式叫做混杂模式,被设置为混杂模式的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它
3、以太网格式
- 示图:
- 说明:
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的
- 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
- 帧末尾是CRC校验码
注:收到MAC帧后,对收到的MAC帧进行CRC校验,如果校验失败则说明数据发送过程中产生了碰撞
- MAC帧如何将报头与有效载荷进行分离:
以太网MAC帧的帧头和帧尾都是固定长度的,因此当底层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了
- MAC帧如何决定将有效载荷交付:
在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可
4、MAC地址
- MAC地址:
- MAC地址用来识别数据链路层中相连的节点
- 长度为48位,即6个字节,一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改,mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)
- 理解MAC地址和IP地址:
- IP地址描述的是路途总体的起点和终点(标识数据的发起位置和目标位置)
- MAC地址描述的是路途上的每一个区间的起点和终点(标识数据发出到接收中途经过的位置)
注:源IP地址和目的IP地址可以理解成是不会变化的,而数据源MAC地址和目的MAC地址都会变化;实际数据在路由过程中,源IP地址和目的IP地址也可能会发生变化(NAT技术)
5、认识MTU
- MTU概念:
- MTU相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层产生的限制
- 以太网帧中的数据长度规定最小46字节,最大1500字节;ARP数据包的长度不够46字节,要在后面补填充位
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)
- MTU对IP协议的影响:
- 由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包
- 将较大的IP包分成多个小包, 并给每个小包打上标签
- 每个小包IP协议头的 16位标识(id) 都是相同的
- 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0)
- 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层
- 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败,但是IP层不会负责重新传输数据(TCP协议会负责进行丢包重传)
- MTU对UDP协议的影响:
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败
- 那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了(并且UDP不会进行丢包重传)
- MTU对于TCP协议的影响:
- TCP的一个数据报也不能无限大,还是受制于MTU,TCP的单个数据报的最大消息长度, 称为MSS(MaxSegment Size)
- TCP在建立连接的过程中, 通信双方会进行MSS协商
- 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值
- 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS
- MSS的值就是在TCP首部的40字节变长选项中(kind=2)
- MSS和MTU的关系:
- 查看硬件地址和MTU:
使用ifconfig命令, 即可查看ip地址, mac地址, 和MTU
三、ARP协议
ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议
- 示图:
- ARP协议的作用:
- ARP协议建立了主机 IP地址 和 MAC地址 的映射关系
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃,因此在通讯前必须获得目的主机的硬件地址
- ARP协议的工作流程:
- 过程说明:
- 源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播)
- 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中
- 实际不是每次要获取对方的MAC地址时都需要发起ARP请求,每次发起ARP请求后都会建立对应主机IP地址和MAC地址的映射关系,每台主机都维护了一个ARP缓存表,我们可以用
arp -a
命令进行查看
- ARP数据报的格式:
- 说明:
- 硬件类型指链路层网络类型,1为以太网
- 协议类型指要转换的地址类型,0x0800为IP地址
- 硬件地址长度对于以太网地址为6字节
- 协议地址长度对于和IP地址为4字节
- op字段为1表示ARP请求,op字段为2表示ARP应答
注:源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的
- 在进行局域网通信时,为什么不直接以广播的方式发送数据:
- 对于局域网当中的大多数主机来说,收到的这个报文其实早就应该被丢弃,而现在这个报文却交付到了IP层,这对网络资源和系统资源来说都是一种浪费
- 如果无脑使用广播的方式来进行数据的发送,会使得广播和单播的概念变得模糊不清,你明明是想发送数据给局域网当中的一台主机,但你却采用了广播的方式,这显然是不合理的
注: ARP属于局域网通信的协议标准,因此一台主机不能跨网络向另一台主机发起ARP请求
四、RARP协议
- RARP(Reverse Address Resolution Protocol,反向地址转换协议),是根据MAC地址获取IP地址的一个TCP/IP协议
- 也就是说,某些情况下我们可能只知道一台主机的MAC地址,此时要得知该主机的IP地址就可以使用RARP协议
- 理论上来说,RARP协议一定比ARP协议简单,因为既然我们已经知道一台主机的MAC地址了,那么我们就已经可以直接向给主机发送消息了,因此我们可以直接发消息询问对方的IP地址就行了