数据链路层 和 ARP协议
以太网
以太网不是网络,而是技术标准,规定了数据链路层和物理层的内容,比如数据链路层的协议格式,再比如物理层数据信号以双绞线传输
以太网帧格式
以太网数据链路层报文又称为以太网帧,也叫mac帧,mac帧有帧头和帧尾
1、源地址、目的地址:源主机网卡mac地址和目的主机网卡mac地址
2、类型:mac帧类型,有三种,分别是 IP(0x0800)、ARP(0x0806)、RARP(0x8035);
3、CRC:CRC校验码处于帧末尾
4、mac帧的有效载荷长度限制为46字节~1500字节
mac地址
1、mac地址是网卡的物理地址,在网卡出厂时就确定了
2、mac地址是6个字节,一般用16进制加冒号来表示(例如:08:00:27:03:fb:19)
3、ip地址描述的是通信路途的起点和终点,mac地址描述的是通信路途中一个网段的起点和终点
MTU
mtu是数据链路层对有效载荷的最大长度限制,对于ip类型mac帧,那就是交给数据链路层的ip报文长度不能大于1500
1、以太网帧中的有效载荷长度规定最小 46 字节,最大 1500 字节,ARP 数据包的长度是28字节,不 够 46 字节,要在后面补填充18位
2、不同的数据链路层标准的 MTU 是不同的
3、可以通过ifconfig查看网卡接口的mtu值
mtu对ip层的影响
由于数据链路层限制有效载荷长度,所以ip报文最大长度就是1500字节,如果IP报文长度大于该值,那IP层就要对原始ip报文分片,然后将分片ip报文交给数据链路层
分片步骤:
1、将原始IP报文的有效载荷按(mtu-IP报头长度)进行分片,然后每一片有效载荷都封装上ip报头,设置其首部校验和、唯一标识、标志、片偏移等
2、按片偏移顺序交给数据链路层然后封装mac帧发送
一个3000字节的IP报文,IP报头20字节,tcp报头20字节,将2980的ip报文有效载荷按(mtu-IP报头长度)=1480 进行分片,那于是分片大小为1480,1480,20,然后每个有效载荷都加上IP报头,那就是1500,1500,40 长度的分片ip报文,然后按片偏移顺序交给数据链路层封装mac帧报头最后发出就是了
最终正确的分片:
1500字节:20头 + 1480数据 (MF=1, 偏移=0)
1500字节:20头 + 1480数据 (MF=1, 偏移=185)
40字节:20头 + 20数据 (MF=0, 偏移=370)
mtu对传输层协议的影响
对udp协议:
一旦udp报文大小超过(mtu-ip报头长度)=1480,那就在IP层要进行分片,倘若接收端收到的分片不齐,那就要将分片链表丢弃,因为udp没有可靠传输的超时重传和确认应答机制,所以也不会自动重发,必须依靠程序员在应用层做好重传工作
tcp协议:
如果分片的话,一旦一个分片ip报文丢失,那整个分片链表都要丢弃,那其他的报文就白传输了,所以tcp协议采取mss来限制tcp报文的有效载荷长度,这样封装的IP报文就无需分片,即使出现丢包,也只需重传丢的包即可。
MSS是tcp报文的有效载荷最大值,如果超过该值,那ip报文就要分片,其关系是mss = mtu - ip报头长度 - tcp报头长度。tcp进行三次握手建立连接过程中,双方会在SYN包的选项中携带自己的MSS大小了,最后双方会选择较小的一个作为最终的MSS
MTU和MSS的关系
ARP协议
ARP协议是一个介于网络层和数据链路层之间的协议,用于已知下一跳ip的情况下获取其mac地址,RARP是反向ARP,也就是已知mac地址获取ip地址
arp协议的结构
arp协议是基于数据链路层协议工作的,arp报文共28字节,arp类型的mac帧,前有mac头,后有mac尾
1、2字节硬件类型:数据链路层协议类型,如以太网协议,用1表示
2、2字节协议类型:网络层协议类型,如IPV4用0x0800表示
3、1字节硬件地址长度:数据链路层协议地址长度,以太网协议mac地址那就是6字节,直接就是6
4、1字节协议地址长度:网络层协议地址长度,如IPV4地址长度就是4字节,直接就是4
5、2字节op操作类型:1表示arp请求,2表示arp应答
6、剩下的没什么好说,唯一要说的就是利用arp类型mac帧获取下一跳ip的mac地址的过程:
数据链路层是先查arp缓存,没有查到下一跳ip的mac地址,那就需要构建arp类型的mac帧,arp报文从头到尾,硬件类型也就是数据链路层协议类型,填个1,协议类型也就是网络层协议类型,填个0x0800,硬件地址长度就是mac地址长度,填个6,协议地址长度就是IPV4地址长度,填个4,op操作类型是arp请求,填个1,源mac地址就是发送端网卡mac地址,目的mac地址是ff:ff:ff:ff:ff:ff广播mac地址,源ip地址就是发送端网卡ip,目的ip就是下一跳ip,然后这是arp报文,然后封装mac帧,源mac地址是发送端网卡mac地址,目的mac地址是ff:ff:ff:ff:ff:ff广播mac地址,帧类型arp类型mac帧,填个0x0806,最后给帧尾加上crc校验码,然后写进网卡发送缓冲区,写网卡TDT寄存器,然后网卡DMA读出,利用HVY转成光电信号发到局域网中,当其他主机接收后,网卡检查mac头的目的mac地址,是广播地址没问题,crc校验码验算过后也没问题,写进网卡接收缓冲区,触发硬件中断,cpu陷入内核,调用网卡驱动,读mac头中帧类型为arp,从而读出完整mac帧,去掉mac头和尾交给arp层,一看目的ip不是自己网卡ip,那就丢包,当目标主机网卡接收后,网卡检查mac头的目的mac地址是广播地址没问题,crc校验码验算过后也没问题,于是将mac帧写进网卡接收缓冲区中,然后触发硬件中断,cpu陷入内核,调用网卡驱动,读mac头中帧类型为arp,从而读出完整mac帧,去掉mac头和尾交给arp层,arp层看目的ip正确,再一看op是1,那就构建arp响应报文,op操作类型就是2表示arp响应,源ip填上,源mac地址也填上,然后根据请求中的字段填写目的ip和目的mac地址,交给数据链路层,填写源和目的mac地址,帧类型还是0x0806 arp帧类型,加上crc校验码,写进网卡发送缓冲区,写TDT寄存器,然后最后发到直连网络中,这次因为有明确目的mac地址,所以是单播,接收到后通过硬件中断将下一跳ip与mac地址映射加进arp缓存中,并唤醒arp缓存等待队列上的进程,然后进程就会得到下一跳ip的mac地址,从而能够封装ip类型mac帧了
查看arp缓存的命令
arp -a
数据链路层的一个概念:单播和广播
如果发送到网卡直连网络中的mac帧,其目的mac地址是广播地址FF:FF:FF:FF:FF:FF,那局域网中的每个主机网卡在收到mac帧后,检查其目的mac地址是广播地址没问题,然后检查crc,之后就写进网卡接收缓冲区,触发硬件中断,然后cpu陷入内核,读出mac帧后去帧头和帧尾,交给上一层,这就是广播,也就是所有的主机不会在数据链路层就丢弃该包(除非crc错了)。
而单播就很好理解了,那就是发送的mac帧其目的mac地址是明确的,那主机网卡接收到mac帧后,看到目的mac地址和自己都不一样,于是直接在数据链路层就丢包
ARP欺骗-成为中间人
其原理就是通过大量发送错误的arp响应报文,使其他主机的arp缓存出错,下一跳ip对应的mac地址变成中间人的mac地址
如上面,主机M通过向同一局域网中的两个主机发送虚假ARP响应,使主机A的arp缓存被弄成了ipR-macM,而路由器R的arp缓存被弄成了ipA-macM,这样当主机A要给R发送数据时,数据链路层封装报头,查arp缓存,下一跳ip地址ipR对应的mac地址是macM,然后就向主机M进行了单播,然后主机M再伪造报文发给路由器R,整个过程通信双方全然不知,这就是中间人攻击