Like @spc476 I think the layering violation section is not actually a layering violation. There’s a general requirement in all kinds of data formats (not just network packets) that an outer wrapper needs to say what kind of data it is encapsulating. That’s what ethertypes and IP protocol fields and well-known ports are doing.
The problem with port numbers is that they mix up the jobs of multiplexing and protocol identification.
I don’t think ossification is due to mistakes in the design of the internet: it’s a consequence of the network’s popularity and that it was designed before it was feasible to use encryption to prevent middleboxes from breaking layering / encapsulation. But yes, ossification is definitely a problem for making architectural changes.
My main complaint about the Internet is that (much like the telephone network) edge devices are connected to the network but they aren’t part of the network. That is, the protocols a device uses to connect (DHCP etc) are different from the protocols connecting the network interior (BGP etc). There are a bunch of aspects of the internet that can scale to a network of a million ISPs but can’t scale to a network of 10 billion devices, so devices have to be second class. As a result, for example, there’s no way that the network can communicate things like path characteristics to an edge device, so it has to laboriously find out the path MTU by guesswork. There’s no way for an edge device to expand the network, so if you want to share connectivity you have to NAT or do proxy NDP or other messy hacks.
The problem with port numbers is that they mix up the jobs of multiplexing and protocol identification.
I always thought of IP as a way of allowing two computers to exchange data, regardless of the hardware connection (Ethernet, SLIP, PLIP, SCSI, etc.) and that TCP and UDP allow two programs (on the same computer or different computers) to exchange data, with differing guarantees of reliability. That the different programs might want to exchange data packaged differently doesn’t bother me, but hey, it’s a better point than OSI ever made.
That is, the protocols a device uses to connect (DHCP etc) are different from the protocols connecting the network interior (BGP etc)
I’m not exactly sure what your argument here is. DHCP is a way of a device to obtain its IP address and to know where to sent packets (basically, just a default route) whereas BGP is a way for one autonomous network to know how to route data to another autonomous network (and OSPF for an autonomous network to automate routing information internally to it). To me, they target different concerns, although I can see where they do overlap (just a bit though). I don’t follow at all what you mean by “no way for an edge devcie to expand the network”. Back in the late 90s, I (through work) had an ISDN connection (dual channel—about the fastest connection one could get at home at the time) with a /27 routed to me. I split my IP allotment in half, and via a SLIP connection on my computer (definitely an “edge device” if there ever was one) let a friend have the other half of my allotment (with permission from work).
It’s hard to get my point across because there aren’t many examples of very large networks that make no distinction between edge devices and interior nodes. My complaint is that it’s necessary for DHCP and BGP to have different concerns: it would be better if the machinery for address allocation and routing is the same at the edge and in the core. When you were sharing your ISDN connection you were acting like an ISP for your friend, suballocating a CIDR range, but an edge device with a single address can’t do that. An edge device can provide connectivity to other devices using NAT etc but it isn’t being a router that talks routing protocols, it’s extending the edge not expanding the core.
Are you aware of any network (of any size) that makes no distinction between the edge and interior nodes?
I’ve thought about how one could grow a network of computers and it’s a difficult problem. With two computers, it’s trivial—the addresses are “me” and “the other” (for both sides) and routing is just sending and receiving data. Add a third computer and now you have issues of addressing, routing and discoverability. With three computers, you have two topologies, a linear one (A - B - C) and a planar one (a triangle). Who gets what address? How is routing configured? Now connect to networks other networks. How do you keep addressing and routing sane? It’s not an easy problem.
Is it not the case that DHT-oriented networks like Kademlia effectively solve this problem? The entire network has a homogenous protocol and can be arbitrarily expanded through any peer without requiring address reallocation or scoped addressing (NAT). Each peer has just one global identity.
While the OSI seven layer burrito is presented as the ideal way to implement a networking stack, where each layer can be swapped out for a different implementation, I am unaware of it ever having been implemented, unlike TCP/IP which is now everywhere. I also wonder how such a scheme would work? How would one just swap out layer 1 (physical layer, swapping, say a 2-wire serial connection with an 8-wire parallel connection) without affecting layer 2? Perhaps I’m not smart enough to see how one could do that without some concerns spilling over into layer 2.
I also find the complaint that the IP layer has a protocol field as a layer violation pretty weird—I got these bytes over IP, how does IP know what to do with it? Just pass it up unchanged? How does the next layer up know how to interpret the bytes? An identifier of some form has to exist somewhere, or else you won’t be able to change out the layer. Am I missing something here?
While the OSI seven layer burrito is presented as the ideal way to implement a networking stack, where each layer can be swapped out for a different implementation, I am unaware of it ever having been implemented
Aren’t the OSI protocols an implementation of this? Or do you consider the layers of the OSI protocols to be too enmeshed to match the OSI model?
Honestly, I think we should stop teaching the OSI 7 layer model.
It’s not the TCP/IP model, it’s the ISO competitor from the EU, it hasn’t won out and it’s not how it works. OSI had some really neat ideas, but frankly, we should do more layer violations.
I hold as a principle that layers should be semi-aware of eachother, beyond just a protocol type field. Though obviously not at the expense of routing complexity.
Like @spc476 I think the layering violation section is not actually a layering violation. There’s a general requirement in all kinds of data formats (not just network packets) that an outer wrapper needs to say what kind of data it is encapsulating. That’s what ethertypes and IP protocol fields and well-known ports are doing.
The problem with port numbers is that they mix up the jobs of multiplexing and protocol identification.
I don’t think ossification is due to mistakes in the design of the internet: it’s a consequence of the network’s popularity and that it was designed before it was feasible to use encryption to prevent middleboxes from breaking layering / encapsulation. But yes, ossification is definitely a problem for making architectural changes.
My main complaint about the Internet is that (much like the telephone network) edge devices are connected to the network but they aren’t part of the network. That is, the protocols a device uses to connect (DHCP etc) are different from the protocols connecting the network interior (BGP etc). There are a bunch of aspects of the internet that can scale to a network of a million ISPs but can’t scale to a network of 10 billion devices, so devices have to be second class. As a result, for example, there’s no way that the network can communicate things like path characteristics to an edge device, so it has to laboriously find out the path MTU by guesswork. There’s no way for an edge device to expand the network, so if you want to share connectivity you have to NAT or do proxy NDP or other messy hacks.
I always thought of IP as a way of allowing two computers to exchange data, regardless of the hardware connection (Ethernet, SLIP, PLIP, SCSI, etc.) and that TCP and UDP allow two programs (on the same computer or different computers) to exchange data, with differing guarantees of reliability. That the different programs might want to exchange data packaged differently doesn’t bother me, but hey, it’s a better point than OSI ever made.
I’m not exactly sure what your argument here is. DHCP is a way of a device to obtain its IP address and to know where to sent packets (basically, just a default route) whereas BGP is a way for one autonomous network to know how to route data to another autonomous network (and OSPF for an autonomous network to automate routing information internally to it). To me, they target different concerns, although I can see where they do overlap (just a bit though). I don’t follow at all what you mean by “no way for an edge devcie to expand the network”. Back in the late 90s, I (through work) had an ISDN connection (dual channel—about the fastest connection one could get at home at the time) with a /27 routed to me. I split my IP allotment in half, and via a SLIP connection on my computer (definitely an “edge device” if there ever was one) let a friend have the other half of my allotment (with permission from work).
It’s hard to get my point across because there aren’t many examples of very large networks that make no distinction between edge devices and interior nodes. My complaint is that it’s necessary for DHCP and BGP to have different concerns: it would be better if the machinery for address allocation and routing is the same at the edge and in the core. When you were sharing your ISDN connection you were acting like an ISP for your friend, suballocating a CIDR range, but an edge device with a single address can’t do that. An edge device can provide connectivity to other devices using NAT etc but it isn’t being a router that talks routing protocols, it’s extending the edge not expanding the core.
Are you aware of any network (of any size) that makes no distinction between the edge and interior nodes?
I’ve thought about how one could grow a network of computers and it’s a difficult problem. With two computers, it’s trivial—the addresses are “me” and “the other” (for both sides) and routing is just sending and receiving data. Add a third computer and now you have issues of addressing, routing and discoverability. With three computers, you have two topologies, a linear one (A - B - C) and a planar one (a triangle). Who gets what address? How is routing configured? Now connect to networks other networks. How do you keep addressing and routing sane? It’s not an easy problem.
Is it not the case that DHT-oriented networks like Kademlia effectively solve this problem? The entire network has a homogenous protocol and can be arbitrarily expanded through any peer without requiring address reallocation or scoped addressing (NAT). Each peer has just one global identity.
While the OSI seven layer burrito is presented as the ideal way to implement a networking stack, where each layer can be swapped out for a different implementation, I am unaware of it ever having been implemented, unlike TCP/IP which is now everywhere. I also wonder how such a scheme would work? How would one just swap out layer 1 (physical layer, swapping, say a 2-wire serial connection with an 8-wire parallel connection) without affecting layer 2? Perhaps I’m not smart enough to see how one could do that without some concerns spilling over into layer 2.
I also find the complaint that the IP layer has a protocol field as a layer violation pretty weird—I got these bytes over IP, how does IP know what to do with it? Just pass it up unchanged? How does the next layer up know how to interpret the bytes? An identifier of some form has to exist somewhere, or else you won’t be able to change out the layer. Am I missing something here?
I have an old comment regarding mixing and matching layers (or rather, not being able to) … maybe I’ll just link to all my old OSI model rants :-)
https://lobste.rs/search?q=commenter%3Afanf+osi+model
Aren’t the OSI protocols an implementation of this? Or do you consider the layers of the OSI protocols to be too enmeshed to match the OSI model?
Honestly, I think we should stop teaching the OSI 7 layer model.
It’s not the TCP/IP model, it’s the ISO competitor from the EU, it hasn’t won out and it’s not how it works. OSI had some really neat ideas, but frankly, we should do more layer violations.
I hold as a principle that layers should be semi-aware of eachother, beyond just a protocol type field. Though obviously not at the expense of routing complexity.
Check out https://csr.bu.edu/rina/about.html for a well-developed critique and alternative proposal. See also John Day’s book: https://www.amazon.com/Patterns-Network-Architecture-Fundamentals-paperback/dp/0137063385
And https://ouroboros.rocks/blog/2021/03/20/how-does-ouroboros-relate-to-rina-the-recursive-internetwork-architecture/ for some back-story
Following a sudden rant I wrote on a recent submission about IPv6 https://lobste.rs/s/sm7pk7/ipv6_transition#c_vvdzob I though this article might interest yall