目录
1. 认识以太网
以太网不是一种具体的网络,而是一种技术标准。
拿介质举个例子,声音的传播需要介质,这些介质可以是气体、液体、固体。那以太网就是一种在链路层传输的介质!
1.1 以太网帧格式
先回答两个问题:
以太网如何解包和分装?
解包:以太网的报头是定长的,6+6+2。而且CRC(校验和)也是固定长度。解包时只需要将这两个长度减去,得到的就是数据。(注:这里的数据可是整个IP报文)
如何交付?
两个字节的类型字段,决定了交付给谁的问题。
目的地址:目的主机的MAC地址。
源地址:发送方主机的MAC地址
类型:如果为0800,则代表有效载荷放的是IP报文,进而向上交付时就交付给了IP层。
如果为0806 或者 0805 会交给ARP层。这个我们后面一些再讲。
MAC地址: MAC地址是标识主机唯一性的方案。
1.2 基于以太网帧简单模拟局域网通信
假设主机1,要向主机4发送消息,那他的报文就应该如图所示进行填写。这条消息相当于是广播出去的,即每个主机都会得到这个报文,但是经过报文的解包对比发现目的地址并不是自己,于是就会将报文丢弃。
就像在课堂上老师指明一个同学回答问题。
问题一:如果有多台主机都在发送数据呢?
数据间会发生碰撞问题,从而导致数据无法使用。
在更底层,这些数据源于光电信号,如果同时有多个主机在发送数据,那全部的数据势必会收到干扰。结果就是这些报文数据都不能正常使用。
问题二:发送方知不知道自己的数据被影响了呢?
知道。自己发出的消息,自己也会接收到。
就像可以自己听见自己说话一样。
如果发现了自己的数据不对(CRC验证不通过了),那么发送方就会根据“避免碰撞”的算法,休息随机时间,然后重新发送。
1.3 MTU
首先回答两个问题,
局域网中主机越多越好呢还是越少越好?
越少越好,可以减少数据碰撞。但是事实情况不能要求连接局域网的主机变少,所以就有了交换机。
交换机的作用就相当于是把局域网在划分成两块区域。如果通信的双方在划分的区域的同一侧,那么交换机就不会再将这个报文发送到区域的另一侧。从而减少数据碰撞。
局域网数据发送时,数据越长越好还是越短越好?
越短越好,越短发的越快。数据碰撞的可能性就小。
MTU 相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路层对应的物理层产生的限制。
以太网帧中数据长度规定最小46字节,最大1500字节。ARP数据包的长度不够46字节,要在后面补填充位。
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。不同的数据链路层标准的MTU是不同的。
1.3.1 MTU对IP协议的影响
超过1500字节会发生分片,具体已经在上篇博文中详细提及了。
Linux--IP协议--0316-19_Gosolo!的博客-CSDN博客
1.3.2 MTU对UDP协议的影响
一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着,如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了
1.3.3 MTU对于TCP协议的影响
TCP的一个数据报也不能无限大, 还是受制于MTU。TCP的单个数据报的最大消息长度, 称为MSS
TCP在建立连接的过程中, 通信双方会进行MSS协商。理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(受制于数据链路层的MTU).
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。然后双方得知对方的MSS值之后, 选择较小的作为最终MSS。
MSS的值就是在TCP首部的40字节变长选项中(kind=2);
1.3.4 查看硬件地址和MTU
bash: ifconfig
2. 抛出问题
在网络转发过程中,MAC报头会发生变化吗?
答案是,会变。这里涉及到路由器的一个功能。
数据要想发送给目标主机需要MAC地址,MAC地址如何得知?
ARP协议!
3.ARP协议
首先,但发送端想要发送数据时,它会知道接收端的IP,也就得知了目标网络+目标主机。但在数据链路层,我们的报头文件中有目的MAC地址这一字段,如何通过目的IP得知目的MAC地址呢?
ARP协议建立了主机IP地址和MAC地址的映射关系。ARP协议是一个局域网协议。
ARP协议和以太网帧协议的关系
二者同在数据链路层。但属于上下层关系,也就是说以太网帧协议的上层协议,要么是所以也就解释了以太网帧报头的类型字段!
3.1 ARP协议的工作流程
3.1.1 具象工作流程
假设在局域网中有多台主机,A、B、C、D。其中主机A要给主机D发送消息。
A会在局域网中以“广播”的形式,发送一个报文“IP地址是IP_D的主机,请告诉我你的MAC地址”。局域网中的所有主机都会拿着这条报文跟自己做对比,发现叫的不是自己,于是丢弃报文不管。
当主机D接收到这份报文后,确认叫的就是自己,于是会将自己的MAC地址填入报文,然后定向的发给主机A,因为此时主机D已经通过A发送的报文得知了A的MAC地址。
结论:
任何主机可能之前向目标主机发起过ARP请求,注定了未来会收到对应的ARP应答。
任何一台主机,也可能被别人发起ARP请求。
在局域网中,任何一台受到ARP的时候,可能是一个应答,也可能是一个请求。
3.1.2 认识ARP协议
相关字段:
硬件类型 | 指链路层网络类型 1为以太网。 |
协议类型 | 指要转换的地址类型 0x0800为IP地址。 |
硬件地址长度 | 对于以太网为6, 表示6字节。 |
协议地址长度 | 对IP地址为4, 表示4字节。 |
发送端以太网地址 发送端IP地址 目的IP地址 | 都是已知的, 直接填写即可 |
目的以太网地址 | 一般全部设为1,表示广播。 有目的主机的MAC地址, 就直接填写MAC地址。 |
op字段 | op为1表示ARP请求 op为2表示ARP应答 |
3.1.3 模拟一次真实的工作流程
主机A广播一条报文,报文内容如下图
以太网帧层,相当于是ARP层将报文向下交给他后,该层对他再次进行封装报头!
B、C主机也收到该报文,那他们需不要对报文进行进行解包向上交付给ARP层协议呢?
需要。因为以太网帧报头中的目的MAC地址是全1,为广播。每个主机都要接收这个报文。递交给ARP层后,先区分是ARP请求还是ARP应答,如果是请求,接着查看目的IP地址。如果IP地址不匹配。会在ARP层将该报文丢弃!
D主机接收报文,回应一个ARP应答。
主机B、C同样接收到这个ARP应答报文,需不要解包向上交付给ARP层协议呢?
不用,目标以太网地址为MAC_A,BC主机接收到这个报文,在以太网帧协议这一层就会将报文丢弃掉。
经过这样的过程,主机A就拿到了目的主机的MAC地址。从而可以将历史上收到的报文向下交付,封装完整以太网帧。
问题:
ARP看起来至少进行一个请求和一个应答,是不是每一次发送数据都要这么干呢?
ARP请求成功之后,请求方会暂时的将IP:MAC的映射关系保存进入缓存表。并有其他的方案确定时间更新该缓冲表。
是不是只会在目的最终的子网中进行ARP,其他地方会不会也发生ARP呢?
会,在路由器一层一层的往外部的局域网发送时,下级的路由器就不知道上机路由器的MAC地址,所以也需要进行ARP。ARP的过程会在网络路径中随时发生。
3.2 查看IP地址和MAC地址关系映射的缓存表
linux下
windos下
3.3 简单理解什么是ARP欺骗
由于缓存表是存新不存旧的,如果主机A和路由器B已经建立好了映射关系。此时在该局域网中,有一台C主机,疯狂的向路由器B发送构建ARP报文“我是主机A,MAC_C,IP_A”,那么此时就会更新缓存表。主机C继续向主机A疯狂的发送ARP应答,“我是路由器B,MAC_C,IP_B”。
这样主机A和路由器B之间的通信,在双方都不知情的情况下,被C截获了。称为ARP欺骗。