从ip_finish_output2到dev_queue_xmit路径:
http://www.bluestep.cc/linux%e5%91%bd%e4%bb%a4arping-%e7%bd%91%e7%bb%9c%e7%ae%a1%e7%90%86-%e9%80%9a%e8%bf%87%e5%8f%91%e9%80%81arp%e5%8d%8f%e8%ae%ae%e6%8a%a5%e6%96%87%e6%b5%8b%e8%af%95%e7%bd%91%e7%bb%9c/
arp协议:
(1).硬件类型:
硬件地址类型,该字段值一般为ARPHRD_ETHER,表示以太网。
(2).协议类型:
表示三层地址使用的协议,该字段值一般为ETH_P_IP,表示IP协议
(3)硬件地址长度,以太网MAC地址就是6;
(4)协议地址长度,IP地址就是4;
(5) *** 作码
常见的有四种,arp请求,arp相应,rarp请求,rarp相应。
(6)发送方硬件地址与IP地址,(7)目标硬件地址与目标IP地址。
arp头数据结构:
arp模块的初始化函数为arp_init(),这个函数在ipv4协议栈的初始化函数inet_init()中被调用。
1.初始化arp表arp_tbl
2.注册arp协议类型;
3.建立arp相关proc文件,/proc/net/arp;
4.注册通知事件
一个neigh_table对应一种邻居协议,IPv4就是arp协议。用来存储于邻居协议相关的参数、功能函数、邻居项散列表等。
一个neighbour对应一个邻居项,就是一个arp条目
邻居项函数指针表,实现三层和二层的dev_queue_xmit()之间的跳转。
用来存储统计信息,一个结构实例对应一个网络设备上的一种邻居协议。
注册arp报文类型 :dev_add_pack(&arp_packet_type)
就是把arp_packet_type添加到ptype_base哈希表中。
注册新通知事件的时候,在已经注册和UP的设备上,会调用一次这个通知事件。
设备事件类型:
创建一个邻居项,并将其添加到散列表上,返回指向该邻居项的指针。
tbl:待创建的邻居项所属的邻居表,即arp_tbl;
pkey:三层协议地址(IP地址)
dev:输出设备
want_ref:??
创建邻居项
1.设置邻居项的类型
2.设置邻居项的ops指针
3.设置邻居项的output函数指针
调用dst_link_failure()函数向三层报告错误,当邻居项缓存中还有未发送的报文,而该邻居却无法访问时被调用。不懂。
用来发送arp请求,在邻居项状态定时器处理函数中被调用。
neigh:arp请求的目的邻居项
skb:缓存在该邻居项中的待发送报文,用来获取该skb的源ip地址。
将得到的硬件源、目的地址,IP源、目的地址等作为参数,调用arp_send()函数创建一个arp报文并将其输出。
创建及发送arp报文
创建arp报文,填充字段。
发送arp报文
用来从二层接收并处理一个arp报文。这个函数中就是做了一些参数检查,然后调用arp_process()函数。
neigh_event_ns
neigh_update
这个函数的作用就是更新邻居项硬件地址和状态。分支比较多。
neigh_update_notify
代理arp(proxy arp),通常像路由器这样的设备才使用,用来代替处于另一个网段的主机回答本网段主机的arp请求。
感觉代码ARP好像没啥用呀。
网络主机发包的一般过程:
1.当目的IP和自己在同一网段时,直接arp请求该目的IP的MAC。
2.当目的IP和自己不再同一网段时,arp请求默认网关的MAC。
https://www.cnblogs.com/taitai139/p/12336554.html
https://www.cnblogs.com/Widesky/p/10489514.html
当主机没有默认网关的时候,arp请求别的网段的报文,到达路由器后,本来路由器是要隔离广播的,把这个arp请求报文给丢弃,这样就没法通信了。当路由器开启arp proxy后,路由器发现请求的目的IP在其他网段,就自己给主机回复一个arp响应报文,这样源主机就把路由器的MAC当成目的IP主机对应的MAC,可以通信了。这样可能会造成主机arp表中,多个IP地址都对应于路由器的同一个MAC地址。
可以使用arping命令发送指定IP的arp请求报文。
写完了发现这个老妹写的arp代理文章蛮好的,不过她好像是转载的。
Liunx添加ARP表方式如下:[功能]管理系统的arp缓存。 [描述]用来管理系统的arp缓存,常用的命令包括:arp: 显示所有的表项。arp -d address: 删除一个arp表项。arp -s address hw_addr: 设置一个arp表项。 常用参数:-a 使用bsd形式输出。(没有固定的列)-n 使用数字形式显示ip地址,而不是默认的主机名形式。-D 不是指定硬件地址而是指定一个网络接口的名称,表项将使用相应接口的MAC地址。一般用来设置ARP代理。-H type, --hw-type type: 指定检查特定类型的表项,默认type为ether,还有其他类型。-i If, --device If: 指定设置哪个网络接口上面的arp表项。-f filename: 作用同'-s',不过它通过文件来指定IP地址和MAC地址的绑定。文件中每行分别是主机和MAC,中间以空格分割。如果没有指定文件名称,则使用/etc/ethers文件。 以下例子中,用主机名称的地方也可以用点分10进制的ip地址来表示。另外输出结果中用"C"表示ARP缓存内容,"M"表示永久性表项,"P"表示公共的表项。[举例]*查看arp表:#arpAddress HWtype HWaddress FlagsMaskIfacehostname1ether 44:37:e6:97:92:16 C eth0hostname2ether 00:0f:fe:43:28:c5 C eth0hostname3ether 00:1d:92:e3:d5:ee C eth0hostname4ether 00:1d:0f:11:f2:a5 C eth0这里,Flags中的"C"代表此表项目是高速缓存中的内容,高速缓存中的内容过一段时间(一般20分钟)会清空,而"M"则表示静态表项,静态表项的内容不会过一段时间被清空。 *查看arp表,并且用ip显示而不是主机名称:# arp -nAddress HWtype HWaddress FlagsMaskIface10.1.10.254 ether 00:1d:92:e3:d5:ee C eth010.1.10.253 ether 44:37:e6:9b:2c:53 C eth010.1.10.178 ether 00:1b:78:83:d9:85 C eth010.1.10.119 ether 00:1d:0f:11:f2:a5 C eth0这里,对于上面的条目,假设当我们"ping 10.1.10.1"通过之后,arp中会多一条"10.1.10.1"相关的信息。 *查看arp表,显示主机名称和ip:#arp -ans.amazon.esdl.others.com (10.1.10.254) at00:1d:92:e3:d5:ee [ether] on eth0server.amazon.eadl.others.com (10.1.10.253) at44:37:e6:9b:2c:53 [ether] on eth0D2-baijh.amazon.esdl.others.com (10.1.10.178) at00:1b:78:83:d9:85 [ether] on eth0aplab.local (10.1.10.119) at 00:1d:0f:11:f2:a5[ether] on eth0 *添加一对IP和MAC地址的绑定:# arp -s 10.1.1.1 00:11:22:33:44:55:66这里,如果网络无法达到,那么会报告错误,具体如下:root@quietheart:/home/lv-k# arp -s 10.1.1.100:11:22:33:44:55:66SIOCSARP: Network is unreachableroot@quietheart:/home/lv-k# arp -nAddress HWtype HWaddress FlagsMaskIface10.1.10.254 ether 00:1d:92:e3:d5:ee C eth010.1.10.253 ether 44:37:e6:9b:2c:53 C eth010.1.10.178 ether 00:1b:78:83:d9:85 C eth010.1.10.119 ether 00:1d:0f:11:f2:a5 C eth0实际上,如果"arp -s"设置成功之后,会增加一个Flags为"CM"的表项,有些系统静态条目不会因为ARP响应而更新,而高速缓存中的条目会因此而更新。如果想要手工设置没有"M",那么用"temp"选项,例如:"arp -s IP MAC temp"类似的命令,实践发现,如果已经设置过IP了,那么再设置也不会改变其Flags。 *删除一个arp表项:# arp -d 10.1.10.118这里,删除之后只是硬件地址没有了,如下:root@quietheart:~# arp -nAddress HWtype HWaddress FlagsMaskIface10.1.10.118 ether 00:25:9c:c2:79:90 CMeth010.1.10.254 ether 00:1d:92:e3:d5:ee C eth0root@quietheart:~# arp -d 10.1.10.118root@quietheart:~# arp -nAddress HWtype HWaddress FlagsMaskIface10.1.10.118 (incomplete) eth010.1.10.254 ether 00:1d:92:e3:d5:ee C*删除eth0上面的一个arp表项:# arp -i eth0 -d 10.1.10.118 [其它]*指定回复的MAC地址:#/usr/sbin/arp -i eth0 -Ds 10.0.0.2 eth1 pub当eth0收到IP地址为10.0.0.2的请求时,将会用eth1的MAC地址回答。例如,双网卡机器运行这条命令:/usr/sbin/arp -i eth0 -Ds 10.0.0.2 eth1 pub会多一项:10.0.0.2 * MPeth0呵呵,HUB很便宜,这种方法也最简单直接,然而,HUB是共享式是的设备,整个HUB的电脑都处于同一个冲突域,会产生冲突,通信效率不高。而且所有电脑会共享带宽。不仅如此,广播风暴也十分严重。唉,缺点多多啊!2、利用XP的桥接功能XP机器是要安装双网卡的,XP比2K多了一个桥接功能,这个功能真的是十分好。XP的机器可以把另外一台电脑桥接到网络中,就像另外一台电脑直接插在交换机的物理端口一样,我们可以像使用普通机器一样方便,不需要作任何设置,只需要在XP机器上点一下鼠标即可。3、利用2K Server 的路由和远程访问功能2K Server 机器是要安装双网卡的,这个就是开启2K Server的路由功能,让2K Server 机器为新加入的机器做路由转发,这个是需要做一下简单的设置的。4、利用LINUX的ARP代理功能(1)Linux机器是要安装双网卡的,当物理网络的机器需要找寻这台新加入的机器时,接入物理网络的那个网卡替我们响应网络请求,这个过程就叫做ARP代理,然后它会把ARP查询通过另一个网卡(即和新加入的机器连接的内网)转发到这个内网。(2)当新加入的机器向物理网络进行ARP查询时,LINUX机器只需要做一下普通的路由转发即可。这两个过程中,LINUX机器起着ARP代理和路由转发的作用。这个方法是有点复杂的。注意:1、第二、三、四种方法都需要有一台机器开着做桥梁才行;2、第二、三、四种方法都需要额外添加一块网卡。总结:1、以上四种方法是解决交换机端口不足的有效方法,能使新机器加入物理网络。3、以上的方法是接入网络的,并不是共享上网的方法,请不要弄混了。当然,如果你的网络不需要认证,接入了网络你当然就可以上网了!!欢迎分享,转载请注明来源:内存溢出
评论列表(0条)