1) A transport layer. This includes resumable tranfers over the network, peer autodiscovery on a LAN, etc. But also: streaming tar-like transfer and filesystem transfer, so your medium can be USB drives, Dropbox, S3, etc.
2) The packet layer. You can send or request files, or request the remote execution of stuff.
NNCP is a very Unixy program, supporting things piping in and such.
I have been doing backups over NNCP for some time now, and it handles everything
from 100 byte to 500GB backup sets for me.
One thing NNCP doesn't do is promise that it will execute requests in order, because things can be relayed via various hops and methods. So I wrote Filespooler, which is a Unixy async execution tool, that can run atop NNCP, but also Syncthing, Dropbox, etc:
Filespooler lets you pop requests onto anything from a USB stick to a synced folder or an NNCP request, including piping in of arbitrarily-large payloads, and (by default) will force them to be executed in order. Perfect for incremental backups.
I mentioned Syncthing. It's a folder sync tool sort of like Dropbox, but entirely peer-to-peer. It is also distributed with greedy eventual consistency,
so you can, for instance, use your phone as a carrier between your home (with Internet) and a shed (without). Your Pi at the shed will sync with the Syncthing on your phone when it's there, and your phone will sync with your home/other devices when it's got Internet access. Since NNCP and Filespooler can both run atop Syncthing, this makes a pretty easy way to set up an asynchronous mesh.