在本章节开始前,先提出几个问题:
- 公网ip和私网ip的区别是什么,哪个能重复哪个不能?
- 如何实现两个设备之间的信息通信?
- 是通过公网ip查找还是私网ip查找?
- 路由表包含的信息有哪些?
- ARP协议的作用以及格式?
- ARP缓存表的作用?
- NAT地址转换协议的作用是什么?
- MTU是什么?对网络层IP协议和传输层TCP、UDP有哪些影响?
网络层的ip协议负责路由选择(ip协议进进行选路)。而具体如何从A机器到达B设备,网络层并没有关心,而是数据链路层,负责相邻设备的转发。
网络层进行选路,数据链路层负责相邻设备的转发。
数据链路层根据网络层选择的路由项,进行转发,一定需要知道要转发的这个路由所对应的响应的设备的MAC地址:
- 要么是子网内机器的IP地址
- 要么是连接的路由项WAN对应的MAC地址
数据链路层包括两种协议:
- 以太网协议
- ARP协议
1、以太网协议
- 目的地址: 目的MAC地址
- 源地址:源MAC地址
- 类型: 数据链路层的上层协议是什么?
例: ip协议 —> 以太网协议,则类型当中是 ip (方便接收方通过类型辨别当前以太网协议的有效载荷是提交给哪一个协议) - 有效载荷:46字节(最小字节限制) ~ 1500字节(MTU)点击跳转至认识MTU
MTU是数据链路层堆到达数据链路层数据大小的规定,数据链路层发送的数据大小一定不会超过MTU - CRC校验数据在传输过程中是否失真
一个以太网协议:
在组织以太网协议的时候,需要知道相邻设备的MAC地址,但是当前主机不知道相邻设备的MAC地址,该如何获取呢?
通过ARP协议获取
2、ARP协议
** 首先强调ARP协议并不是一个单纯的链路层的协议,而是介于数据链路层和网络层之间的协议。**
使用ARP协议获取相邻设备的MAC地址,包括:
- 获取子网内部机器的MAC地址
- 获取相连路由器设备WAN的MAC地址
ARP协议格式
注意:ARP协议的作用是想要获取相邻设备的MAC地址
- 6字节的以太网的目的MAC地址:
填充位: 0xFFFFFFFFFFFF,表示当前的ARP请求要给当中的子网内的机器进行广播 - 6字节的以太网源MAC地址:
发送ARP协议机器的地址 - 帧类型: ARP协议 (0806)
- 2字节的硬件类型:1为以太网 ,指定当前网络类型(以太网)
- 2字节的协议类型:ipv4协议 (0800),意思是通过ip地址获取MAC地址
- 1字节的硬件地址长度:MAC地址的长度(6字节)
1字节可以表示的数字为(-128~127),够用 - 1字节的协议地址长度:ipv4版本ip地址的长度(4字节)
- 6字节的发送端以太网地址:源MAC地址 (和上面的以太网MAC地址一样)
- 4字节的发送端IP地址
- 6字节的目的以太网地址
请求时:为广播0x000000000000
应答时:发送ARP请求机器的MAC地址 - 4字节的目的IP地址
ARP协议的工作流程
- ARP协议先广播数据到局域网中,目的MAC地址为全1 (这里和上面的请求时 0x000000000000 似乎有冲突,有待解决)。
- 每台主机收到数据后,解开以太网报头和IP报头,拿到目的IP地址。
- 拿目的IP地址和自己主机的IP地址向比较,匹配就返回ARP响应。
- 发送端收到响应就获得了对方的MAC地址。
可参考链路层以太网详解
注意:
目的MAC地址保存的是相邻设备的MAC地址,源MAC地址存的是发出消息设备的MAC地址
结论:
- 在网络数据转发的过程当中,目的IP地址一般(除非由NAT转换的情况)是不会改变的,转发设备会针对网络数据进行分用到网络层,获取到目的IP地址,通过目的IP和自己保存的路由表进行匹配,从而选择路由。
- 数据链路层组织的以太网协议当中的目的MAC地址,一定是相邻设备的MAC地址。
路由表
在转发设备当中都会维护一张路由表,由
- 目标网络的端口号: Destination
- 默认网关: Gateway
- 子网掩码: Genmask
- 标志位: Flags
- 网卡: Iface
组成
通过 网络数据的目的IP 和 路由项的子网掩码相与的结果(计算得到的网络号)和当前路由项的网络号进行比对来进行判断:
- 比对上了,说明当前的数据想要递交给当前路由项当中的某一个机器(目的主机和当前的源主机在同一个子网下)
- 没有比对上,则最终会通过默认网关,发送到上级路由
问题
到目前为止,还有几个疑问,刚刚结论里说的以太网协议中的源MAC和目的MAC地址是不断变化的,那么ARP协议的目的MAC该怎么填?
- ARP协议发送的目标主机如果和发送主机在一个子网内,则目标以太网地址(MAC)直接填目标主机的MAC地址
- 如果目标主机在子网外,ARP在子网内无法返回目标机器的MAC,则目标以太网地址填写该局域网的路由器的MAC地址,由该路由器进行进一步查询
回答
为了获得目的主机的MAC地址,要通过广播发送一个ARP请求包。这个包包含了想要知道的MAC地址主机的IP地址。广播的包被同一链路上所有的主机或路由器接收,并被解析。如果ARP请求包中的目标IP地址和自己的IP地址一至,那么就将自己的MAC地址塞入ARP响应包返回。
也就是说
ARP协议只在子网内部有效
ARP请求是广播发送的,如果目标主机收到则进行处理,如果不是目标主机收到,则丢弃掉。
那么如果局域网中的主机没有目标主机,怎么知道对方的IP地址呢?(ARP字段要填写)
我们知道最终要接收数据主机的IP地址(应用层数据URL中)。在IP网络层先查路由表,发现不在当前局域网中,会发送给路由表中默认的网段,也就是路由器。主机知道路由器的IP地址,一般是当前局域网的网络号,主机号为1。会在ARP协议的目的以太网地址(MAC)路由器在该子网下的MAC地址。路由器收到ARP响应。
目标主机在子网内
如果查看路由表,最终要接收数据主机的IP地址在当前局域网中,会在ARP目的IP地址填入最终要接收数据主机的IP地址。最终要接收的主机收到会响应ARP。
目标主机在子网外
以上主机A与主机E在同一局域网中。如果子网内没有目的主机,则将目的以太网地址改为路由器的MAC地址,目的IP地址仍为原来寻找的目的地址,这样才能保持原来寻找的目的IP不被改变,知道下一步该怎么走
主机A:111.111.111.111要向主机B:222.222.222.222发送一个数据报:
需要注意的是:该例子每台主机仅有一个IP和一个网络接口(一个网络接口对应一个适配器,一个适配器对应一个MAC地址),但连接两个子网的路由器有两个接口,故其有两个IP、两个适配器(两个ARP模块)即两个MAC地址。
网络中每个适配器都有自己的MAC地址。
两主机处于不同子网,故A中的ARP表肯定没有B的IP->MAC的映射,但它有从A到路由器接口111.111.111.0的适配器MAC地址(说明这个接口与A同属一个子网),故:
- (1)主机以路由器的MAC为目标MAC地址,以B的IP为目标IP发送数据报给路由器。
- (2)在子网1上的路由器的适配器看到链路层帧是向它寻址的,因此将该帧一路上交至网络层;路由器在网络层中查路由表得到通往目标(主机B)IP的下一跳(即接口222.222.222.220),将该数据转发到接口222.222.222.220
- (3)路由器接口222.222.222.220对应的适配器查ARP表,得到了主机B的MAC地址,将其插入封装了数据报的帧,发送给主机B。
一种笼统的回答:如果不在同一子网,就通过ARP询问默认网关对应的MAC地址, 将数据转发给网关, 网关进行与主机A类似的ARP解析过程,将数据发送给主机B,或者转发给下一个网关继续进行路由,直到到达主机B
-
网络广播
网络广播是指一个节点同时向相同域中的其它所有节点传输数据包的过程。
例如
有4台主机, 分别为1号主机,2号主机,3号主机,4号主机. 假如1号主机 要给4号主机发数据! 如果是用广播传输方法的话! 那么4台主机都会收到数据包! 4台主机 在收数据包的时候 会查看数据包里的目标IP地址是不是自已的,是的话就收下,不是就不收! -
ARP广播原理
(1)A(135.24.25.23)和同一网段内的主机B(135.24.25.32)通信
查找arp 表没有32 IP的MAC地址
判断A 和B 是在同一局域网内,A向局域网发送ARP广播,B收到广播后 会把自己的MAC地址以广播的形式发送给A,A获取到B的MAC 保存到自己的ARP缓存中,通讯开始
(2)A(135.24.25.23)和不同同一网段内的主机B(135.24.25.32)通信A判断B和自己不在同一局域网
A发送一个广播获取网关的MAC地址,网关收到广播后向A返回自己的MAC
A按照网关的MAC地址开始通信,网关收到这个数据包后向下一跳路由网关获取MAC,把这个数据包发到下一个网关
扩展:
实际上会用到代理ARP:
主机可能会发送 ARP 请求,要求映射本地网络范围以外的 IPv4 地址。在这种情况下,设备发送 ARP 请求是想获取不在本地网络中的 IPv4 地址,而不是请求与网关的 IPv4 地址关联的 MAC 地址。为了向这些主机提供 MAC 地址,路由器接口可能会使用代理 ARP 代表这些远程主机进行响应。这意味着,请求设备的 ARP 缓存中将会包含映射至本地网络以外任何 IP 地址的网关的 MAC 地址。使用 ARP 代理时,就好像路由器接口是具有 ARP 请求所请求的 IPv4 地址的主机一样。路由器通过“仿造”身份,承担了将数据包路由到“真正”目的设备的职责。
当旧版的 IPv4 无法确定目的主机是否与源主机在同一逻辑网络上时,就会发生使用 ARP 代理的过程。在这种情况下,ARP 始终会发送 ARP 请求,要求获取目的 IPv4 地址(发送的ARP请求里,)。但如果路由器接口禁用了代理 ARP,这些主机便无法将请求传出本地网络。
交换机
数据碰撞概念
一个局域网是多台主机共享的,当多台主机往局域网中发送数据时,数据在局域网中会发生干扰,俗称数据碰撞。数据碰撞之后,由于不知道数据的准确性,数据无法再继续发送。
此时这个局域网就是一个碰撞域,每台主机都会进行冲突检测,检测是否有数据发生碰撞,主机也有冲突避免的算法。
为了避免碰撞,局域网通信,在一个碰撞域中,任何时刻都只允许只有一台主机向另外一台主机通信
交换机工作
交换机工作在链路层,具有划分碰撞域和转化数据帧的功能。提高通信效率。
总结一下如何通信
在一个局域网中通信,主机A只负责将数据发送到局域网中,局域网中的所有主机都能收到该数据,包括路由器,路由器也是局域网中的一台主机。但是以太网协议会在数据中加入源MAC地址和目的MAC地址,主机收到数据后,会将目MAC地址和自己的MAC地址作比较,不匹配丢弃,匹配的话,就向上会解析。
关于以太网协议的相邻MAC的深入理解:
跨网络通信时,MAC地址每经过一个局域网都会发生变化
为什么以太网协议封装的数据只能局限在局域网中通信?
因为,一台网协议会在数据中添加源MAC地址和目的MAC地址。如果要跨网络,必须经过路由器。路由器连接不同的局域网,用的网卡不同,就需要将收过来的数据,解包,再封包,将数据的MAC地址修改了。
3、ARP缓存表
如果每发送一个IP数据报都要进行一次ARP请求以此确定MAC地址,那么将会造成不必要的网络流量。
为了解决上面问题,我们可以将刚得到的映射关系存入ARP缓存表一段时间(20min,即ARP缓存表的老化时间)。
如果在数据链路层没有在缓存表当中发现目的MAC地址,则发送ARP请求获取,否则直接从缓存表当中获取。
问题:为什么需要ARP缓存表
记录IP与MAC的对应关系,可以通过ARP缓存表当中记录的项,查找到对应的MAC地址,找到了则拿MAC地址进行发送,如果没有拿到,则使用ARP协议,获取目标的IP地址
问题:为什么ARP缓存中要有老化时间
电脑更换时会导致同一个IP对应的MAC地址不同,所以需要更新ARP缓存表。
注意:
ARP缓存表当中记录的地址都是私网主机ip,所以会出现IP地址重复的情况,但是MAC地址是全球唯一的
我们使用cmd ipconfig下找到的以及在Linux下ifconfig查到的都是本机的ip(私网ip),ipconfig里面如果用无线上网则无线适配器WLAN下的是本机ip,其他VM的是虚拟机ip。
4、NAT(地址转换)协议
linux下 ifconfig eth0 inet为私网ip 第二行的lo 127.0.0.1为回环ip:localhost
5、认识MTU
MTU:最大传输单元(数据链路层对网络数据的限制)
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据报小于46字节时,要在后面补充位数。
- 最大值1500字节称为以太网的最大传输单元(MTU),不同网络类型有不同的MTU。
- 如果一个数据包的长度超过了MTU,则需要对数据进行分片,分片是网络层IP做的。
- 不同的数据链路层标准的MTU是不同的,在数据传输过程中,数据可能会被路由器继续分片。
以下涉及到网络层的分片可以回顾一下,加深理解:
MTU对IP协议的影响
发送时,网络层IP协议的数据需要发送到链路层,由于MTU的影响,对于超过MTU的数据,IP要对其进行分片处理。
IP协议格式如下:
IP协议报头(首部):20字节
- 16位标识用来表示分片属于哪一个数据包
- 3位标志
第一位:保留位
第二位:为0表示允许分片
第三位:为0表示后面没有分片,为1表示还有分片 - 13位片偏移分片相当于在原始数据当中的偏移量
- 同一组数据的每一个分片协议的16位标识ID是相同的
- 一旦一些分片丢失,数据重组失败,但是IP层不负责重传数据
- 负责数据重传的是传输层,准确来说是TCP协议,UDP协议不可靠
由上图知,不同路由下的MTU可能不同,在数据传输的的过程中,也会进行分片,不同的分片可能走不同的路由。分片到达对端主机之后,有可能不是按照顺序到达的。
所以IP协议对到达网络层的数据要有一个认知:当前的IP数据报是一个分片,还是一个完整的数据包。由IP协议字段当中的16位标识,3位标志,13位片偏移确定。(若不是一个完整的数据包则暂时缓存在网络层)
由IP协议格式中的
- 16位总长度:单位IP数据报最大数据总长度为216=65536字节(包括IP报头(首部)(20字节)在内)
MTU对传输层的影响
MTU对UDP协议的影响
UDP是将整条数据交给网络层,而由UDP协议格式中的16位UDP长度知UDP的最大传输数据大小是216=66536字节(包括UDP首部8字节)
UDP协议的特性:无连接,不可靠,面向数据报
- 当一个UDP携带的数据超过1472(1500 - 8(UDP报头) - 20(IP报头))时,在网络层就一定会进行分片
- 分片之后,一个数据被分成了多份,说明,数据丢包的概率增加了
这里说明一下:一个UDP被分成多个片只有第一片包含UDP首部,后面的数据包没有udp首部,到达目的地址之后重组,但是每片都有IP首部;如图所示
这里回顾一下UDP的一些相关问题:
UDP最大可以传输65536个字节,如果应用层想要传输的数据比216还要大应该如何操作?
如果超过65536个字节,就需要在应用层对数据进行分包,使用sendto()传输一部分给UDP协议,剩下的再使用sendto()传输给UDP协议
接收方调用recvfrom(),将去掉UDP包头的数据拿到,通过发送方应用层设定好的:标识、标志位、片偏移(和IP数据包有点类似,但这是再应用层写好写入UDP中的),就可以将数据进行组合(用UDP内部的数据进行组合,和应用层设定的标识、标志位、片偏移相关和UDP首部无关)(注意和IP的数据报进行区分)
MTU对TCP协议的影响
TCP协议的一个数据报也不能是无限大的,不仅受之于流量控制,拥塞控制的影响,还受MTU的影响。TCP的有效载荷的最大消息长度,称为MSS。
- TCP在建立连接,三次握手时,通信双方会进行MSS协商。
- 双方SYN时会在TCP报头写入自己能支持的MSS值。
- 双方知道知道对方的MSS后,选择最小值作为最终MSS。
- MSS值在TCP报头填入位置在选项。
三次连接握手了以后,协商得到了MSS:最大报文长度:
MSS = min(MSS_client, MSS_server)
TCP在传输数据时,严格按照MSS进行传输,和最大传输单元MTU的关系为:
MSS + ipheader + tcpheader <= MTU
TCP的首部长度和刚刚UDP和IP首部长度一个固定为8字节一个固定为20字节不同,TCP头部中可能包含选项,占用一些字节,由上图,若不包含选项,至少已经占用了20字节,若包含选项,头部最长可以为60字节,具体大小由4位首部长度进行计算
至少为:0100(5),最多为:1111(15)
首部占用字节数规定为:四位长度的数值 * 4
即 5 * 4 = 20 到 15 * 4 = 60 (字节)
所以,这么看一般情况下在网络层以及数据链路层传输时,是不会对TCP数据进行分片的,因为已经协议并规定好其每次发送的数据大小小于MTU,
在某些特殊情况下,虽然TCP会协商MSS,但是,仍然可能会被分片。接收端就收在组装时,如果发现一个分片丢失,接收端TCP收不到数据,就认为整个数据丢失,会让发送方,重发整个数据。这主要原因是中间转接的某个路由器的MTU比较小导致的,这个问题参考这个回答什么情况下TCP传输会出现ip分片?不展开叙述。