前言
本篇文章为笔者的读书笔记,未经允许请勿转载。如果对你有帮助记得点个赞(●’?’●) 本次实验是linux高性能服务器编程的第一个实验,目的在于了解ARP的运作过程 实验测试机是阿里云ECS服务器和本地虚拟机。不同于书本上,它的测试机是在同一局域网内。
开启服务机的echo服务
首先查看是否支持echo服务。/etc目录是Linux的配置目录,底下包含各种配置文件。这里的**/etc/service**文件记录了主机上可能用到的服务及常用端口号。
root@iZwz9e2t1qu6rzggq3tc0dZ:~
echo 7/tcp
echo 7/udp
echo 4/ddp
grep查找包含某字符串的行,前2行即echo服务,同时支持TCP和UDP。但是要查看系统上是否有该服务,得确认是否在对应端口上有监听套接字,因此用netstat命令,-l选项即listening,处于LISTEN(监听)状态的套接字,默认只会显示已连接的套接字。
root@iZwz9e2t1qu6rzggq3tc0dZ:~
root@iZwz9e2t1qu6rzggq3tc0dZ:~
可以看到没有echo进程监听,需要手动开启!
1. 安装openbsd-inetd
apt-get install openbsd-inetd
2. 打开/etc/initd.conf文件,按照注释中的示例添加echo服务
root@iZwz9e2t1qu6rzggq3tc0dZ:/
root@iZwz9e2t1qu6rzggq3tc0dZ:/
echo stream tcp nowait root internal
3.安装xinetd
apt-get install xinetd
4.配置echo文件,将disable由yes改为no
root@iZwz9e2t1qu6rzggq3tc0dZ:/
service echo
{
disable = no
type = INTERNAL
id = echo-stream
socket_type = stream
protocol = tcp
user = root
wait = no
}
service echo
{
disable = no
type = INTERNAL
id = echo-dgram
socket_type = dgram
protocol = udp
user = root
wait = yes
}
5.重启xinetd
/etc/init.d/xinetd restart
再次检查,可以发现echo服务已经开启
root@iZwz9e2t1qu6rzggq3tc0dZ:/
tcp6 0 0 [::]:echo [::]:* LISTEN
root@iZwz9e2t1qu6rzggq3tc0dZ:/
由于是阿里云服务器,不光系统要配置,安全组也要去配置 到目前位置服务器echo服务已经打开,本地虚拟机的打开方式除了最后一步其他都一样。 需要注意的是虚拟机的网络尽量选择桥接模式,这样可以节省时间。
实验开始
root@ubuntu:/home/marvel
? (192.168.1.1) 位于 24:58:6e:5a:dd:78 [ether] 在 ens33
? (192.168.1.6) 位于 b0:fc:36:59:13:bf [ether] 在 ens33
root@ubuntu:/home/marvel
清理缓存后打开监听端tcpdump,步骤要快点否则会被其他无用信息干扰
marvel@ubuntu:~$ sudo tcpdump arp -ent
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
-e选项开启以太网帧头部信息的显示,-n选项使用IP地址(而非主机名)代表主机,-t选项关闭时间戳的显示。 后用telnet 连接服务器echo服务
root@ubuntu:/home/marvel
Trying 120.79.72.214...
Connected to 120.79.72.214.
Escape character is '^]'.
^]
telnet> q
Connection closed.
tcpdump抓取到的众多数据包中,只有最靠前的两个和ARP通信有关系:如下
marvel@ubuntu:~$ sudo tcpdump arp -ent
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
00:0c:29:1a:09:94 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.1.1 tell 192.168.1.7, length 28
24:58:6e:5a:dd:78 > 00:0c:29:1a:09:94, ethertype ARP (0x0806), length 60: Reply 192.168.1.1 is-at 24:58:6e:5a:dd:78, length 46
^C
2 packets captured
3 packets received by filter
0 packets dropped by kernel
marvel@ubuntu:~$
第一个数据包中,ARP通信的源端物理地址是00:0c:29:1a:09:94(虚拟机),目的端的物理地址是ff:ff:ff:ff:ff:ff,这是以太网的广播地址,用以表示整个LAN。该LAN上的所有机器都会收到并处理这样的帧。数值0x806是以太网帧头部的类型字段的值,它表示分用目标是ARP模块。该以太网帧的长度为42字节(实际上是46字节,tcpdump没有统计以太网帧尾部4字节的CRC字段),其中数据部分为28字节,由于以太网头部是14字节,所以前一个length比后一个length大14。。“Request”表示这是一个ARP请求,“who-has 192.168.1.1 tell 192.168.1.7”表示虚拟机要查询服务器的ip地址,因为所访问的远程主机并不在局域网内,所以找到的ip地址为路由器地址,由路由器来完成后续寻址。
第二个数据包中,ARP通信的源端物理地址是24:58:6e:5a:dd:78(路由器),目的端的物理地址是00:0c:29:1a:09:94(虚拟机),“Reply”表示这是一个ARP应答,“192.168.1.1 is-at 24:58:6e:5a:dd:78”表示路由器报告其物理地址。该以太网帧的长度为60字节(实际上是64字节)。
原理图
ARP工作原理:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。此网络上的其他机器都将收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。
此次实验原理图如下 说明一下 ARP请求和应答是从以太网驱动程序发出的,而不是从ARP直接发出
|