[ih] Internet History - broadcast addresses
John Gilmore
gnu at toad.com
Sun Mar 31 02:53:24 PDT 2019
Karl Auerbach <karl at cavebear.com> wrote:
> Wasn't there also some disagreement over whether the IPv4 broadcast
> address was 0.0.0.0 (BSD) or 255.255.255.255 (everybody else)?
Well, no; it was worse than that! IP is still limping with the scars of
that mess.
4.2BSD defaulted to using the all-zeros node address of EACH SUBNET to
being the broadcast address. The IP RFCs (later) ultimately decided to
use the all-ones node address of EACH SUBNET. (In both cases, read
"network" for subnet, since subnetting hadn't been invented yet.)
You can see this in the first "standard" RFC for IP over Ethernet, RFC
894 by Charles Hornig of Symbolics:
https://www.rfc-editor.org/rfc/rfc894.txt
The broadcast Internet address (the address on that network with a
host part of all binary ones) should be mapped to the broadcast
Ethernet address (of all binary ones, FF-FF-FF-FF-FF-FF hex).
...
Unix 4.2bsd
also uses a non-standard Internet broadcast address with a host part
of all zeroes, this may also be changed in the future.)
I dug around in the great old tcp-ip mailing list's archives, and found
a few messages about this:
http://securitydigest.org/tcp-ip/archive/1984/05
Date: Mon, 7 May 84 10:35 EDT
From: Charles Hornig <Hornig%SCRC-STONY-BROOK at SCRC-RIVERSIDE.ARPA>
...
[RFC894]
Broadcast Address
The broadcast Internet address (the address on that network with a
host part of all binary ones) should be mapped to the broadcast
Ethernet address (of all binary ones, FF-FF-FF-FF-FF-FF hex).
This is the first I've heard of this! What's wrong with the 4.2
convention? [I've always made the (mostly correct) assumption
that \no host on a network would be assigned address zero/. This
has the useful property that no additional context is necessary
to differentiate a "network address" from "a particular host" on
that network. It's not hard to intuit that (for a broadcast
network) sending \to the network/ is meaningful.] There's also a
practical justification--it's easier to check for a zero address
than all ones (which is different for Class A, B, C networks).
Sure you don't want to reconsider?
I [Charles] picked all ones because that was the way other documents
referred to it (I think IEN 212 is the right place). I also think
that all ones is better than all zeroes. The zero value is likely to
appear as a network name and reusing it as a broadcast address might
lead to confusion between these ideas.
IEN 212 did indeed recommend reserving all-ones for broadcast, probably
as a mirror of the Ethernet FF:FF:FF:FF:FF:FF broadcast address:
https://www.rfc-editor.org/ien/ien212.txt
We propose to define the IP broadcast address to be the IP address in
each class with all its local host part bits on. (E.G., A.255.255.255
for class A, A.B.255.255 for class B, and A.B.C.255 for class C.) In
each case, the address would map to the local network broadcast
address if broadcast addressing was supported. On messages coming
from other networks, the mapping would be done in the gateway. If a
network did not support broadcast addressing, an ICMP destination
unreachable message would be returned.
But that IEN foolishly claimed that:
The only "cost" of this mechanism is that it reserves one IP address
from each class.
There were only three classes (A, B, and C), so it claimed to only
reserve 3 addresses. But actually, it reserved one IP address from each
NETWORK NUMBER, of which there were tens of thousands. And worse, it
reserved those IP addresses even in networks that do not use a LAN and
do not support broadcast addresses (by claiming that "Destination
Unreachable" would be the result of attempted communication).
Here is an excerpt from a 1986 discussion from TCP-IP that talks about
how to binary-patch subnets into your Suns that use 4.2BSD networking
stacks so they won't make broadcast storms based on different subnet
broadcast addresses:
http://securitydigest.org/tcp-ip/archive/1986/08
Date: Mon, 11-Aug-86 09:08:38 EDT
From: HEDRICK at RED.RUTGERS.EDU (Charles Hedrick)
To: mod.protocols.tcp-ip
Subject: subnetting on Suns
...
You need to decide what you want your broadcast address to be. 4.2 and
the Sun kernel use the convention that the broadcast address uses a host
number of 0. The newest convention, implemented in 4.3, uses a host
number of -1, i.e. 255. The standards were only changed recently, so
must vendors have not caught up. Consider our network, which is a class
B network, 128.6. On subnet 4, there are the following possible
broadcast addresses:
128.6.0.0 - used by 4.2
128.6.4.0 - used by 4.2 if you install subnets
128.6.255.255 - used by 4.3, I think
128.6.4.255 - used by 4.3 with subnets turned on, I think
255.255.255.255 - not used by any, but recognized by Sun and 4.3
When you enable subnets, the subnet number becomes in effect part
of your network number. Thus the network number is 128.6.x, not
just 128.6. So the broadcast address ends up having the subnet
number as part of it.
Now, the problem is that the Suns are set up such that every machine
on the network, including non-Suns, must agree on the broadcast
address. Otherwise there will be chaos and your network will be
flooded with spurious packets, causing all of your machines to become
unusable. ...
This kind of packet storm problems led to banning the use of 0 as a
unicast host address in 1989 in Host Requirements, RFC 1122.
https://www.rfc-editor.org/rfc/rfc1122.txt
DISCUSSION: Silent discard of erroneous datagrams is generally
intended to prevent "broadcast storms".
There's a whole section 3.3.6 in there that talks about broadcasting,
and other sections that require that the network layer pass "up" to the
IP layer an indication of whether the packet was broadcast or not, so
that network-layer broadcasts with unrecognized IP addresses can be
discarded rather than responded to. It also recommends sending LAN
broadcasts to 255.255.255.255 rather than the actual reserved subnet
broadcast address, to improve interoperability.
So, as of today, TWO addresses per subnet are still reserved: 0 and
all-ones. And with CIDR, we have millions of subnets, not just tens of
thousands, so we're wasting millions of addresses.
I suggest that, now that 4.2BSD is dead and gone, the protocols should
be revised to allow people to use the 0 address in each subnet for a
real unicast node, instead of reserving it. And on non-LANs, we should
allow the all-ones address for a real node as well. But that's about
the future, not about internet-history.
John
More information about the Internet-history
mailing list