Data arrives to both the network and storage stacks as a stream
of discrete packets. Mirage bridges the gap between packets and
streams by using channel iteratees [23] that map functions over
infinite streams of packets to produce a typed stream. Iterators
eliminate many of the fixed-size buffers that are often used in a less
tightly coupled conventional kernel/userspace. Chained iterators
route traffic directly to the relevant application thread, blocking
on intermediate system events if necessary. We now describe the
specifics of networking (§3.5.1) and storage (§3.5.2).