一、数据链路层解决的问题
IP拥有将数据跨网络从一台主机送到另一台主机的能力,但IP并不能保证每次都能够将数据可靠的送到对端主机,因此IP需要上层TCP协议为其提供可靠性保证。如数据丢包后TCP让IP重发数据,最终在TCP提供的可靠性机制下IP就能够保证将数据可靠的发送到对端主机
但数据在网络传输时需要一跳一跳的从一台主机跳到另一台主机,最终才能将数据转发到目标主机,因此要将数据发送到目标主机的前提是,需要先将数据转发给与当前主机直接相连的下一跳主机。两台主机直接相连也意味着两台主机属于同一网段,因此将数据转发到下一跳主机实际是局域网通信,这也是链路层需要解决的问题
网络层IP提供的是跨网络发送数据的能力,传输层TCP是为数据发送提供可靠性保证的,而链路层解决的则是两台相连主机之间的通信问题
二、以太网协议
2.1 认识以太网
局域网技术
不同局域网所采用的通信技术可能是不同的,常见的局域网技术有以下三种:
以太网:以太网是一种计算机局域网技术,应用最普遍
令牌环网:令牌环网常用于IBM系统中,在这种网络中有一种专门的帧称为"令牌",在环路上持续地传输来确定一个节点何时可以发送包
无线LAN/WAN:无线局域网是有线网络的补充和扩展,现在已是计算机网络的一个重要组织部分
虽然网络中各个局域网所采用的通信技术可能的不同的,但是IP屏蔽了底层网络的差异,对于网络通信双方的IP层及其往上的协议而言,并不需要关心底层具体使用的是哪种局域网技术
数据在发送之前先进行数据封装,此时数据链路层给数据封装上对应的局域网的报头
若数据要进行跨网络传输,那么就需经过路由器转发
当数据在路由器数据链路层进行向上交付时,会将该数据对应的局域网报头去掉
而当路由器该数据转发给下一跳之前,又会给该数据封装下一跳网络所对应的局域网报头
网络中的路由器会不断去掉数据旧的局域网报头,并添加上新的局域网报头,因此数据在进行跨网络传输时,就算所需跨越的网络采用的是不同的局域网技术,最终也能够正确实现跨越
以太网通信原理
"以太网"不是一种具体的网络,而是一种技术标准。既包含了数据链路层的内容,也包含了部分物理层的内容。如:以太网规定了网络拓扑结构,访问控制方式,传输速率等
以太网中的网线必须使用双绞线,传输速率有10M,100M,1000M等
以太网中所有的主机共享一个通信信道,当局域网中的一台主机发出数据后,该局域网中的所有主机都能够收到该数据
如当局域网中的主机A想要发送数据给主机B时,其实局域网中的每一台主机都能收到主机A发出去的数据,只不过最终只有主机B会将主机A发来的数据向上进行交付
局域网中的其他主机虽然也收到了主机A发出的数据,但经过识别后发现这个数据不是发送给自己的,于是就会直接将该数据丢弃而不会向上进行交付
即在进行局域网通信的时候,局域网中的所有主机都能够看到局域网中传输的任何数据,只不过每个主机都只关心发送给自己的数据罢了
扩展:
网络抓包不仅能够抓到发送给本机的报文数据,也能抓取到发给其他机器的报文数据,实际就是因为在进行网络抓包时,主机将从局域网中收到的所有报文数据都向上交付了而已
网卡有一种模式叫做混杂模式,被设置为混杂模式的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它
碰撞避免算法
由于以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰。站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用
对于这个问题,以太网的做法就是先不限制各个主机发送数据的能力,局域网中的每个主机想发数据的时候直接发,但是只要发送出去的数据与其他主机发送的数据产生了碰撞,就执行碰撞避免算法
碰撞避免算法:当主机发送出去的数据产生碰撞时,该主机等待随机时间(避免再次碰撞)后再进行数据重发,在主机等待的时候就能够就能够尽可能让局域网中的数据消散
以太网中主机发送的数据产生碰撞后该主机会执行碰撞避免算法,所以说以太网是基于碰撞区和碰撞检测的局域网通信标准
碰撞避免算法就是主机等待一段时间后重新发送数据,因此以太网底层也有重传机制,只不过以太网的重传机制只是为了保证将数据从局域网中的一台主机发送到另一台主机
令牌环网
令牌环网(Token-ring network)的传输方法在物理上采用了星形拓扑结构,但逻辑上是环形拓扑结构
令牌环网的通信传输介质可以是无屏蔽双绞线、屏蔽双绞线和光纤等
令牌环网中各节点间采用多站访问部件(Multistation Access Unit,MAU)连接在一起,MAU是一种专业化集线器,用来围绕工作站计算机的环路进行传输
在令牌环网中有一种专门的帧被称为"令牌","令牌"会在环路上持续地传输,只有拿到"令牌"的主机才能发送数据,因此数据不会发生碰撞
令牌环网中的"令牌"就像系统中用于保护临界资源的互斥锁,"令牌"与互斥锁一样也有"忙"和"闲"两种状态,"忙"表示令牌已被占用,"闲"则表示令牌没有被占用
想要发送数据的计算机必须首先检测到"闲"令牌,并将其置为"忙"状态,然后才可以发送数据,与申请互斥锁的过程类似
由于"令牌"在网环上是按顺序依次传递的,因此对于所有入网的计算机而言,获取令牌的机会相等,因此不会造成饥饿问题
2.2 以太网帧格式
源地址和目的地址是指网卡的硬件地址(即MAC地址,网卡出厂时固化),长度是48位
帧协议类型字段有三种值,分别对应IP协议、ARP协议和RARP协议
帧末尾是CRC校验码
MAC帧如何将报头与有效载荷进行分离?
以太网MAC帧的帧头和帧尾都是固定长度的。当底层收到一个MAC帧后,提取出MAC帧中固定长度的帧头和帧尾,剩下的就是有效载荷
MAC帧如何决定将有效载荷交付给上层的哪一个协议?
以太网MAC帧对应的上层协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需确定将分离出来的有效载荷交付给上层的哪个协议
在MAC帧的帧头中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可
举例理解
假设局域网中的主机A想要将IP数据报发送给同一局域网中的主机B,那么主机A封装MAC帧中的目的地址就是主机B的MAC地址,源地址就是主机A的MAC地址,而帧协议的类型对应就是0800,紧接着就是要发送的IP数据报,帧尾部分对应CRC校验
当主机A将该MAC帧发送到局域网中后,局域网当中的所有主机都可以收到这个MAC帧,包括主机A自己
主机A收到该MAC帧后,对收到的MAC帧进行CRC校验,若校验失败则说明数据发送过程中产生了碰撞,此时主机A就会执行碰撞避免算法,后续进行MAC帧重发
主机B收到该MAC帧后,提取出MAC帧中的目的地址,发现该目的地址与自己的MAC地址相同,于是在CRC校验成功后就将有效载荷交付给上层IP层进行进一步处理
局域网中的其他主机收到该MAC帧后,也会提取出MAC帧中的目的地址,但发现该目的地址与自己的MAC地址不匹配,于是就会直接将这个MAC帧丢弃
即当底层收到一个MAC帧后,会根据MAC帧中的目的地址来判断该MAC帧是否是发给自己的,若是发送给自己的则会再对其进行CRC校验,若校验成功则会根据该MAC帧的帧协议类型,将该MAC交付给对应的上层协议进行处理
2.3 MAC地址
2.3.1 认识MAC地址
MAC地址用来识别数据链路层中相连的节点
长度为48位,即6个字节,一般用16进制数字加上冒号的形式来表示。如:08:00:27:03:fb:19
在网卡出厂时就确定了,不能修改,MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址)
可以使用 ifconfig 命令来查看MAC地址
2.3.2 对比MAC地址和IP地址
数据在路由过程中会存在两套地址,源IP地址和目的IP地址,源MAC地址和目的MAC地址
IP地址描述的是路途总体的起点和终点
MAC地址描述的是路途上的每一个区间的起点和终点
数据在路由过程中,源IP地址和目的IP地址可以理解成是不会变化的(其实可能会发生变化,NAT技术),而数据每进行一跳后其源MAC地址和目的MAC地址都会变化