《Wireshark数据包分析实战》(三)地址解析协议(ARP)

《Wireshark数据包分析实战》(三)地址解析协议(ARP),第1张

网络上的通信会使用到逻辑地址(IP地址)和物理地址(MAC地址)。逻辑地址可以使得不同网络以及没有直接相连的设备之间能够进行通信。物理地址则用来在单一网段中交换机直接连接的设备之间进行通信。在大多数情况下,正常通信需要这两种地址协同工作。

我们假设这样一个场景:你需要和你网络中的一个设备进行通信,这个设备可能是某种服务器,或者只是你想与之共享文件的另一个工作站。你所用来创建这个通信的应用已经得到这个远程主机的IP地址(通过DNS服务),也意味着系统已经拥有用来构建它想要在第3层到第7层中传递的数据包所需要的信息。这时它所需要的唯一信息就是第2层包含目标主机MAC地址的数据链路层数据。

之所以需要MAC地址,是因为网络中用于连接各个设备的交换机使用了内容寻址寄存器(CAM)。这个表列出了它在每一个端口所有连接设备的MAC地址。当交换机收到一个指向特定MAC地址的流量,它会使用这个表,来确定应该使用哪一个端口发送流量。如果目标的MAC地址是未知的,这个传输设备会首先在它的缓存中查找这个地址,如果没有找到,那么这个地址就需要在网络上额外的通信来解析了。

TCP/IP网络(基于IPv4)中用来将IP地址解析为MAC地址的过程称为地址解析协议(Address Resolution Protocol,ARP),它的解析过程只使用两种数据包:一个ARP请求与一个ARP响应。

让我们做个小实验,在局域网内ping一个主机IP,假设是第一次ping,本机的ARP表并未缓存,可以通过 arp -a 命令查看。

本机IP19216837,ping局域网内19216835的主机,执行以下命令:

开始抓包分析。

上图是一个ARP请求数据包,通过Wireshark的Packet Details面板中,检查以太网头,来确定这个数据包是否是一个真的广播数据包。这个数据包的目的地址是ff:ff:ff:ff:ff:ff:ff。这是一个以太网的广播地址,所有发送到这个地址的数据包都会被广播到当前网段中的所有设备。这个数据包中以太网头的源地址就是我的MAC地址。

在这个给定的结构中,我们可以确定这的确是一个在以太网上使用IP的ARP请求,从数据包的 *** 作码(opcode)为1可以得知。这个ARP的头列出了发送方的IP(本机的IP 19216837)和MAC地址,以及接收方的IP地址19216835。我们想要得到的目标MAC地址,还是未知的,所以这里的目的MAC地址填写为00:00:00:00:00:00。

这是一个回应ARP请求的响应,opcode现在是2表示这是一个响应而不是请求。

发送方和接收方的地址发生了转换,重要的是现在数据包中所有的信息都是可用的,也就是说我们现在有了19216835主机的MAC地址。

执行以下命令

可以得知19216835及其对应的MAC地址已经被缓存。

大多数情况下,一个设备的IP地址是可以改变的。当这样的改变发生后,网络主机中缓存的IP和MAC地址映射就不再有效了。为了防止造成通信错误,无偿的ARP请求会被发送到网络中,强制所有收到它的设备去用新的IP和MAC地址映射更新缓存。

检查上述数据包,你会看见这个数据包是以广播的形式发送,以便网络上的所有主机都能收到它。这个ARP头的特点就是发送方的IP地址和目标IP地址是相同的。当这个数据包被网络中的其他主机接收到之后,它会让这些主机更新映射表,由于这个ARP数据包时未经请求的,却导致客户端更新ARP缓存,所以会称之为无偿。

硬件信息无法获取。你写的代码都是在浏览器里运行,浏览器没有提供这个接口,必须要插件才行的。

js的window对象可以获取浏览器和请求相关信息

location对象和navigator对象

locationhostname 返回 web 主机的域名

locationpathname 返回当前页面的路径和文件名

locationport 返回 web 主机的端口 (80 或 443)

