Although some code has already been introduced for "misbehaving" nodes, I think this could be further extended.
E.g. nodes ignoring getdata requests. So far, this can cause a node to wait 2 minutes before re-asking, but if enough nodes started ignoring getdata requests, this could possibly cause significant detriment to the network.
I propose some code that allows nodes to learn the network speed they are operating on, e.g. average times between asking for a tx or a block and receiving one. Then it should be possible to introduce timeouts for nodes which are significantly taking longer than average, and mark them as suspicious (may be that they just have poor network connectivity). This can be particularly of significance when catching up with the blockchain.
By learning network speeds, the node can determine whether to download blocks from a number of nodes at once, rather than just one at a time, and also whether to upload blocks to many nodes at once or just one at a time.