总长度(即一arp包的长度)是否合格,在我的ARP头文件解释中有说明ARP包的长度及结构*/
+ 2 * ar->;ar_pln) {
log(LOG_ERR, "arp: runt packet\n");
m_freem(m);/*释放掉该mbuf链*/
continue;/*既然这个mbuf链是无意义的,那么进行下一个while*/
}
switch (ntohs(ar->;ar_pro)) {
#ifdef INET
case ETHERTYPE_IP:/*我们知道的ARP解释就目前只有对IP的*/
in_arpinput(m);/*调用分析函数,在下面*/
continue;
#endif
}
m_freem(m);/*对ar->;ar_pro中的协议不认识,释放掉该mbuf链*/
}
}
#ifdef INET
/* ARP的算法规则遵循RFC 826
* 下面我简单的说一下RFC 826,非关键的东西我就跳过去了.
* 该协议原现是为DEC/Intel/Xerox的10M以太网设计的.
* 下面是他的包格式:
Ethernet 传输层,即以太网头部 :(注意:是按顺序的)
48.bit: 目的方的以太网地址
48.bit: 发送方的以太网地址
16.bit: 协议类型 = ether_type$ADDRESS_RESOLUTION(原来有上面说的三种(ISO协议),后来加了这一种)
Ethernet ARP数据包内的数据:
16.bit: 硬件地址空间(这是RFC说的,其实应该是硬件类型) (如, 以太网,无线网络等)
16.bit: 协议类型.对以太网来说就是ETHERTYPE_IP
8.bit: 硬件地址长度(字节),在我们以太网中是6
8.bit: 协议地址长度(字节),在我们以太网中是4
16.bit: 操作代码 (1是请求 | 2是应答)
n bytes: 该包发送方硬件地址(n是长度,看上面)
m bytes: 该包发送方的协议地址(m是长度,看上面,下面的m,n也一样),其实就是IP地址
n bytes: 这个包目的方的硬件地址(应该是不知道的),一般是在发送的时候肯定不知道,所
以为空,但也有免费ARP,就是把自己的地址填充,下面的IP也填充自己的,看有没有
起他的机器回应这IP的,如果有,就是有冲突了,大家上WINDOWS时,IP没配好,网络上
已经有这台IP机器时, 发送该包,哪个已经有该IP的机器就会回应一ARP,我们的接
收程序接收到了以后,就会发出"您的IP地址出现冲突,请询问网络管理员"(我也不
记得了,大概是这样说的).
m bytes: 目的方的协议地址.即目的方的IP地址
其他的都是讲一些原理,我就不多说了,我们看程序的时候全会讲到.
*/
static int log_arp_wrong_iface = 1;/*这是控制在桥模式时,不该接收这ARP的网卡却收到了时,会
判断该变量为真的话,就在控制台输出一出错信息*/
SYSCTL_INT(_net_link_ether_inet, OID_AUTO, log_arp_wrong_iface, CTLFLAG_RW,
&log_arp_wrong_iface, 0,
"log arp packets arriving on the wrong interface");/*该sysctl继承了net.link.ether.inet叶节点
用来控制上面那个变量,方法如下:
sysctl net.link.ether.inet.log_arp_wrong_iface=0 就会不输出出错信息*/
/*ARP包接收后处理*/
static void
in_arpinput(m)
struct mbuf *m;
{
register struct ether_arp *ea;/*arp包的数据结构,在程序中我列出了他的结构*/
register struct arpcom *ac = (struct arpcom *)m->;m_pkthdr.rcvif;/*rcvif成员表示该mbuf是从那块网卡接收的*/
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 及其 漏洞 分析 详解 协议 地址 解析 ARP IP if ea- 路由 |
注册
个人空间
