隐藏在网络邻居背后的协议,快来看看你家网络有几种?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隐藏在网络邻居背后的协议,快来看看你家网络有几种?相关的知识,希望对你有一定的参考价值。
参考技术A分析/验证对比常见局域网服务发现协议在Windows/Linux/Mac等不同系统下的支持和表现
在使用不同系统的智能硬件时,如常见的树莓派/Openwrt路由器/Debian/Fedora/Windows/Mac等系统是,系统间相互发现以及
网络共享本应是系统的基础服务,无需用户过多参与.不过现实旺旺和理想之间的差距让我们惊讶,不同系统相互之间的发现以及
共享并没有那么轻松.
开发的硬件设备无法在常见系统的网络邻居正确的现实出来,实在是很丧气的事情.
那么,就系统来看看局域网服务发现协议在不同系统上的支持及表现.
想要访问局域网网络里面的设备,远没有应有的轻松. 每次新装系统或者设备入网,总是有这样或者那样的问题,哎,我的服务器啊,你在哪里.
先看看最简单和常用的ping工具,这么简单和实用的工具,简单的搜索竟然有 三千八百万 条记录
大名鼎鼎的树莓派,用起来想来应该更简单一些,可事实往往触目惊心,仅仅是ping通的问题,也有 三百万 的记录
![pdnas-raspberry-pi-ping]]( https://upload-images.jianshu.io/upload_images/14465021-53d02e74e1936079.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
再来看看最常见的文件共享服务,也有 两千万 之巨
这都2120年了,为什么这么常见的服务还有这么多为问题呢.
干货放前面 各系统网络邻居正常工作的协议汇总:
Linux和Macos比较相似,但是实现起来还是有明显的差异,下文会具体描述.
Windows一如既往的走在自己的路上,网络邻居发现协议自搞一套.
Web Services Dynamic Discovery (WS-Discovery) WS-Discovery
下图是此协议的抓包
此协议和UPnP极其相似,都是基于SSDP协议衍生的XML表达的,如果不支持此协议,则无法在Windows10 的网络邻居里面显示为PC,无法直接点击访问共享.
支持此协议后,Windows10的网络邻居里面会在计算机类型的里面显示设备.
UPnP 是早期路由器常用的协议,目前从不同系统的验证来看,仅有Windows默认在文件浏览器里面支持,Ubuntu和MacOS都需要单独配置或者应用程序才能浏览.
这个协议目前各种路由器基本都能支持,不过其安全问题频出,作用并不明显.
此协议在Windows系列里面基本都能支持,会在网络邻居里面显示出设备的信息.
MAC整体表现和Linux比较接近,双方使用的协议也是类似,只是在细节处理上有些区别.
mDNS 协议本身应用比较广泛,MAC比较早就支持.在Mac新版本里面,网络邻居默认可以发现mDNS设备.
因为历史原因,早期的AFP协议升级后已经没有开源协议可以完美支持,因此使用avahi的mDNS服务时,如果还使能了AFP业务的话,MAC会显示为大问号.
使用配置好的服务文件,MAC可以正常显示设备
在调试过程中,还看到了网络邻居显示为PC的图标,有知道显示为这个图标的条件的小伙伴吗?
Server Message Block SMB 是MS家
的协议,奇怪吧:<>
Samba是*nix系统上的一个SMB协议的实现,是早期为了和Windows兼容文件共享而做的功能.目前MAC已经全面放弃自己的AFP协议转而投向SMB协议.
设备仅支持SMB协议而没有mDSN协议辅助的话,MAC也可以识别此系统,不过会显示为超级古老的图标.
Ubuntu系统的网络邻居可以自动发现mDNS服务并展示为不同的图标. 在Ubuntu 20.04里面,除去图标的不同,还增加了每个服务的描述.
同样的,Ubuntu系统天然支持SMB协议,但是SMB协议需要mDNS协议的支撑,否则无法显示在网络邻居里面.
除去前面流行并且工作的协议外,还有一些曾经使用但是已经废弃或者即将废弃的协议,在设备设计时,如果考虑兼容性,也同时需要支持.
SSDP是一个基础协议,UPnP以及WS-Discovery 都是基于这个协议来实现的.
Apple Filing Protocol AFP
Apple家的私有协议,开源有 netatalk 实现. AFP升级加密后,netatalk也不能和新版本的MAC兼容.
苹果已经全面投向SMB的怀抱,AFP基本上可以忽略了.
Network Basic Input/Output System NetBios 这个是Windows 9x/Me/XP等早期系统支持的名称解析协议,
类似于mDNS,新的Windows 10已经不建议支持此协议.
Link-Local Multicast Name Resolution LLMNR , 这个也是和mDNS竞争的失败者,主要聚焦于局域网的名称解析,可以直接忽略了.
详解IPv6邻居发现协议
在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备时,它必须知道对方的网络层地址(即IPv6地址)。但是仅有IPv6地址是不够的,因为IPv6数据报文必须封装成帧才能通过物理网络发送,因此发送方还必须有接收方的链路层地址(MAC地址),所以需要一个从IPv6地址到链路层地址的映射,保证数据报文的传送能够顺利进行。ND(Neighbor Discovery,邻居发现)用来实现网络层IPv6地址与链路层MAC地址之间的映射,是以太网通信的基础。
NDP(Neighbor Discovery Protocol,邻居发现协议)是IPv6协议体系中一个重要的基础协议。NDP替代了IPv4的ARP和ICMP路由器发现功能,它定义了使用ICMPv6报文实现地址解析、邻居不可达检测、重复地址检测、路由器发现、重定向等功能。
1、地址解析
在IPv4中,当主机需要和目标主机通信时,必须先通过ARP获得目的主机的链路层地址。在IPv6中,同样需要从IP地址解析出链路层地址的功能。NDP实现了这个功能。
ARP报文是直接封装在以太网报文中的,以太网协议类型为0x0806,普遍观点认为ARP的定位为2.5层协议。NDP本身基于ICMPv6实现,以太网协议类型为0x86DD(IPv6报文),IPv6的Next Header字段值为58,表示ICMPv6报文,由于NDP使用的所有报文均封装在ICMPv6报文中,一般来说, NDP被看作三层协议。在三层完成地址解析,主要有以下几个好处。
- 地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。
- 可以使用三层的安全机制避免地址解析。
- 使用组播方式发送请求报文,减少了对二层网络性能的压力。
地址解析过程中使用了两种ICMPv6报文:NS(Neighbor Solicitation,邻居请求)报文和NA(Neighbor Advertisement,邻居通告)报文。
- NS报文:Type字段值为135,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP请求报文。
- NA报文:Type字段值为136,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP应答报文。
IPv6地址解析的过程如图:
Host A在向Host B发送报文之前必须要解析出Host B的链路层地址,所以首先Host A会发送一个NS报文,其中源地址为Host A的IPv6地址,目的地址为Host B的被请求节点组播地址,需要解析的目标IP为Host B的IPv6地址,这就表示Host A想要知道Host B的链路层地址。同时需要指出的是,在NS报文的Options字段中还携带了Host A的链路层地址。
当Host B接收到了NS报文之后,就会回应NA报文,其中源地址为Host B的IPv6地址,目的地址为Host A的IPv6地址(使用NS报文中的Host A的链路层地址进行单播),Host B的链路层地址被放在Options字段中。这样就完成了一个地址解析的过程。
2、邻居不可达检测
与邻居之间的通信会因各种原因而中断,包括硬件故障、接口卡的热插拔等。如果目的地失效,则不可能恢复,通信失败;如果路径失效,则可能恢复。因此节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。
邻居状态有5种,分别是Incomplete(未完成)、Reachable(可达)、Stale (过时)、Delay(延迟)、Probe(探查)。
邻居状态之间具体的迁移过程如图,其中Empty表示邻居表项为空。
下面以A、B两个邻居节点之间相互通信过程中A节点的邻居状态变化为例(假设A、B之前从未通信),说明邻居状态迁移的过程。
- A先发送NS报文,并生成缓存条目,此时,邻居状态为Incomplete。
- 若B回复NA报文,则邻居状态由Incomplete变为Reachable,否则在固定的一段时间后,邻居状态由Incomplete变为Empty,即删除表项。
- 经过邻居可达时间,邻居状态由Reachable变为Stale,即未知是否可达。
- 如果在Reachable状态下,A收到B的非请求NA报文,且报文中携带的B的链路层地址和表项中不同,则邻居状态马上变为Stale。
- 在Stale状态下,若A要向B发送数据,则邻居状态由Stale变为Delay,并发送NS请求。
- 在经过一段固定的时间后,邻居状态由Delay变为Probe,其间若有NA应答,则邻居状态由Delay变为Reachable。
- 在Probe状态,A每隔一段时间发送单播NS,发送固定次数后,有应答则邻居状态变为Reachable,否则邻居状态变为Empty,即删除表项。
3、重复地址检测
DAD(Duplicate Address Detect,重复地址检测)是在接口使用某个IPv6单播地址之前进行的,主要是为了探测是否有其他的节点使用了该地址。在地址自动配置的时候进行DAD检测很有必要。一个IPv6单播地址在分配给一个接口之后、通过重复地址检测之前被称为Tentative Address (试验地址)。此时该接口不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组:All-Node组播组和试验地址所对应的Solicited-Node组播组。
IPv6重复地址检测技术和IPv4中的免费ARP(Gratuitous ARP)类似:节点向试验地址所对应的Solicited-Node组播组发送NS报文。NS报文中目标地址即为该试验地址。如果收到某个其他站点回应的NA报文,就证明该地址已被使用,节点将不能使用该试验地址通信。
重复地址检测的原理如图
Host A的IPv6地址FC00::1为新配置地址,即FC00::1为Host A的试验地址。Host A向FC00::1的Solicited-Node组播组发送一个以FC00::1为请求的目标地址的NS报文,进行重复地址检测,由于FC00::1并未正式指定,所以NS报文的源地址为未指定地址。当Host B收到该NS报文后,有两种处理方法。
- 如果Host B发现FC00::1是自身的一个试验地址,则Host B放弃使用这个地址作为接口地址,并且不会发送NA报文。
- 如果Host B发现FC00::1是一个已经正常使用的地址,Host B会向FF02::1发送一个NA报文,该消息中会包含FC00::1。这样,Host A收到这个消息后就会发现自身的试验地址是重复的。在Host A上,该试验地址不生效,被标识为Duplicated状态。
4、路由发现
路由器发现功能用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数。在IPv6中,IPv6地址可以支持无状态的自动配置,即主机通过某种机制获取网络前缀信息,然后主机自己生成地址的接口标识部分。路由器发现功能是IPv6地址自动配置功能的基础,主要通过以下两种报文实现该功能。
- RA(Router Advertisement,路由器通告)报文:每台设备为了让二层网络上的主机和设备知道自己的存在,都会定时以组播形式发送RA报文,RA报文中会带有网络前缀信息和其他一些标志位信息。RA报文的Type字段值为134。
- RS(Router Solicitation,路由器请求)报文:很多情况下主机接入网络后希望尽快获取网络前缀进行通信,此时主机可以立刻发送RS报文,网络上的设备将回应RA报文。RS报文的Type字段值为133。
IPv6主机无状态自动配置的过程为:根据接口标识获得链路本地地址;发出邻居请求,进行重复地址检测;如地址冲突,则停止自动配置,需要手工配置;如不冲突,链路本地地址生效,节点具备本地链路通信。主机会发送RS报文,请求设备回复RA报文(或接收到设备定期发送的RA报文);根据RA报文中的前缀信息和接口标识获得IPv6地址。
当主机所在的链路中存在多个设备时,主机需要根据报文的目的地址选择转发设备。在这种情况下,设备通过向主机发布默认路由优先级和特定路由信息,提高主机根据不同的目的地选择合适的转发设备的能力。
在RA报文中,定义了默认路由优先级和路由信息这两个字段,帮助主机在发送报文时选择合适的转发设备。主机收到包含路由信息的RA报文后,会更新自己的路由表。当主机向其他设备发送报文时,通过查询路由表,向合适的路由器发送报文。
主机收到包含默认路由优先级信息的RA报文后,会更新自己的默认路由列表。当主机向其他设备发送报文时,如果没有路由可选,则首先查询该列表,然后向本链路内优先级最高的设备发送报文;如果该设备发生故障,主机根据优先级从高到低的顺序,依次选择其他设备。
5、重定向
当网关设备发现报文从其他网关设备转发更好时,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关设备。重定向报文对应的ICMPv6的Type字段值为137,报文中会携带更好的路由下一跳地址和需要被重定向的报文的目的地址等信息。
Host1需要和Host2通信,Host1的默认网关设备是R1,当Host1向Host2发送报文时报文会被送到R1。R1接收到Host1发送的报文以后,会发现实际上Host1直接发送给R2更好,它将发送一个重定向报文给Host1,其中报文中更好的路由下一跳地址为R2,目的地址为Host2。Host1接收到了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往Host2的报文就直接发送给R2。
当设备收到一个报文后,只有在满足以下全部条件时,设备才会向报文发送者发送重定向报文。• 报文的目的地址不是一个组播地址。
- 报文并非通过路由转发给设备。
- 经过路由计算后,路由的下一跳出接口是接收报文的接口。
- 设备发现报文的最佳下一跳IP地址和报文的源IP地址处于同一网段。
- 设备检查报文的源地址,发现自身的邻居表项中有用该地址作为全球单播地址或链路本地地址的邻居存在。
如果通信目标是一台主机,则主机的IPv6地址就是重定向报文的目的地址。如果该重定向报文含有选项字段,则选项字段中含有目标主机的链路层地址。
以上是关于隐藏在网络邻居背后的协议,快来看看你家网络有几种?的主要内容,如果未能解决你的问题,请参考以下文章
雄安聚焦| 雄安最新的动态规划图!快来看看你家在哪里!(图+视频)