TCP/IP协议族——ARP、DNS工作原理及实例详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/walkerkalr/article/details/34420041



测试网络:

通过VMware创建了两个虚拟机,并利用桥接方式联网以此模拟两台主机连接一台路由器的情况。测试网络图如下:

ARP协议工作原理

ARP协议能实现任意网络地址到任意物理地址的转换,这里仅讨论IP地址到以太网地址(MAC地址)的转换。其工作原理是:主机向自己所在网络广播一个ARP请求,该请求包含目标机器的网络地址。此网络上的其他机器都将接收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。

以太网ARP请求/应答报文

以太网ARP请求/应答报文格式如下:

ARP高速缓存的查看和修改

ARP维护一个高速缓存,其中包含经常访问或最近访问的机器的IP地址到物理地址的映射,这样就避免了重复ARP请求,提高了发送数据包的速度。Linux下可以使用ar命令查看和修改ARP高速缓存。

$arp –a #查看arp缓存内容

? (192.168.73.254) at 00:50:56:ed:6c:66[ether] on eth0

? (192.168.73.2) at 00:50:56:f6:be:f2[ether] on eth0

? (192.168.73.130) at 00:0c:29:9b:94:99[ether] on eth0

 

$ sudoarp -d 192.168.73.130 #删除arp缓存中192.168.73.130

$arp –a

? (192.168.73.254) at 00:50:56:ed:6c:66[ether] on eth0

? (192.168.73.2) at 00:50:56:f6:be:f2[ether] on eth0

? (192.168.73.130) at<incomplete> on eth0 #注意改变前后变化

 

$sudo arp -s 192.168.73.130 08:00:27:53:10:67 #增加arp缓存中192.168.73.130

$arp –a

? (192.168.73.254) at 00:50:56:ed:6c:66[ether] on eth0

? (192.168.73.2) at 00:50:56:f6:be:f2 [ether]on eth0

? (192.168.73.130) at 08:00:27:53:10:67[ether] PERM on eth0

 

使用tcpdump观察ARP通信过程

$ sudo arp -d 192.168.73.130 #清除li123对应项

$ sudo tcpdump -i eth0 -ent '(dst 192.168.73.130 and src 192.168.73.129) or (dst 192.168.73.129 and src 192.168.73.130)'

#抓包命令

$ telnet 192.168.73.130          #开启另一个终端执行telnet命令

在输入tcpdump命令的终端上输出:

00:0c:29:37:53:19 > ff:ff:ff:ff:ff:ff,ethertype ARP (0x0806), length 42: Request who-has 192.168.73.130 tell192.168.73.129, length 28

00:0c:29:9b:94:99 > 00:0c:29:37:53:19,ethertype ARP (0x0806), length 60: Reply 192.168.73.130 is-at00:0c:29:9b:94:99, length 46

第一个数据包中ARP源端物理地址00:0c:29:37:53:19,目的端物理地址ff:ff:ff:ff:ff:ff,这是以太网广播地址,用以表示整个局域网。数值0x0806表示分用的目标是ARP模块,其中以太网帧的长度是42字节(实际上是46字节,加上4字节的CRC校验码),其中数据部分长度为28字节。”Request”表示这是一个ARP请求,“who-has 192.168.73.130 tell 192.168.73.129”表示chen123要查询li123的IP地址。

第二个数据包源端物理地址为00:0c:29:9b:94:99,目的端物理地址为00:0c:29:37:53:19。Reply表示这是一个ARP应答,“192.168.73.130is-at 00:0c:29:9b:94:99”表示目标机器li123告知其物理地址。

DNS工作原理

DNS是一套分布式的域名服务系统。每个DNS服务器上都存放着大量的机器名和IP地址映射,并且是动态更新的。众多网络客户端都使用DNS协议来向DNS服务器查询目标主机的IP地址。

Linux下访问DNS服务

一个常用访问DNS服务器的客户端程序是host:

$host -t Awww.baidu.com

www.baidu.com is an alias forwww.a.shifen.com.

www.a.shifen.com has address115.239.211.110

www.a.shifen.com has address 115.239.210.27

host命令告诉我们,机器名www.baidu.comwww.a.shifen.com的别名,并且该机器对于两个IP地址。host命令中-t选项告诉DNS协议使用哪种查询类型,这里我们使用A类型,即通过机器的域名获得其IP地址。

使用tcpdump观察DNS通信过程

将/etc/resolv的内容:

nameserver 127.0.1.1

search localdomain

修改为

nameserver 219.239.26.42

nameserver 124.207.160.106

我们知道127.0.0.1是回路地址,而127.0.1.1也是保留地址,用来解析主机名。可以在文件/etc/hosts中看到如下内容:

127.0.0.1 localhost

127.0.1.1 ubuntu

在/etc/hostname中可以查到主机名,这里不出所料是“Ubuntu”当设置自带的DNSmasq,需要将其设置为127.0.1.1,本例为了容易观察DNS通信过程,所以将其改变。

然后键入如下命令:

$sudo tcpdump -i eth0 -nt -s 500 port domain

$host -t Awww.baidu.com(在新的终端上执行)

可以在输入tcpdump命令的终端上看到以下输出:

IP 192.168.73.129.33293 >219.239.26.42.53: 17643+ A? www.baidu.com. (31)

IP 219.239.26.42.53 >192.168.73.129.33293: 17643 3/5/5 CNAME www.a.shifen.com., A 119.75.218.77, A119.75.217.56 (260)

第一个数据包书机器chen123(192.168.73.129)向其首选DNS服务器(目标IP地址219.239.26.42)发送的DNS查询报文(目标端口53是DNS服务器使用的端口),数值17643是DNS查询报文的标识符。括号中的(31)是DNS报文查询长度,A?标识A类型查询方式。
   第二个数据包是DNS应答报文,3/5/5表示该报文包含3个应答资源记录,5个授权资源记录和5个额外信息记录。CNAMEwww.a.shifen.com., A 119.75.218.77, A 119.75.217.56表示3个应答资源记录的内容。

 

参考Linux高性能服务器编程

转载注明出处,谢谢~~

展开阅读全文

没有更多推荐了,返回首页