These are notes that I'm writing while planning the course. Not all
of the ideas in these notes will appear in the course. Everything will
be reorganized and rewritten.
Design Principles
- End-to-end principle.
- Design infrastructure bottom-up; design applications
top-down.
- To maximize total value of a resource (with sufficient demand),
emphasize throughput.
- Distinguish inherent costs from avoidable costs, and only work on
the latter. (E.g., tolerate dropped packets due to exceeding capacity;
avoid letting congestion decrease capacity.)
- For flexibility, provide clean simple modules instead of large
bundles of functions. Particularly avoid bundling a cheap service with
a much more expensive service. Particularly avoid bundling functions
that can change independently, e.g. data manipulation with user
interface.
- For performance, improving the best case and reducing the
occurrence of the worst case are often better than improving the worst
case. Particularly avoid improving an unusual worst case at the cost
of degrading a common best case. In distributed design, this principle
is even stronger due to positive feedback through other parts of the
design. A common application of this principle is optimistic
processing with detection of failure and recovery.
- In distributed systems, match authority to incentive as much as
possible.
- In large, adaptive, collaborative design, the order of introducing
constraints is crucial. Start with the minimal constraints that allow
for effective adaptation and collaboration in the future. Avoid
constraining decisions whose consequences are not known, or which
depend on conditions that are likely to change.
- In a distributed system of information, reliable information must
always be communicated positively by a detectible event. The absence
of an event may always be due to a local failure.
- When choosing between a more general less efficient service A, and
a less general more efficient service B, try to choose both: provide
the functionality of A, with optimizations that use the form of B when
possible. E.g., tail recursion may compile as iteration (need a
network example).
Conceptual cautions
- The distinction between "reliable" and "unreliable" is usually
misleading. Every system has a statistical profile of failure. The
granularity of failure is just as important as the probability of
failure.
- Reliability at one level often means tolerating failure at another
level.
- A change to one quality of a component often changes a totally
different quality of the system. E.g., improving the security of a
link may improve performance, but not security, of an encrypted
communication path. Most link qualities are seen as performance by
paths using that link.
- Dramatic reduction in the cost of a service often enables new and
surprising uses for the service (this is an example of feedback in
distributed design). The most important uses of a service are usually
the ones that haven't been invented yet.
- Relaxing one constraint often causes a different constraint to be
the limiting factor.
- In computing/communications, expect everything to virtualize.
- Lots of analysis determines and/or optimizes steady-state behavior
of a system. Many computing/communication systems never reach
steady-state, and the dynamic transient behavior is the only important
one. One of the most important drivers of transient behavior is the
rapid change in electronic/optical technology.
Perspectives
- Internet as bit-delivery service.
- Internet as support for applications.
- Internet as a social medium.
- Scalability/adaptability to new demands.
- Co-ordination of distributed authority.
- Virtualization, phenomenological evolution (e.g., definitions of
host, address).
Layers of design
- Addressing (IP, UDP)
- Delivery/forwarding (IP)
- Address management (DHCP)
- Routing (ARP, ICMP, RIP, OSPF, CIDR, IGP, BGP)
- Capacity management (TCP)
- Naming, relocation (DNS)
| Address management |
Routing |
Capacity management |
| Delivery/forwarding |
Naming, relocation |
| Addressing |
Desirable robustness
- scaling to more hosts
- relocatable sender
- relocatable receiver
Design choices
- forwarding: datagram (stateless router) vs. connection (stateful
router)
- switching: stateless packet vs. state in packet (NAT)
- reliability: end-to-end vs. link-by-link
- addressing: global vs. routed
- service level: best-effort vs. reserved; egalitarian
vs. differentiated
- congestion control: end-to-end vs. intermediate
Categories for
criticizing decisions
Strategic decisions taken in designing something as complex and
distributed as the global Internet cannot be determined clearly to be
correct or incorrect. Here are some interesting types of evaluations
of design decisions. We may evaluate a single decision in more than
one way.
- Successful in producing a particular desired result. E.g., the
decision to forward packets in a manner that does not require global
knowledge at any single host was successful in allowing the Internet
to scale.
- Unsuccessful in producing a particular desired
result.
- Accidentally productive of an undesired result.
- Adherent to good design principles.
- In violation of good design principles.
- Irrelevant with respect to a particular result.
- Not really a decision, since it did not constrain further
decisions. E.g., the decision that each IP number is the address of a
particular network interface on a particular host is violated by NAT
and other local variations, and overall network operations cannot
detect it.
Miscellaneous ideas
Here are some ideas that I don't want to forget, but I'm not sure
where they fit.
- If B can be implemented easily from A, but not vice versa, prefer
A in the infrastructure.
- If B requires A, but not vice versa, prefer A in the
infrastructure. E.g, setup for virtual circuits and source routing
require datagram service, so implement datagrams first.
- "Scalability" really means that it is easy to co-ordinate the
bundle of resources that must be added to achieve an incremental
expansion. So, all of those resources should be bundled into the
smallest possible number of packages, and as many as possible should
be deployable locally (in the administrative sense, not always the
geographical sense).
- Design bottlenecks (mandatory protocols, not network
bottlenecks) have a dual nature: they restrict the interaction between
different parts of a design, while they allow greater flexibility in
the operations on either side of the protocol.
- Reassignable resources, such as processor time and storage space
resources are not wasted by one action unless another action is
disrupted. So conservation is only valuable when a resource is close
to its limit. The economics of reassignable resources is totally
different from that of permanently consumed resources, such as
energy. Alternative view: each time slice of processing and storage is
an individual instantly perishable resource---if not used at that
instant, it is lost.
Types of Resources
| Durable | Intermediate | Perishable |
| Reusable | computation, storage | | - |
| Consumed | energy | | computation, storage |
Strangely, durable-reusable and perishable-consumed are the same
thing, viewed from different perspectives.
Time scales
- transit (one packet crosses the network)
- route integrity (a route changes)
- address integrity (an address changes)
Course outline
- Introduction
- Understand Internet design as a logical
(vs. historical) sequence of choices.
- Order choices by scope of agreement: the set of agents
who must abide by a choice for it to work.
- Addressing
- Global vs. routed
- Flat vs. aggregated
- Forwarding
- Path state in router?
- Path state in packet?
- Intermediate acknowledgment?
- Traffic control
- Congestion control: end-to-end vs. router control
- Service level: best-effort vs. reservation
- Handles (agent identifiers)
- Authentication and identification: hierarchical/authoritarian
vs. flat/phenomenological
Missing information
- What does "best effort" really mean, as a positive requirement? Is
it purely psychosocial, or is there a meaningful technical
definition?
Last modified: Mon Dec 5 19:14:51 CST 2005