网络层只负责数据的源端和目的端,而链路层就是负责相邻设备之间的数据帧传输。相邻设备之间也需要描述识别(因为一个设备可能有很多相邻设备)。链路层相邻设备之间的识别是通过MAC地址实现的。
以太网协议
- MAC地址:网卡的硬件地址,uint8_t mac[6],每一个网卡设备都拥有自己独有的MAC地址,唯一标识一个设备
- 48位对端MAC地址、48位源端MAC地址:描述识别相邻设备(描述了相邻设备之间的数据传输)
- 16位上层协议类型:网络层的协议类型,在数据分用时选择上层的解析协议
- 32位CRC校验和:数据帧尾,包含校验和在内
如何获取对端的MAC地址?
ARP协议
ARP协议
ARP协议是一个介于网络层和链路层之间的协议,通过IP地址获取相邻设备的MAC地址。
- 2字节硬件类型:定义运行ARP的网络类型(以太网)
- 2字节协议类型:定义使用什么协议,IP地址来转换MAC地址
- 1字节硬件地址长度:用于定义物理地址长度,指MAC地址的长度
- 1字节协议地址长度:用于定义逻辑地址长度,指IP地址长度
- 6字节发送端以太网地址:源主机的MAC地址
- 4字节发送端IP地址:源主机的IP地址
- 6字节目的以太网地址:目的MAC地址
- 4字节目的IP地址:目的主机的IP地址
- 以太网协议首部中存在目的MAC地址的含义:
设置为 0xFFFFFFFFFFFF,是为了在链路层进行广播,即在当前局域网中进行广播。 - 28字节ARP请求头部中,目的MAC地址填充为全0,即0x000000000000
请求当中,设置目的IP地址,当设备接收到ARP请求后,对比ARP请求头部中的目的IP地址是否和自己的IP地址相符,如果相符,则组织ARP响应,将自己的MAC地址回复出去,若不符合直接丢弃。 - ARP协议只在子网内部有效
- 当前主机获取到相邻设备的MAC地址后,会缓存一段时间(一般默认时20~30分钟)
因为如果相邻设备的网络中断,下次连接网络后IP地址可能会发生变化,则源主机需要重新获取MAC地址。
ARP局域网欺骗攻击:恶意主机收到ARP请求之后伪装自己,告诉源主机自己就是目标主机,将自己的MAC地址发送过去。
解决办法:防火墙白名单(将信任的相邻设备添加到白名单中)。
MTU(最大传输单元)
链路层限制的数据帧大小(根据组网方式不同,默认数值也不同,以太网中默认1500字节)。
MTU对上层协议应用的影响:
- TCP协议:TCP在传输层三次握手的时候,进行MSS最大数据段大小协商,告诉对方自己的MSS是多少,然后通信双方取较小的一方作为传输数据段的大小。每次从发送缓冲区中取出不大于MSS大小数据进行传输,因此通常也说TCP在传输层会自动进行数据分段。
MSS = MTU - 最小IP报头长度 - 最小TCP报头长度;则MSS = 1500 - 20 - 20 = 1460。 - UDP协议:因为UDP不考虑MSS(对于UDP不存在MSS的概念),只要数据段大小小于64K - 28,就可以进行传输,但是这个数据大小若是大于MTU则会在网络层进行数据分片。
UDP不保证数据可靠传输,一个UDP报文若在网络层进行了分片,则传输过程中,一个分片如果出现问题,整个UDP报文都会被丢弃,意味着UDP传输过程中,分片越多,在传输过程中出现问题的几率越大。
解决方案:程序员在应用层使用UDP协议的时候最好就可以考虑MSS的问题,将UDP数据段按照计算的MSS进行分包处理。