locationprotocol 返回所使用的 web 协议(>

、TCP/IP协议栈

四层模型

TCP/IP这个协议遵守一个四层的模型概念:应用层、传输层、互联层和网络接口层。

网络接口层

模型的基层是网络接口层。负责数据帧的发送和接收,帧是独立的网络信息传输单元。网络接口层将帧放在网上,或从网上把帧取下来。

互联层

互联协议将数据包封装成internet数据报,并运行必要的路由算法。

这里有四个互联协议:

网际协议IP:负责在主机和网络之间寻址和路由数据包。

地址解析协议ARP:获得同一物理网络中的硬件主机地址。

网际控制消息协议ICMP:发送消息,并报告有关数据包的传送错误。

互联组管理协议IGMP:被IP主机拿来向本地多路广播路由器报告主机组成员。

传输层

传输协议在计算机之间提供通信会话。传输协议的选择根据数据传输方式而定。

两个传输协议:

传输控制协议TCP:为应用程序提供可靠的通信连接。适合于一次传输大批数据的情况。并适用于要求得到响应的应用程序。

用户数据报协议UDP:提供了无连接通信,且不对传送包进行可靠的保证。适合于一次传输小量数据,可靠性则由应用层来负责。

应用层

应用程序通过这一层访问网络。

网络接口技术

IP使用网络设备接口规范NDIS向网络接口层提交帧。IP支持广域网和本地网接口技术。

串行线路协议

TCP/IPG一般通过internet串行线路协议SLIP或点对点协议PPP在串行线上进行数据传送。(是不是我们平时把它称之为异步通信,对于要拿LINUX提供建立远程连接的朋友应该多研究一下这方面的知识)

2、ARP

要在网络上通信,主机就必须知道对方主机的硬件地址(我们不是老遇到网卡的物理地址嘛)。地址解析就是将主机IP地址映射为硬件地址的过程。地址解析协议ARP用于获得在同一物理网络中的主机的硬件地址。

解释本地IP地址(要了解地址解析工作过程的朋友看好了)

主机IP地址解析为硬件地址:

(1)当一台主机要与别的主机通信时,初始化ARP请求。当该IP断定IP地址是本地时,源主机在ARP缓存中查找目标主机的硬件地址。

(2)要是找不到映射的话,ARP建立一个请求,源主机IP地址和硬件地址会被包括在请求中,该请求通过广播,使所有本地主机均能接收并处理。

(3)本地网上的每个主机都收到广播并寻找相符的IP地址。

(4)当目标主机断定请求中的IP地址与自己的相符时,直接发送一个ARP答复,将自己的硬件地址传给源主机。以源主机的IP地址和硬件地址更新它的ARP缓存。源主机收到回答后便建立起了通信。

解析远程IP地址

不同网络中的主机互相通信,ARP广播的是源主机的缺省网关。

目标IP地址是一个远程网络主机的话,ARP将广播一个路由器的地址。

(1)通信请求初始化时,得知目标IP地址为远程地址。源主机在本地路由表中查找,若无,源主机认为是缺省网关的IP地址。在ARP缓存中查找符合该网关记录的IP地址(硬件地址)。

(2)若没找到该网关的记录,ARP将广播请求网关地址而不是目标主机的地址。路由器用自己的硬件地址响应源主机的ARP请求。源主机则将数据包送到路由器以传送到目标主机的网络,最终达到目标主机。

(3)在路由器上,由IP决定目标IP地址是本地还是远程。如果是本地,路由器用ARP(缓存或广播)获得硬件地址。如果是远程,路由器在其路由表中查找该网关,然后运用ARP获得此网关的硬件地址。数据包被直接发送到下一个目标主机。

(4)目标主机收到请求后,形成ICMP响应。因源主机在远程网上,将在本地路由表中查找源主机网的网关。找到网关后,ARP即获取它的硬件地址。

(5)如果此网关的硬件地址不在ARP缓存中,通过ARP广播获得。一旦它获得硬件地址,ICMP响应就送到路由器上,然后传到源主机。

ARP缓存

为减少广播量,ARP在缓存中保存地址映射以备用。ARP缓存保存有动态项

和静态项。动态项是自动添加和删除的,静态项则保留在CACHE中直到计算机重新启动。

ARP缓存总是为本地子网保留硬件广播地址(0xffffffffffffh)作为一个永久项。

此项使主机能够接受ARP广播。当查看缓存时,该项不会显示。

每条ARP缓存记录的生命周期为10分钟,2分钟内未用则删除。缓存容量满时,删除最老的记录。

加入静态(永久)记录通过添加静态ARP项可减少ARP请求访问主机的次数。

ARP包的结构

ARP结构的字段如下:

硬件类型--使用的硬件(网络访问层)类型。

协议类型--解析过程中的协议使用以太类型的值。

硬件地址长度--硬件地址的字节长度,对于以太网和令牌环来说,其长度为6字节。

协议地址长度--协议地址字节的长度,IP的长度是4字节。

*** 作号--指定当前执行 *** 作的字段。

发送者的硬件地址--发送者的硬件地址。

发送者的协议地址--发送者的协议地址。

目的站硬件地址--目标者的硬件地址。

目的站协议地址--目标者的协议地址。

3、ICMP和IGMP

internet控制消息协议ICMP是用于报告错误并代表IP对消息进行控制。

IP运用互联组管理协议IGMP来告诉路由器,某一网络上指导组中的可用主机。

ICMP

ICMP源抑制消息:当TCP/IP主机发送数据到另一主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个ICMP源抑制消息。

ICMP数据包结构

类型:一个8位类型字段,表示ICMP数据包类型。

代码:一个8位代码域,表示指定类型中的一个功能。如果一个类型中只有一种功能,代码域置为0。

检验和:数据包中ICMP部分上的一个16位检验和。

指定类型的数据随每个ICMP类型变化的一个附加数据。

IGMP

IGMP信息传给别的路由器以使每个支持多路广播的路由器获知哪个主机组和哪个网络中。

IGMP包结构

版本:IGMP的版本,值一般为0x1h。

类型:IGMP消息的类型。0x1h类型称为主机成员请求,在多路广播路由器上用于指定多级组中的任何成员轮询一个网络。0x2h类型称为主机成员报告,在主机上用于发布指定组中的成员情况或对一个路由器的主机成员请求进行回答。

未用:未用的域名被发送者置零且被接收者忽略。

检验和:IGMP头的一个16位检验和。

组地址:主机用该组地址在一个主机成员请求中存储IP多路广播地址。在主机成员请求中,组地址被全置零,而且硬件级的多路广播地址被用来标示主机组。

4、IP

IP是一个无连接的协议,主要就是负责在主机间寻址并为数据包设定路由,在交换数据前它并不建立会话。因为它不保证正确传递,另一方面,数据在被收到时,IP不需要收到确认,所以它是不可靠的。有一些字段,在当数据从传输层传下来时,会被附加在数据包中,我们来看一下这些字段:

源IP地址:用IP地址确定数据报发送者。

目标IP地址:用IP地址确定数据报目标。

协议:告知目的机的IP是否将包传给TCP或UDP。

检查和:一个简单的数学计算,用来证实收到的包的完整性。

TTL生存有效时间:指定一个数据报被丢弃之前,在网络上能停留多少时间(以秒计)。它避免了包在网络中无休止循环。路由器会根据数据在路由器中驻留的时间来递减TTL。其中数据报通过一次路由器,TTL至少减少一秒。根据我们前面提到关于ARP的知识,如果IP地址目标为本地地址时,IP将数据包直接传给那个主机;如果目标地址为远程地址的话,IP在本地的路由表中查找远程主机的路由(看来好象我们平时拨114一样)。如果找到一个路由,IP用它传送数据包。如果没找到呢,就会将数据包发送到源主机的缺省网关,也称之为路由器。(很多时候一直在搞网关和路由器的定义,其实我觉得在学的时候不一定死抠概念,现在硬件和软件结合的产品越来越多了,一时很分清的,只要我们运用的时候可以解决实际问题嘛。)这样当路由器收到一个包后,该包向上传给IP:

(1)如果交通阻塞(听起来蛮可怕的),包在路由器中停滞,TTL至少减1或更多。要是它降到0的话,包就会被抛弃。

(2)如果对于下一网络来说包太大的话,IP会将它分割成若干个小包。

(3)如果包被分解,IP为每个新包制造一个新头,其中包括:一个标志,用来显示其它小包在其后;一个小包ID,用来确定所有小包是一起的;一个小包偏移,用来告诉接收主机怎么重新组合它们。

(4)IP计算一个新的检验和。

(5)IP获取一个路由的目标硬件地址。

(6)IP转发包。

在下一主机,包被发送到TCP或UDP。每个路由器都要重复该过程。直到包到达最终目的地。当包到达最终目的地后,IP将小包组装成原来的包。

5、TCP

TCP是一种可靠的面向连接的传送服务。它在传送数据时是分段进行的,主机交换数据必须建立一个会话。它用比特流通信,即数据被作为无结构的字节流。通过每个TCP传输的字段指定顺序号,以获得可靠性。如果一个分段被分解成几个小段,接收主机会知道是否所有小段都已收到。通过发送应答,用以确认别的主机收到了数据。对于发送的每一个小段,接收主机必须在一个指定的时间返回一个确认。如果发送者未收到确认,数据会被重新发送;如果收到的数据包损坏,接收主机会舍弃它,因为确认未被发送,发送者会重新发送分段。

端口

SOCKETS实用程序使用一个协议端口号来标明自己应用的唯一性。端口可以使用0到65536之间的任何数字。在服务请求时, *** 作系统动态地为客户端的应用程序分配端口号。

套接字

套接字在要领上与文件句柄类似,因为其功能是作为网络通信的终结点。一个应用程序通过定义三部分来产生一个套接字:主机IP地址、服务类型(面向连接的服务是TCP,无连接服务是UDP)、应用程序所用的端口。

TCP端口

TCP端口为信息的传送提供定地点,端口号小于256的定义为常用端口。

TCP的三次握手

TCP对话通过三次握手来初始化。三次握手的目的是使数据段的发送和接收同步;告诉其它主机其一次可接收的数据量,并建立虚连接。我们来看看这三次握手的简单过程:

(1)初始化主机通过一个同步标志置位的数据段发出会话请求。

(2)接收主机通过发回具有以下项目的数据段表示回复:同步标志置位、即将发送的数据段的起始字节的顺序号、应答并带有将收到的下一个数据段的字节顺序号。

(3)请求主机再回送一个数据段,并带有确认顺序号和确认号。

TCP滑动窗口

TCP滑动窗口用来暂存两台主机间要传送的数据,有点类似CACHE。每个TCP/IP主机有两个滑动窗口:一个用于接收数据,另一个用于发送数据。

6、UDP

用户数据报协议UDP提供了无连接的数据报服务。它适用于无须应答并且通常一次只传送少量数据的应用软件。

UDP端口

端口作为多路复用的消息队列使用。

15 NETSTAT 网络状态

53 DOMAIN 域名服务器

69 TFTP 平凡文件传送协议

137 NETBIOS-NS NETBIOS命令服务

138 NETBIOS-DGM NETBIOS数据报服务

161 SNMP SNMP网络监视器

IP地址分配

1、IP地址

IP地址标识着网络中一个系统的位置。我们知道每个IP地址都是由两部分组成的:网络号和主机号。其中网络号标识一个物理的网络,同一个网络上所有主机需要同一个网络号,该号在互联网中是唯一的;而主机号确定网络中的一个工作端、服务器、路由器其它TCP/IP主机。对于同一个网络号来说,主机号是唯一的。每个TCP/IP主机由一个逻辑IP地址确定。

网络号和主机号

IP地址有两种表示形式:二进制表示(1和0太多了就搞不清)和点分十进制表示。每个IP地址的长度为4字节,由四个8位域组成,我们通常称之为八位体。八位体由句点分开,表示为一个0-255之间的十进制数。一个IP地址的4个域分别标明了网络号和主机号。

2、地址类型

为适应不同大小的网络,internet定义了5种IP地址类型。

可以通过IP地址的前八位来确定地址的类型:

类型 IP形式 网络号 主机号

A类 wxyz w xyz

B类 wxyz wx yz

C类 wxyz wxy z

我们来看一下这5类地址:

A类地址:可以拥有很大数量的主机,最高位为0,紧跟的7位表示网络号,余24位表示主机号,总共允许有126个网络。

B类地址:被分配到中等规模和大规模的网络中,最高两位总被置于二进制的10,允许有16384个网络。

C类地址:被用于局域网。高三位被置为二进制的110,允许大约200万个网络。

D类地址:被用于多路广播组用户,高四位总被置为1110,余下的位用于标明客户机所属的组。E类地址是一种仅供试验的地址。

3、地址分配指南

在分配网络号和主机号时应遵守以下几条准则:

(1)网络号不能为127。大家知道该标识号被保留作回路及诊断功能,还记得平时ping 127001?

(2)不能将网络号和主机号的各位均置1。如果每一位都是1的话,该地址会被解释为网内广播而不是一个主机号。(TCP/IP是一个可广播的协议嘛)

(3)相应于上面一条,各位均不能置0,否则该地址被解释为“就是本网络”。

(4)对于本网络来说,主机号应该是唯一。(否则会出现IP地址已分配或有冲突之类的错误)

分配网络号

对于每个网络以及广域连接,必须有唯一的网络号,主机号用于区分同一物理网络中的不同主机。如果网络由路由器连接,则每个广域连接都需要唯一的网络号。

分配主机号

主机号用于区分同一网络中不同的主机,并且主机号应该是唯一的。所有的主机包括路由器间的接口,都应该有唯一的网络号。路由器的主机号,要配置成工作站的缺省网关地址。

有效的主机号

A类:w001--w255255254

B类:wx01--wx255254

C类:wxy1--wxy254

4、子网屏蔽和IP地址

TCP/IP上的每台主机都需要用一个子网屏蔽号。它是一个4字节的地址,用来封装或“屏蔽”IP地址的一部分,以区分网络号和主机号。当网络还没有划分为子网时,可以使用缺省的子网屏蔽;当网络被划分为若干个子网时,就要使用自定义的子网屏蔽了。

缺省值

我们来看看缺省的子网屏蔽值,它用于一个还没有划分子网的网络。即使是在一个单段网络上,每台主机也都需要这样的缺省值。它的形式依赖于网络的地址类型。在它的4个字节里,所有对应网络号的位都被置为1,于是每个八位体的十进制值都是255;所有对就主机号的位都置为0。例如:C类网地址19216801和相应的缺省屏蔽值2552552550。

确定数据包的目的地址

我们说把屏蔽值和IP地址值做“与”的 *** 作其实是一个内部过程,它用来确定一个数据包是传给本地还是远程网络上的主机。其相应的 *** 作过程是这样的:当TCP/IP初始化时,主机的IP地址和子网屏蔽值相“与”。在数据包被发送之前,再把目的地址也和屏蔽值作“与”,这样如果发现源IP地址和目的IP地址相匹配,IP协议就知道数据包属于本地网上的某台主机;否则数据包将被送到路由器上。

注:我们知道“与” *** 作是将IP地址中的每一位与子网屏蔽中相应的位按逻辑与作比较。

通常我们所说的几层设备中的层就表示此设备所处理的网络协议层的数量,例如:

其中,hub 和 switch 都用于局域网,而 router 可跨局域网。

首先提出一个问题:

水晶头的第1、2和第3、6脚分别起着收、发信号的作用。将一端的 1 号和 3号线、2号线和6号线的位置互换下,就能在物理层实现一端发送信号,另一端接收信号。

当然电脑连电脑,除了网线要交叉外,还需要配置这两台电脑的 IP 地址、子网掩码和默认网关,要两台电脑能够通信,必须将它们配置到同一个子网中。例如19216801/24 和 19216802/24。

另外需要注意的是,虽然两台电脑通信只在物理层做了工作,但是电脑之间通信的包必须都是完整的,这也是上面要求配置 ip 相关参数的原因。

那么 3 台 或 3 台以上需要连接在一起呢? 这时候集线器就派上用场了。集线器完全在物理层工作,它将自己收到的没一个字节,都复制到其他端口上去。

从上面物理层的讲解可以看出,Hub 采取的是广播的模式,如果每一台电脑发出的包,宿舍的每个电脑都能收到,那就麻烦了。这就需要解决以下几个问题:

这些问题都是第二层(MAC 层)要解决的问题。

MAC 的全称是 Medium Access Control,即媒体访问控制。控制什么呢?其实就是控制在往媒体上发送数据的时候,谁先发、谁后发的问题,防止发生混乱。这需要一些规则来限制,也就是多路访问。一般有以下规则:

以上解决了媒体接入控制的问题,MAC的问题也就解决好了。

解决了第二问题,下面我们来解决第一个问题:发给谁,谁接收?这里就需要用到一个物理地址,即mac地址。解决此问题就涉及第二层网络包格式。对于以太网来说,第二层网络包格式如下:

在网络包的最开始是目标 mac 地址和源 mac 地址。接下来是类型,主要是 IP 数据包,然后 ip 里面包含了 tcp、udp 以及 >

一:问题:如何获得本机/远程主机的MAC地址,且不受 *** 作系统类型的限制,也不受本机和远程主机是否在同一个LAN中的限制。

二:解决的方法

注:就我所看到的有关“如何获得本机/远程主机的MAC地址”的方法总结如下。

这些方法及程序参考了本站及其他站点,以及用google搜索到的一些牛人的解法和源代码,我在此对他们深表感谢,在此就不说他们的大名了。

我所总结的方法和以及我写的代码一定存在许多不足,敬请各位同志斧正!!!

欢迎讨论!!!如果您认为值得转载的话,欢迎转载。

(一)获得本机的MAC地址

1:在WINDOWS 2000/XP下,使用ipconfig /all ,或者route print ,或者nbtstat 本机的IP地址;

2:在Linux/UNIX/类UNIX下,使用ifconfig;

3:自己写程序/参考牛人的程序实现,其原理可以参考arp协议;

(二)获得同一个LAN中主机的MAC地址

1:先ping目标主机,然后察看arp表,该方法不受 *** 作系统类型的限制;

2:在WINDOWS 2000/XP下,用nbtstat + 目标主机的IP地址;

3:在Linux下,用nbtstat + 目标主机的IP地址。(Linux系统本身没有提供,

但是在本站的“网络编程”版有一段用C语言写的原码,实现了WINDOWS下的nbtstat命令的部分功能。那段原码里面多了一个“}”符号);

