我想问一下 dhcrelay 的运行机制。我们可以用两个命令运行 dhcrelay,这样它就会作为两个进程运行
dhcrelay -i eth3 172.16.17.3
dhcrelay -i eth1 172.16.17.5
#ps ax | grep dhcre
26464 ? Ss 0:00 /usr/sbin/dhcrelay -i eth3 172.16.17.3
26465 ? Ss 0:00 /usr/sbin/dhcrelay -i eth1 172.16.17.5
或者使用一个命令,换句话说,单个进程
dhcrelay -i eth3 -i eth1 172.16.17.3 172.16.17.5
#ps ax | grep dhcre
28127 ? Ss 0:00 /usr/sbin/dhcrelay -i eth1 -i eth3 172.16.17.3 172.16.17.5
我想知道除了进程数量之外,这两种方式是否存在任何技术差异?
答案1
在查看源代码,有几件事情引人注目,似乎会受到运行单个命令与运行多个命令的影响。
首先是这个评论dispatch.c
:
/*
* Wait for packets to come in using poll(). When a packet comes in,
* call receive_packet to receive the packet and possibly strip hardware
* addressing information from it, and then call through the
* bootp_packet_handler hook to try to do something with it.
*/
似乎dhcrelay.c
利用了轮询架构。此方法在轮询其中一个接口时使用超时(基于时间)(例如:-i eth0或者-i eth1)。
这似乎表明,在轮询一个接口时,另一个接口可能会被阻塞。
另一个代码片段,这次在dispatch()
函数内,它轮询指定的接口之一:
/* Wait for a packet or a timeout... XXX */
count = poll(fds, nfds, to_msec);
上面的轮询函数超时或接收到数据包后,dhcrelay
将转到“下一个”接口:
/* Get the current time... */
time(&cur_time);
i = 0;
for (l = protocols; l; l = l->next) {
struct interface_info *ip = l->local;
if ((fds[i].revents & (POLLIN | POLLHUP))) {
fds[i].revents = 0;
if (ip && (l->handler != got_one ||
!ip->dead))
(*(l->handler))(l);
if (interfaces_invalidated)
break;
}
i++;
}
interfaces_invalidated = 0;
} while (1);
请注意,整个dispatch
包含一个while(1)
循环。
那么,这意味着什么?
我想说的是,如果你有一个流量很大的网络,有很多主机,而且你的 DHCP 租约相对较短,那么你可能想要考虑运行 2 个 dchrelay 实例。
但是,如果您的网络相对较小,并且 DHCP 租约超时相对较长,那么运行单个实例就应该没问题。
其他需要考虑的事项
- 运行 2 个实例允许您为每个实例维护单独的日志文件。
- 运行 2 个实例允许重新启动一个中继器而不影响另一个中继器。