首页 > 代码库 > TCP/IP协议族——ARP、DNS工作原理及实例详解
TCP/IP协议族——ARP、DNS工作原理及实例详解
测试网络:
通过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通信过程
$ sudoarp -d 192.168.73.130 #清除li123对应项
$ sudotcpdump -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)‘
#抓包命令
$ telnet192.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.com是www.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高性能服务器编程
转载注明出处,谢谢~~