注:2,3两种方法都只适合于目标主机是WINDOWS系统,且目标主机的137(135-139)端口是开放的。

4:自己写程序/参考牛人的程序实现,其原理可以参考arp协议;

(三)获得远程主机的MAC地址

1:在WINDOWS 2000/XP下,用nbtstat + 目标主机的IP地址;

2:在Linux下,用nbtstat + 目标主机的IP地址。(Linux系统本身没有提供,

但是在本站的“网络编程”版有一段用C语言写的原码,实现WINDOWS下的nbtstat命令的部分功能。那段原码里面多了一个“}”符号);

注:1,2两种方法都只适合于目标主机是WINDOWS系统,且目标主机的137(135-139)端口是开放的。

3:自己写程序/参考牛人的程序实现

三:我自己现在不是牛人,没有对问题给出一个圆满的解决方案。下面是我参考各位牛人的一些思想和源代码,在Java中通过系统调用实现的一段程序。该程序我已经在WINDOWS XP和RedHat Linux 90下测试通过。(要求系统只配了一个以太网卡,如有两块网卡,只能检测出其中的一块网卡的MAC地址,且可能造成显示的MAC/IP地址对与实际的MAC/IP地址对不符。)

以上就是关于《Wireshark数据包分析实战》(三)地址解析协议(ARP)全部的内容,包括:《Wireshark数据包分析实战》(三)地址解析协议(ARP)、网页上可以获取那些客户端(个人pc)的硬件信息(除了IP地址)、谁能告诉我如何阐述TCP/IP协议体系结构等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10149214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存