linux 发送arp(linux arp命令)
老铁们,大家好,相信还有很多朋友对于linux 发送arp和linux arp命令的相关问题不太懂,没关系,今天就由我来为大家分享分享linux 发送arp以及linux arp命令的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
linux 好用的命令
Linux运维人员必会的120个命令
跟老男孩学Linux运维:核心系统命令实战
前言
第1章 Linux命令行简介/ 1
1.1Linux命令行概述/ 1
1.2在Linux命令行下查看命令帮助/ 4
1.3Linux shutdown reboot halt/ 9
关机:
shutdown-h now
halt
init 0
第2章文件和目录操作命令/ 13
2.1pwd:显示当前所在的位置/ 13
2.2cd:切换目录/ 16
2.3tree:以树形结构显示目录下的内容/ 18
2.4mkdir:创建目录/ 22
2.5touch:创建空文件或改变文件的时间戳属性/ 27
2.6ls:显示目录下的内容及相关属性信息/ 30
2.7cp:复制文件或目录/ 39
2.8mv:移动或重命名文件/ 42
2.9rm:删除文件或目录/ 45
2.10rmdir:删除空目录/ 48
2.11ln:硬链接与软链接/ 49
2.12readlink:查看符号链接文件的内容/ 54
2.13find:查找目录下的文件/ 55
2.14xargs:将标准输入转换成命令行参数/ 68
2.15rename:重命名文件/ 71
2.16basename:显示文件名或目录名/ 72
2.17dirname:显示文件或目录路径/ 72
2.18chattr:改变文件的扩展属性/ 73
2.19lsattr:查看文件扩展属性/ 75
2.20file:显示文件的类型/ 76
2.21md5sum:计算和校验文件的MD5值/ 77
2.22chown:改变文件或目录的用户和用户组/ 80
2.23chmod:改变文件或目录权限/ 81
2.24chgrp:更改文件用户组/ 85
2.25umask:显示或设置权限掩码/ 86
2.26老男孩从新手成为技术大牛的心法/ 90
第3章文件过滤及内容编辑处理命令/ 91
3.1cat:合并文件或查看文件内容/ 91
3.2tac:反向显示文件内容/ 103
3.3more:分页显示文件内容/ 104
3.4less:分页显示文件内容/ 107
3.5head:显示文件内容头部/ 109
3.6tail:显示文件内容尾部/ 111
3.7tailf:跟踪日志文件/ 114
3.8cut:从文本中提取一段文字并输出/ 115
3.9split:分割文件/ 117
3.10paste:合并文件/ 118
3.11sort:文本排序/ 123
3.12join:按两个文件的相同字段合并/ 127
3.13uniq:去除重复行/ 129
3.14wc:统计文件的行数、单词数或字节数/ 131
3.15iconv:转换文件的编码格式/ 133
3.16dos2unix:将DOS格式文件转换成UNIX格式/ 134
3.17diff:比较两个文件的不同/ 135
3.18vimdiff:可视化比较工具/ 138
3.19rev:反向输出文件内容/ 139
3.20tr:替换或删除字符/ 140
3.21od:按不同进制显示文件/ 143
3.22tee:多重定向/ 145
3.23vi/vim:纯文本编辑器/ 147
3.24老男孩逆袭思想:做Linux运维的多个好处/ 152
第4章文本处理三剑客/ 153
4.1grep:文本过滤工具/ 153
4.2sed:字符流编辑器/ 159
4.3awk基础入门/ 165
第5章 Linux信息显示与搜索文件命令/ 176
5.1uname:显示系统信息/ 176
5.2hostname:显示或设置系统的主机名/ 178
5.3dmesg:系统启动异常诊断/ 179
5.4stat:显示文件或文件系统状态/ 181
5.5du:统计磁盘空间使用情况/ 183
5.6date:显示与设置系统时间/ 186
5.7echo:显示一行文本/ 190
5.8watch:监视命令执行情况/ 193
5.9which:显示命令的全路径/ 195
5.10whereis:显示命令及其相关文件全路径/ 196
5.11locate:快速定位文件路径/ 197
5.12updatedb:更新mlocate数据库/ 199
5.13老男孩逆袭思想:新手在工作中如何问问题不会被鄙视/ 200
第6章文件备份与压缩命令/ 201
6.1tar:打包备份/ 201
6.2gzip:压缩或解压文件/ 208
6.3zip:打包和压缩文件/ 211
6.4unzip:解压zip文件/ 212
6.5scp:远程文件复制/ 214
6.6rsync:文件同步工具/ 216
6.7老男孩逆袭思想:新手如何高效地提问/ 220
第7章 Linux用户管理及用户信息查询命令/ 222
7.1 useradd:创建用户/ 222
7.2usermod:修改用户信息/ 227
7.3userdel:删除用户/ 229
7.4groupadd:创建新的用户组/ 230
7.5groupdel:删除用户组/ 231
7.6passwd:修改用户密码/ 232
7.7chage:修改用户密码有效期/ 237
7.8chpasswd:批量更新用户密码/ 238
7.9su:切换用户/ 240
7.10visudo:编辑sudoers文件/ 242
7.11sudo:以另一个用户身份执行命令/ 244
7.12id:显示用户与用户组的信息/ 248
7.13w:显示已登录用户信息/ 249
7.14who:显示已登录用户信息/ 250
7.15users:显示已登录用户/ 252
7.16whoami:显示当前登录的用户名/ 253
7.17last:显示用户登录列表/ 253
7.18lastb:显示用户登录失败的记录/ 254
7.19lastlog:显示所有用户的最近登录记录/ 255
第8章 Linux磁盘与文件系统管理命令/ 257
8.1fdisk:磁盘分区工具/ 257
8.2partprobe:更新内核的硬盘分区表信息/ 265
8.3tune2fs:调整ext2/ext3/ext4文件系统参数/ 266
8.4parted:磁盘分区工具/ 268
8.5mkfs:创建Linux文件系统/ 272
8.6dumpe2fs:导出ext2/ext3/ext4文件系统信息/ 274
8.7resize2fs:调整ext2/ext3/ext4文件系统大小/ 275
8.8fsck:检查并修复Linux文件系统/ 278
8.9dd:转换或复制文件/ 281
8.10mount:挂载文件系统/ 284
8.11umount:卸载文件系统/ 288
8.12df:报告文件系统磁盘空间的使用情况/ 289
8.13mkswap:创建交换分区/ 293
8.14swapon:激活交换分区/ 294
8.15swapoff:关闭交换分区/ 295
8.16sync:刷新文件系统缓冲区/ 296
第9章 Linux进程管理命令/ 298
9.1ps:查看进程/ 298
9.2pstree:显示进程状态树/ 305
9.3pgrep:查找匹配条件的进程/ 306
9.4kill:终止进程/ 307
9.5killall:通过进程名终止进程/ 310
9.6pkill:通过进程名终止进程/ 311
9.7top:实时显示系统中各个进程的资源占用状况/ 313
9.8nice:调整程序运行时的优先级/ 320
9.9renice:调整运行中的进程的优先级/ 323
9.10nohup:用户退出系统进程继续工作/ 324
9.11strace:跟踪进程的系统调用/ 325
9.12ltrace:跟踪进程调用库函数/ 332
9.13runlevel:输出当前运行级别/ 334
9.14init:初始化Linux进程/ 335
9.15service:管理系统服务/ 335
第10章 Linux网络管理命令/ 338
10.1ifconfig:配置或显示网络接口信息/ 338
10.2ifup:激活网络接口/ 343
ifup eth0
10.3ifdown:禁用网络接口/ 343
ifdown eth0
service network restart(/etc/init.d/network restart)激活整个网络,所有网卡。
10.4route:显示或管理路由表/ 344
10.5arp:管理系统的arp缓存/ 350
10.6ip:网络配置工具/ 351
10.7netstat:查看网络状态/ 358
10.8ss:查看网络状态/ 362
10.9ping:测试主机之间网络的连通性/ 363
10.10traceroute:追踪数据传输路由状况/ 366
10.11arping:发送arp请求/ 367
10.12telnet:远程登录主机/ 369
10.13nc:多功能网络工具/ 370
10.14ssh:安全地远程登录主机/ 373
10.15wget:命令行下载工具/ 376
10.16mailq:显示邮件传输队列/ 379
10.17mail:发送和接收邮件/ 381
10.18nslookup:域名查询工具/ 386
10.19dig:域名查询工具/ 389
10.20host:域名查询工具/ 393
10.21nmap:网络探测工具和安全/端口扫描器/ 394
10.22tcpdump:监听网络流量/ 398
第11章 Linux系统管理命令/ 407
11.1lsof:查看进程打开的文件/ 407
11.2uptime:显示系统的运行时间及负载/ 411
11.3free:查看系统内存信息/ 411
11.4iftop:动态显示网络接口流量信息/ 413
11.5vmstat:虚拟内存统计/ 415
11.6mpstat:CPU信息统计/ 419
11.7iostat:I/O信息统计/ 420
11.8iotop:动态显示磁盘I/O统计信息/ 423
11.9sar:收集系统信息/ 425
11.10chkconfig:管理开机服务/ 430
11.11ntsysv:管理开机服务/ 433
11.12 setup:系统管理工具/ 434
11.13ethtool:查询网卡参数/ 436
11.14mii-tool:管理网络接口的状态/ 437
11.19rpm:RPM包管理器/ 443
11.20yum:自动化RPM包管理工具/ 446
top命令
第12章 Linux系统常用内置命令/ 450
12.1Linux内置命令概述/ 450
12.2Linux内置命令简介/ 450
12.3Linux常用内置命令实例/ 452
Linux实现ARP缓存老化时间原理问题深入解析
一.问题
众所周知,ARP是一个链路层的地址解析协议,它以IP地址为键值,查询保有该IP地址主机的MAC地址。协议的详情就不详述了,你可以看RFC,也可以看教科书。这里写这么一篇文章,主要是为了做一点记录,同时也为同学们提供一点思路。具体呢,我遇到过两个问题:
1.使用keepalived进行热备份的系统需要一个虚拟的IP地址,然而该虚拟IP地址到底属于哪台机器是根据热备群的主备来决定的,因此主机器在获得该虚拟IP的时候,必须要广播一个免费的arp,起初人们认为这没有必要,理由是不这么做,热备群也工作的很好,然而事实证明,这是必须的;
2.ARP缓存表项都有一个老化时间,然而在linux系统中却没有给出具体如何来设置这个老化时间。那么到底怎么设置这个老化时间呢?
二.解答问题前的说明
ARP协议的规范只是阐述了地址解析的细节,然而并没有规定协议栈的实现如何去维护ARP缓存。ARP缓存需要有一个到期时间,这是必要的,因为ARP缓存并不维护映射的状态,也不进行认证,因此协议本身不能保证这种映射永远都是正确的,它只能保证该映射在得到arp应答之后的一定时间内是有效的。这也给了ARP欺骗以可乘之机,不过本文不讨论这种欺骗。
像Cisco或者基于VRP的华为设备都有明确的配置来配置arp缓存的到期时间,然而Linux系统中却没有这样的配置,起码可以说没有这样的直接配置。Linux用户都知道如果需要配置什么系统行为,那么使用sysctl工具配置procfs下的sys接口是一个方法,然而当我们google了好久,终于发现关于ARP的配置处在/proc/sys/net/ipv4/neigh/ethX的时候,我们最终又迷茫于该目录下的N多文件,即使去查询Linux内核的Documents也不能清晰的明了这些文件的具体含义。对于Linux这样的成熟系统,一定有办法来配置ARP缓存的到期时间,但是具体到操作上,到底怎么配置呢?这还得从Linux实现的ARP状态机说起。
如果你看过《Understading Linux Networking Internals》并且真的做到深入理解的话,那么本文讲的基本就是废话,但是很多人是没有看过那本书的,因此本文的内容还是有一定价值的。
Linux协议栈实现为ARP缓存维护了一个状态机,在理解具体的行为之前,先看一下下面的图(该图基于《Understading Linux Networking Internals》里面的图26-13修改,在第二十六章):
在上图中,我们看到只有arp缓存项的reachable状态对于外发包是可用的,对于stale状态的arp缓存项而言,它实际上是不可用的。如果此时有人要发包,那么需要进行重新解析,对于常规的理解,重新解析意味着要重新发送arp请求,然后事实上却不一定这样,因为Linux为arp增加了一个“事件点”来“不用发送arp请求”而对arp协议生成的缓存维护的优化措施,事实上,这种措施十分有效。这就是arp的“确认”机制,也就是说,如果说从一个邻居主动发来一个数据包到本机,那么就可以确认该包的“上一跳”这个邻居是有效的,然而为何只有到达本机的包才能确认“上一跳”这个邻居的有效性呢?因为Linux并不想为IP层的处理增加负担,也即不想改变IP层的原始语义。
Linux维护一个stale状态其实就是为了保留一个neighbour结构体,在其状态改变时只是个别字段得到修改或者填充。如果按照简单的实现,只保存一个reachable状态即可,其到期则删除arp缓存表项。Linux的做法只是做了很多的优化,但是如果你为这些优化而绞尽脑汁,那就悲剧了...
三.Linux如何来维护这个stale状态
在Linux实现的ARP状态机中,最复杂的就是stale状态了,在此状态中的arp缓存表项面临着生死抉择,抉择者就是本地发出的包,如果本地发出的包使用了这个stale状态的arp缓存表项,那么就将状态机推进到delay状态,如果在“垃圾收集”定时器到期后还没有人使用该邻居,那么就有可能删除这个表项了,到底删除吗?这样看看有木有其它路径使用它,关键是看路由缓存,路由缓存虽然是一个第三层的概念,然而却保留了该路由的下一条的ARP缓存表项,这个意义上,Linux的路由缓存实则一个转发表而不是一个路由表。
如果有外发包使用了这个表项,那么该表项的ARP状态机将进入delay状态,在delay状态中,只要有“本地”确认的到来(本地接收包的上一跳来自该邻居),linux还是不会发送ARP请求的,但是如果一直都没有本地确认,那么Linux就将发送真正的ARP请求了,进入probe状态。因此可以看到,从stale状态开始,所有的状态只是为一种优化措施而存在的,stale状态的ARP缓存表项就是一个缓存的缓存,如果Linux只是将过期的reachable状态的arp缓存表项删除,语义是一样的,但是实现看起来以及理解起来会简单得多!
再次强调,reachable过期进入stale状态而不是直接删除,是为了保留neighbour结构体,优化内存以及CPU利用,实际上进入stale状态的arp缓存表项时不可用的,要想使其可用,要么在delay状态定时器到期前本地给予了确认,比如tcp收到了一个包,要么delay状态到期进入probe状态后arp请求得到了回应。否则还是会被删除。
四.Linux的ARP缓存实现要点
在blog中分析源码是儿时的记忆了,现在不再浪费版面了。只要知道Linux在实现arp时维护的几个定时器的要点即可。
1.Reachable状态定时器
每当有arp回应到达或者其它能证明该ARP表项表示的邻居真的可达时,启动该定时器。到期时根据配置的时间将对应的ARP缓存表项转换到下一个状态。
2.垃圾回收定时器
定时启动该定时器,具体下一次什么到期,是根据配置的base_reachable_time来决定的,具体见下面的代码:
复制代码
代码如下:
static void neigh_periodic_timer(unsigned long arg)
{
...
if(time_after(now, tbl-last_rand+ 300* HZ)){//内核每5分钟重新进行一次配置
struct neigh_parms*p;
tbl-last_rand= now;
for(p= tbl-parms; p; p= p-next)
p-reachable_time=
neigh_rand_reach_time(p-base_reachable_time);
}
...
/* Cycle through all hash buckets every base_reachable_time/2 ticks.
* ARP entry timeouts range from 1/2 base_reachable_time to 3/2
* base_reachable_time.
*/
expire= tbl-parms.base_reachable_time 1;
expire/=(tbl-hash_mask+ 1);
if(!expire)
expire= 1;
//下次何时到期完全基于base_reachable_time);
mod_timer(tbl-gc_timer, now+ expire);
...
}
static void neigh_periodic_timer(unsigned long arg)
{
...
if(time_after(now, tbl-last_rand+ 300* HZ)){//内核每5分钟重新进行一次配置
struct neigh_parms*p;
tbl-last_rand= now;
for(p= tbl-parms; p; p= p-next)
p-reachable_time=
neigh_rand_reach_time(p-base_reachable_time);
}
...
/* Cycle through all hash buckets every base_reachable_time/2 ticks.
* ARP entry timeouts range from 1/2 base_reachable_time to 3/2
* base_reachable_time.
*/
expire= tbl-parms.base_reachable_time 1;
expire/=(tbl-hash_mask+ 1);
if(!expire)
expire= 1;
//下次何时到期完全基于base_reachable_time);
mod_timer(tbl-gc_timer, now+ expire);
...
}
一旦这个定时器到期,将执行neigh_periodic_timer回调函数,里面有以下的逻辑,也即上面的...省略的部分:
复制代码
代码如下:
if(atomic_read(n-refcnt)== 1//n-used可能会因为“本地确认”机制而向前推进
(state== NUD_FAILED||time_after(now, n-used+ n-parms-gc_staletime))){
*np= n-next;
n-dead= 1;
write_unlock(n-lock);
neigh_release(n);
continue;
}
if(atomic_read(n-refcnt)== 1//n-used可能会因为“本地确认”机制而向前推进
(state== NUD_FAILED||time_after(now, n-used+ n-parms-gc_staletime))){
*np= n-next;
n-dead= 1;
write_unlock(n-lock);
neigh_release(n);
continue;
}
如果在实验中,你的处于stale状态的表项没有被及时删除,那么试着执行一下下面的命令:
[plain] view plaincopyprint?ip route flush cache
ip route flush cache然后再看看ip neigh ls all的结果,注意,不要指望马上会被删除,因为此时垃圾回收定时器还没有到期呢...但是我敢保证,不长的时间之后,该缓存表项将被删除。
五.第一个问题的解决
在启用keepalived进行基于vrrp热备份的群组上,很多同学认为根本不需要在进入master状态时重新绑定自己的MAC地址和虚拟IP地址,然而这是根本错误的,如果说没有出现什么问题,那也是侥幸,因为各个路由器上默认配置的arp超时时间一般很短,然而我们不能依赖这种配置。请看下面的图示:
如果发生了切换,假设路由器上的arp缓存超时时间为1小时,那么在将近一小时内,单向数据将无法通信(假设群组中的主机不会发送数据通过路由器,排出“本地确认”,毕竟我不知道路由器是不是在运行Linux),路由器上的数据将持续不断的法往原来的master,然而原始的matser已经不再持有虚拟IP地址。
因此,为了使得数据行为不再依赖路由器的配置,必须在vrrp协议下切换到master时手动绑定虚拟IP地址和自己的MAC地址,在Linux上使用方便的arping则是:
[plain] view plaincopyprint?arping-i ethX-S 1.1.1.1-B-c 1
arping-i ethX-S 1.1.1.1-B-c 1这样一来,获得1.1.1.1这个IP地址的master主机将IP地址为255.255.255.255的ARP请求广播到全网,假设路由器运行Linux,则路由器接收到该ARP请求后将根据来源IP地址更新其本地的ARP缓存表项(如果有的话),然而问题是,该表项更新的结果状态却是stale,这只是ARP的规定,具体在代码中体现是这样的,在arp_process函数的最后:
复制代码
代码如下:
if(arp-ar_op!= htons(ARPOP_REPLY)|| skb-pkt_type!= PACKET_HOST)
state= NUD_STALE;
neigh_update(n, sha, state, override? NEIGH_UPDATE_F_OVERRIDE: 0);
if(arp-ar_op!= htons(ARPOP_REPLY)|| skb-pkt_type!= PACKET_HOST)
state= NUD_STALE;
neigh_update(n, sha, state, override? NEIGH_UPDATE_F_OVERRIDE: 0);
由此可见,只有实际的外发包的下一跳是1.1.1.1时,才会通过“本地确认”机制或者实际发送ARP请求的方式将对应的MAC地址映射reachable状态。
更正:在看了keepalived的源码之后,发现这个担心是多余的,毕竟keepalived已经很成熟了,不应该犯“如此低级的错误”,keepalived在某主机切换到master之后,会主动发送免费arp,在keepalived中有代码如是:
复制代码
代码如下:
vrrp_send_update(vrrp_rt* vrrp, ip_address* ipaddress, int idx)
{
char*msg;
char addr_str[41];
if(!IP_IS6(ipaddress)){
msg="gratuitous ARPs";
inet_ntop(AF_INET, ipaddress-u.sin.sin_addr, addr_str, 41);
send_gratuitous_arp(ipaddress);
} else{
msg="Unsolicited Neighbour Adverts";
inet_ntop(AF_INET6, ipaddress-u.sin6_addr, addr_str, 41);
ndisc_send_unsolicited_na(ipaddress);
}
if(0== idx debug 32){
log_message(LOG_INFO,"VRRP_Instance(%s) Sending%s on%s for%s",
vrrp-iname, msg, IF_NAME(ipaddress-ifp), addr_str);
}
}
vrrp_send_update(vrrp_rt* vrrp, ip_address* ipaddress, int idx)
{
char*msg;
char addr_str[41];
if(!IP_IS6(ipaddress)){
msg="gratuitous ARPs";
inet_ntop(AF_INET, ipaddress-u.sin.sin_addr, addr_str, 41);
send_gratuitous_arp(ipaddress);
} else{
msg="Unsolicited Neighbour Adverts";
inet_ntop(AF_INET6, ipaddress-u.sin6_addr, addr_str, 41);
ndisc_send_unsolicited_na(ipaddress);
}
if(0== idx debug 32){
log_message(LOG_INFO,"VRRP_Instance(%s) Sending%s on%s for%s",
vrrp-iname, msg, IF_NAME(ipaddress-ifp), addr_str);
}
}
六.第二个问题的解决
扯了这么多,在Linux上到底怎么设置ARP缓存的老化时间呢?
我们看到/proc/sys/net/ipv4/neigh/ethX目录下面有多个文件,到底哪个是ARP缓存的老化时间呢?实际上,直接点说,就是base_reachable_time这个文件。其它的都只是优化行为的措施。比如gc_stale_time这个文件记录的是“ARP缓存表项的缓存”的存活时间,该时间只是一个缓存的缓存的存活时间,在该时间内,如果需要用到该邻居,那么直接使用表项记录的数据作为ARP请求的内容即可,或者得到“本地确认”后直接将其置为reachable状态,而不用再通过路由查找,ARP查找,ARP邻居创建,ARP邻居解析这种慢速的方式。
默认情况下,reachable状态的超时时间是30秒,超过30秒,ARP缓存表项将改为stale状态,此时,你可以认为该表项已经老化到期了,只是Linux的实现中并没有将其删除罢了,再过了gc_stale_time时间,表项才被删除。在ARP缓存表项成为非reachable之后,垃圾回收器负责执行“再过了gc_stale_time时间,表项才被删除”这件事,这个定时器的下次到期时间是根据base_reachable_time计算出来的,具体就是在neigh_periodic_timer中:
复制代码
代码如下:
if(time_after(now, tbl-last_rand+ 300* HZ)){
struct neigh_parms*p;
tbl-last_rand= now;
for(p= tbl-parms; p; p= p-next)
//随计化很重要,防止“共振行为”引发的ARP解析风暴
p-reachable_time=neigh_rand_reach_time(p-base_reachable_time);
}
...
expire= tbl-parms.base_reachable_time 1;
expire/=(tbl-hash_mask+ 1);
if(!expire)
expire= 1;
mod_timer(tbl-gc_timer, now+ expire);
if(time_after(now, tbl-last_rand+ 300* HZ)){
struct neigh_parms*p;
tbl-last_rand= now;
for(p= tbl-parms; p; p= p-next)
//随计化很重要,防止“共振行为”引发的ARP解析风暴
p-reachable_time=neigh_rand_reach_time(p-base_reachable_time);
}
...
expire= tbl-parms.base_reachable_time 1;
expire/=(tbl-hash_mask+ 1);
if(!expire)
expire= 1;
mod_timer(tbl-gc_timer, now+ expire);
可见一斑啊!适当地,我们可以通过看代码注释来理解这一点,好心人都会写上注释的。为了实验的条理清晰,我们设计以下两个场景:
1.使用iptables禁止一切本地接收,从而屏蔽arp本地确认,使用sysctl将base_reachable_time设置为5秒,将gc_stale_time为5秒。
2.关闭iptables的禁止策略,使用TCP下载外部网络一个超大文件或者进行持续短连接,使用sysctl将base_reachable_time设置为5秒,将gc_stale_time为5秒。
在两个场景下都使用ping命令来ping本地局域网的默认网关,然后迅速Ctrl-C掉这个ping,用ip neigh show all可以看到默认网关的arp表项,然而在场景1下,大约5秒之内,arp表项将变为stale之后不再改变,再ping的话,表项先变为delay再变为probe,然后为reachable,5秒之内再次成为stale,而在场景2下,arp表项持续为reachable以及dealy,这说明了Linux中的ARP状态机。那么为何场景1中,当表项成为stale之后很久都不会被删除呢?其实这是因为还有路由缓存项在使用它,此时你删除路由缓存之后,arp表项很快被删除。
七.总结
1.在Linux上如果你想设置你的ARP缓存老化时间,那么执行sysctl-w net.ipv4.neigh.ethX=Y即可,如果设置别的,只是影响了性能,在Linux中,ARP缓存老化以其变为stale状态为准,而不是以其表项被删除为准,stale状态只是对缓存又进行了缓存;
2.永远记住,在将一个IP地址更换到另一台本网段设备时,尽可能快地广播免费ARP,在Linux上可以使用arping来玩小技巧。
详解Linux系统中ping和arping命令的用法
ping
ping程序使用 ICMP协议的强制回显请求数据报以使主机或网关发送一份 ICMP的回显应答。回显请求数据报( pings)含有一个 IP及 ICMP的报头,后跟一个``时间值关键字然后是一段任意长度的填充字节用于把保持分组长度为16的整数倍。以下是程序的选项:
ping [-LRUbdfnqrvR ] [-c count ] [-i wait ] [-l preload ] [-p pattern ] [-s packetsize ]
参数
-c
count在发送(和接收)了正好数量为 count的回显应答分组后停止操作。在发送了 count个分组后没有收到任何分组的特别情况是发送导致了终止(选程主机或网关不可达)。
-d
在所用的套接字上使用SO_DEBUG选项。
-f
以高速方式来作ping。以分组返回的速度来输出其它分组或每秒输出百次。当收到每个回显应答并打印一个退格符时,对每个回显请求都打印一个句点``.。这可以快速显示出丢弃了多少个分组,只有超级用户可以用这个选项。这(操作)对网络要求非常苛刻,应该慎重使用。
-i
wait在发送每个分组时等待 wait个秒数。缺省值为每个分组等待一秒。此选项与-f选项不能同时使用。
-l
preload如果指定 preload,那么 ping程序在开始正常运行模式前尽可能快地发送分组。同样只有超级用户可以用这个选项。
-n
只以数字形式输出信息。这样就不尝试去查找主机名了。
-p
pattern可以指定最多16个填充字节用于保持分组长度为16的整数倍。在网络上诊断与数据相关问题时此选项很有用。例如``-p ff将使发出的分组都用全1填充数据区。
-q
静态输出。在程序启动和结束时只显示摘要行。
-R
记录路由。在回显请求分组中包含记录路由选项并在相应的分组返回时显示路由缓冲区。注意IP首部的容量只能存放9条这样的路由。很多主机忽略或禁用此选项。
-r
在所连接的网络上旁路正常的选路表,直接向主机发送分组。如果主机未处于直接相连的网络上,那么返回一个错误。此选项可用来通过无路由接口对一台主机进行检测(例如当接口已被routed程序丢弃后)。
-s
packetsize指定要发送数据的字节量。缺省值为 56,这正好在添加了 8字节的 ICMP首部后组装成 64字节的 ICMP数据报。
-v
详细模式输出。打印接收到的回显应答以外的ICMP分组。
-w
waitsecs在 waitsecs秒后停止 ping程序的执行。当试图检测不可达主机时此选项很有用。
当用ping来隔离故障时,应首先在本地主机上运行,以检查本地网络接口有效运行。然后,应该进一步检查主机和网关。计算出往返时间和分组丢失率。如果收到重复的分组,虽然这些分组的往返时间要用于计算往返时间的最小/平均/最大值,但是它们不应该算在刚才计算的丢失的分组中。当指定数量的分组已经发送(和接收)时或如果程序被SIGINT信号终止,会显示一份简短的摘要。
如果ping程序根本没有收到任何返回分组,那它将以返回码1退出。出错时返回 2。否则返回0。这些值可能用于查看主机存在与否。
此程序专用于网络测试,度量和管理。因为它会使用网络的流量,在正常操作或自动的脚本中使用它并不明智。
例1
例a,ping一下baidu
复制代码
代码如下:
[root@localhost~]# ping baidu.com
PING baidu.com(123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144: icmp_seq=1 ttl=54 time=3.51 ms
64 bytes from 123.125.114.144: icmp_seq=2 ttl=54 time=6.03 ms
--- baidu.com ping statistics---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev= 3.515/4.775/6.036/1.262 ms
例b,指定次数和时间,间隔ping baidu
复制代码
代码如下:
[root@localhost~]# ping-c 5-i 0.5 baidu.com
PING baidu.com(123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144: icmp_seq=1 ttl=54 time=2.92 ms
64 bytes from 123.125.114.144: icmp_seq=2 ttl=54 time=2.97 ms
64 bytes from 123.125.114.144: icmp_seq=3 ttl=54 time=2.99 ms
64 bytes from 123.125.114.144: icmp_seq=4 ttl=54 time=6.98 ms
64 bytes from 123.125.114.144: icmp_seq=5 ttl=54 time=3.14 ms
--- baidu.com ping statistics---
5 packets transmitted, 5 received, 0% packet loss, time 2011ms
rtt min/avg/max/mdev= 2.925/3.806/6.985/1.591 ms
例2
例:-i指定发送数据包时间间隔,-c指定一共发送多少个数据包,-I指定源地址,-q指定直接显示程序的启动和最后结果
复制代码
代码如下:
# ping-i 0.2-c 30-I 192.168.10.208 180.149.132.47-q
PING 180.149.132.47(180.149.132.47) from 192.168.10.208: 56(84) bytes of data.
--- 180.149.132.47 ping statistics---
30 packets transmitted, 30 received, 0% packet loss, time 5858ms
rtt min/avg/max/mdev= 29.525/29.857/33.755/0.765 ms
arping
arping命令:在指定网卡上发送ARP请求指定地址,源地址-s参数指定,可用来直接 ping MAC地址,以及找出那些 ip地址被哪些电脑所使用了
-A ARP回复模式,更新邻居
-b保持广播
-D复制地址检测模式
-f得到第一个回复就退出
-q不显示警告信息
-U主动的ARP模式,更新邻居
-c数据包的数目发送的数据包的数目
-w超时时间设置超时时间
-I网卡使用指定的以太网设备,默认情况下使用eth0
-s指定源IP地址
-h显示帮助信息
-V显示版本信息
例:
例a,指定IP发送ARP请求
复制代码
代码如下:
[root@Blackghost~] arping 192.168.1.11
ARPING 192.168.1.11 from 192.168.1.6 eth0
Unicast reply from 192.168.1.11 [08:00:27:7e:b8:08] 2.780ms
Unicast reply from 192.168.1.11 [08:00:27:7e:b8:08] 2.187m
例b,向指定主机发送ARP请求,当收到第一个包自动退出
复制代码
代码如下:
[root@Blackghost~] arping-f 192.168.1.11
Unicast reply from 192.168.1.11 [08:00:27:7e:b8:08] 3.080ms
Sent 1 probes(1 broadcast(s))
Received 1 response(s)
例c,指定发送次数
复制代码
代码如下:
[root@Blackghost~] arping-c 4 192.168.1.11
Unicast reply from 192.168.1.11 [08:00:27:7e:b8:08] 3.080ms
Unicast reply from 192.168.1.11 [08:00:27:7e:b8:08] 2.670ms
Unicast reply from 192.168.1.11 [08:00:27:7e:b8:08] 1.850ms
Unicast reply from 192.168.1.11 [08:00:27:7e:b8:08] 4.120ms
Sent 4 probes(4 broadcast(s))
Received 4 response(s)