It seems if a block download doesn't complete because a node is too slow or some other timeout, then the block is requested again from the network and the download starts from 0 bytes.
Since most of the time you will be getting the same data, a partial block should be able to be completed from a different source. If the SHA1 doesn't match then you can throw out the partial you just downloaded, if it happens again then start from 0.
There should be a config file option to turn this off, just in case.