子网情况下的广播 1. 介绍 在高速局域网中使用广播是一种通常的作法。因为IP中未指出广播的通用标准,因此协议实现者也就无法使用它了。这里我们考虑的是不可靠的,非串行的,包可重复的广播。我们假设数据链路层支持有效的广播,通常的网络如以太网,令牌网都支持广播。我们不能假设广播传输是可靠的,因为这样做代价太大,但我们假定主机发出的广播大部分还是能够到达目的地的。因为广播会对网络造成过大的负担,因此不能无限制地使用。 2. 为何采用广播 广播在主机不知道消息发送者的位置时是有用的,广播在主机需要为许多机器提供数据时也有作用。主机需要的信息可能在它的邻居中,它可以一一询问而得知,而把这些主机的地址固定存储是不合适的,因为主机的邻居可能会变化,这对管理是一个学生的负担。而对所有邻居的地址进行一一询问简直不可能,因为需要询问的主机的数目会太多。使用广播就不会出现这种问题。在主机需要邻居的信息时广播有用,当主机有信息需要向邻居传送时广播也很有用,例如网关就可以通过广播告知邻近的网关它的存在。我们会认为组播可能会代替广播,但是广播在硬件一层(或低层是进行的),而上层软件将不必要的信息过滤掉达到的效果就是组播。 3. 广播级别 有下面几种IP广播:
因为安全和效率的考虑,网关可以不转发广播,在自治系统中最好不要转发广播。 4. 广播方法 主机的IP接收层必须能够支持广播。有了广播机制,主机必须能够对接收到的数据报中的目的地址进行比较,看和自己的IP地址是不是一样,而且还必须能够知道这个地址是不是个广播地址,如果是也要接收。因为在数据链路层已经解决了广播问题,所以IP层主机如果需要广播只要发出带有广播地址的包就行了。网关上的算法要复杂一些。
但是在有子网的网络内进行广播可能比较麻烦。即使如此,也有相应的算法解决这个问题,而且不怎么费事。一个好的广播方法要达到下面几个条件:
对于算法来说,RPF(Reverse Path Forwarding)比较合适。RPF在代价和可靠性上是中等的,易于实现,而且不需要,对网关修改也比较少。 5. 网关与广播 5.1. 本地广播 在网关接收到本地广播时,它需要做一些工作,虽然简单,可如果处理不好会造成无限循环。正确处理有赖于下面几项:子网,目标网络,网关地址。
5.2. 多子网广播 如果网关接收到需要所有子网都接收到的广播,它必须使用RPF。RPF也不复杂,具体情况如下:当且仅当数据报接收到的连接是网关到数据报源的最佳路由时,网关在所有连接上转发数据报的复本;否则抛弃数据报。RPF还有优化算法,这里就不讨论了。 5.3. Pseudo-Algol路由算法 这个算法应该在网关上实现,它的具体算法如下所示:(下表中表示的是一些定义)
BEGIN
IF Destination.ipnet IN AllLinks THEN
BEGIN
IF IsSubnetted(Destination.ipnet) THEN
BEGIN
IF Destination.subnet = BroadcastSubnet THEN
BEGIN /* 使用RFP方法 */
IF IncomingLink = RouteLink(Source) THEN
BEGIN IF Destination.host = BroadcastHost THEN
OutgoingLinkSet <- AllLinks -
IncomingLink;
OutgoingHost <- BroadcastHost;
Examine packet for possible internal use;
END
ELSE /* 从其它网关接收到相同复本,抛弃 */
Discard;
END
ELSE
IF Destination.subnet = IncomingLink.subnet THEN
BEGIN /* 转发会引起回路 */
IF Destination.host = BroadcastHost THEN
Examine packet for possible internal use;
Discard;
END
ELSE BEGIN /* 转发到子网 */
OutgoingLinkSet <- RouteLink(Destination);
OutgoingHost <- RouteHost(Destination);
END
END
ELSE BEGIN /* 发送到本地子网 */
IF Destination.ipnet = IncomingLink.ipnet THEN
BEGIN /* 转发会引起回路 */
IF Destination.host = BroadcastHost THEN
Examine packet for possible internal use;
Discard;
END
ELSE BEGIN /* 可能是一个广播 */
OutgoingLinkSet <- RouteLink(Destination);
OutgoingHost <- RouteHost(Destination);
END
END
END
ELSE BEGIN /* 转发到本地非IP网络 */
OutgoingLinkSet <- RouteLink(Destination);
OutgoingHost <- RouteHost(Destination);
END
OutgoingHardwareHost <- ResolveAddress(OutgoingHost);
END
6. IP广播地址规范 如果不同的IP实现能够兼容,必须有规则可以区别所有主机和所有子网。因为本地网络层可以映射IP地址到数据链路层地址,选择IP广播主机号则是比较直接的。简单起见,可以把一个别的机器不用的地址用于广播主机号。全1地址可以。全部子网号也是全1的,因为主机在发送广播到远程网络时并不关心那个网络分不分子网。而255.255.255.255表示本地硬件地址广播,不能进行转发。因此,一台在网络号为36的网络上的主机可以
一个好的应用程序应该首先向第一个地址进行广播,如果没有回应,再向第二个地址进行广播。全1地址指广播,那么全0地址指本地,如36.0.0.0指网络36,而36.255.255.255指网络36上的所有主机。 |