零:说明
最近读了一下Richard Stevens的《TCP/IP详解》,想找一点东西实践一下,就把两台电脑用网线连起来,使用wireshark抓包。这篇文章是基于抓包的结果,对于这种只有两台主机直接相连的最简单的局域网环境中协议使用的介绍。本文只是对所用到的协议做了一个简单的介绍,如果对某个协议的细节,报文结构等方面有兴趣可以自行深入探究,对于部分协议本文也附带了一些参考资料的链接。
本文介绍的所有协议均基于IPv4,两台主机的OS均为Windows10
协议的排序基本按照抓包到的时间顺序
由于书上和网络上找到的资料差异,下文中混用多播和组播两个词,均表示IP传输中的Multicast方式
一:解析
1. LLDP
LLDP(Link Layer Discovery Protocol,链路层发现协议)顾名思义是一个基于链路层的协议。为了方便对在一个网络中具有不同特性的、来自不同厂商的设备进行管理,就需要使得不同厂商的设备能够在网络中相互发现并交互各自的系统及配置信息,也就是这个协议的用途。
LLDP的主要信息存放的区段称为LLDPPDU中,它又分为若干个不同的单元(称为TLV)。举几个比较常用的例子:
Chassis ID TLV。用于通告该LLDPDU发送者的chassis ID,可以有多种不同类型的标识方式。
Port ID TLV它用于标识发送该LLDPDU的设备的端口,与上一个类似。
Time To Live TLV。用于告诉接收端,它接收到的这些信息的有效期有多长。
由于该协议并不是局域网通信的重点,所以就不详细介绍了,放一张抓到的一个LLDP包,关于该协议更详细的介绍可以参见博客数据链路层学习之LLDP。
2. DHCP无状态地址自动配置
对于只用于一条链路的地址(链路本地地址),如本文的环境,一台主机只需要找到一个在链路上未使用的地址即可。因为在一台主机没有手动配置地址,并且网络上没有DHCP服务器的情况下,基于IP的通信是不可能发生的,除非主机使用某种方式生成IP地址。链路本地地址范围在169.254.1.1 - 169.254.254.254。从本质上说,无状态地址自动配置就是一台主机在地址范围内随机选择一个地址,然后通过IPv4的ACD(自动冲突检测)来检查该地址是否已经被使用。ACD使用ARP协议,发送一个被称为ARP探测分组的分组,其中发送方地址被设为0,可以用于查看一个候选的IPv4地址是否被广播域中的其他系统使用。
经过这一步,主机就具有了一个IP地址(本例中为169.254.46.160)。同时对端主机也在随后使用了相同方法获得一个地址(本例中为169.254.252.226)
(事实上这时候还抓到了DHCP Discover的数据包,但是由于没有DHCP服务器的存在,所以并不会有回应)
3. LLMNR
LLMNR(本地链路组播名称解析)在DNS服务器不可用时,DNS 客户端计算机可以使用本地链路组播名称解析,通过UDP发送到组播地址224.0.0.252:5355,来解析本地网段上的名称,使用的也是普通DNS的数据包格式。类似的另一种协议是mDNS(组播DNS),通过UDP协议发送到组播地址224.0.0.251:5353,用于家庭局域网等小型网络。
LLMNR为使用IPv4、IPv6或者同时使用这两种地址的设备提供了点对点名称解析服务,可以让同一子网中的IPv4和IPv6设备不需要WINS或DNS服务器就可以解析对方的名称。
例如,如果路由器出现故障,从网络上的所有 DNS 服务器切断了子网,则支持 LLMNR 的子网上的客户端可以继续在对等基础上解析名称,直到网络连接还原为止。除了在网络出现故障的情况下提供名称解析以外,LLMNR 在建立临时对等网络方面也非常有用。
不过在抓包的时候发现LLMNR的包均为query却没有相应,所以推测应该是没有起到效果。
4. IGMPv3
IGMP(Internet Group Management Protocol,互联网组管理协议)是TCP/IP 协议族中负责IP 组播成员管理的协议,用来在IP 主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。
在本例中,主机使用IGMP version3加入了如下组播组:
加入了224.0.0.251(252)组播组,这是LLMNR和mDNS所使用的组播地址。
加入了239.255.255.250组播组,这是SSDP(简单服务发现协议)所使用的组播地址,这是路由器的UPNP服务使用的协议。
关于报文格式以及组播相关的概念不是本文的重点,所以不在这里赘述,值得注意的是,主机在加入组播组的一段时间后会退出组播组,之后又加入,以下是抓到的IGMP报文。
5. SSDP
SSDP(简单服务发现协议)是应用层协议,是构成UPnP(通用即插即用)技术的核心协议之一。它为网络客户端(network client)提供了一种发现网络服务(network services)的机制,采用基于通知和发现路由的多播方式实现。
SSDP有两种不同的类型:发现请求和存在通知。在本例中用到的只有发现请求(Discovery request 或查询请求)。SSDP客户端向此地址发送HTTP UDP 发现请求,查询某种类型的服务。SSDP服务在此地址上监听服务发现请求。当服务监听到的HTTP UDP 发现请求和它自己提供的服务匹配时,它以单播方式发送HTTP UDP 响应。
实际过程中只有对端主机发送了这个数据包,不过没有收到响应,放一个相关的包作为参考吧。关于SSDP更详细的介绍可以见 SSDP 简单服务发现协议
6. NBNS
NBNS(网络基本输入/输出系统 (NetBIOS) 名称服务器)在基于 NetBIOS 名称访问的网络上提供主机名和地址映射方法。
NetBIOS是Network Basic Input/Output System的简称,一般指用于局域网通信的一套API,不支持路由,NetBIOS提供三种不同的服务: 名字服务:名字登记和解析;会话服务:可靠的基于连接的通信;数据包服务:不可靠的无连接通信 。在Windows下通过nbtstat -n
可以查询本地NetBIOS相关信息。
NBNS是动态DNS的一种,Microsoft的NBNS实现称为WINS(Windows Internet Name Service)。WINS数据库是动态更新的。计算机每当初始化TCP/IP后都会将它的NetBIOS名和IP地址的对应关系映射到WINS服务器的数据库中。如果在局域网络中抓取并观察数据包,会发现有大量的NBNS数据包。开启了WINS的主机就会发出广播,使用UDP协议,连137端口。
如果计算机需要知道一个NetBIOS名称或者域名对应的IP地址,首先会查找本地Hosts文件和NetBIOS缓存,其次会向WINS服务器发出请求,会发出NBNS数据包,最后会联系DNS服务器进行解析。
7. BROWSER
协议全称Microsoft-Windows-BrowserService,是一个应用层协议。关于这个协议似乎没找到什么资料,看上去应该是类似于DNS的一个服务,官方文档上的描述是这样的:
The Microsoft-Windows-BrowserService component maintains a list of all available domains and servers on a network.