I think the issue of bandwidth might be addressed by using similar solutions that logistics firms use.
The largest container ships move huge amounts to ports; ports move containers to trains and trucks; trucks move stuff to regional depots; regional depots push stuff in smaller delivery vans to customers.
Perhaps bitcoin needs a series of 3,000 - 4,000 nodes that are the largest ships; they give priority to data transfer to regional full nodes; these then serve SPV's.
edit
I think we need a BIP.
Would one determine the "largest ships" through a similar coding mechanism as you posted earlier? If you could somehow determine where / how full nodes were being run and how much bandwidth they each have then you could begin to divide them up into classes based on purpose and capability. Very interesting.
You can get quite a lot of useful information passing between nodes:
"id": n, (numeric) Peer index
"addr":"host:port", (string) The ip address and port of the peer
"addrlocal":"ip:port", (string) local address
"services":"xxxxxxxxxxxxxxxx", (string) The services offered
"lastsend": ttt, (numeric) The time in seconds since epoch (Jan 1 1970 GMT) of the last send
"lastrecv": ttt, (numeric) The time in seconds since epoch (Jan 1 1970 GMT) of the last receive
"bytessent": n, (numeric) The total bytes sent
"bytesrecv": n, (numeric) The total bytes received
"conntime": ttt, (numeric) The connection time in seconds since epoch (Jan 1 1970 GMT)
"timeoffset": ttt (numeric) The time offset in seconds
"pingtime": n, (numeric) ping time
"pingwait": n, (numeric) ping wait
"version": v (numeric) The peer version, such as 7001
"subver": "/Satoshi:0.8.5/", (string) The string version
"inbound": true|false, (boolean) Inbound (true) or Outbound (false)
"startingheight": n, (numeric) The starting height (block) of the peer
"banscore": n, (numeric) The ban score
"synced_headers": n, (numeric) The last header we have in common with this peer
"synced_blocks": n, (numeric) The last block we have in common with this peer
"inflight":n, (numeric) The heights of blocks we're currently asking from this peer
This can tell you the regional demand, if you have a mechanism to collect aggregated data and use it to host nodes locally to where the SPV demand is highest. This would help a lot as nodes like to connect to peers that are able to serve up data the quickest.
What I think we need is a priority system. Maybe:
* If you're an SPV get your data from full nodes and only from full nodes.
* If you're a node set to pruning, get your data only from full nodes.
* If you're a full node connect to other full nodes, but get most of your data from ServiceNodes.
* If you're a full node hosted by a ServiceNode, connect to other ServiceNodes to hold and sync a copy of the full blockchain, and ignore SPV's.
Needs to be thought through a lot better.