If you don't have the old and new versions of files on the same machine, then rsync-like algorithms are the way forward (see previous answers). If you do have both the old and the new versions of files on the same machine, you can then do better than rsync: generate compressed diffs and send them over the network.
For generating efficient diffs, have a look at VCDIFF (RFC 3284) binary delta compression. One good implementation is xdelta (www.xdelta.org). It's fairly easy to implement a decoder/decompressor if you want to avoid using xdelta on the receiving end because of license issues. Writing your own VCDIFF diff generator that will generate compact diffs is much more complicated (think searching for moved blocks as an example).
In VCDIFF the diffs can also be sourceless, meaning they decompress into the target file without any source file (the file to which a diff is applied) at hand -- in VCDIFF compressing a file is a special case of creating a compressed delta between two files. This is useful because you can use the same format regardless of whether the destination has a version of your file.