I have used most of these at one time or another. I usually default to using TFTP out of habit more than anything else. Keep in mind that TFTP may not be the most efficient mode to use. Unless it has been tweaked, it uses a packet size of 512 bytes. How fast it it transfer a file is dependent on how quick the receiving end of the transfer is ACK’ing the packets that are being sent/received. The part that can usually be a problem is if the network you are transferring over is in heavy use because the UDP packets used by TFTP may get dropped somewhere along the way. There are several different TFTP servers to choose from. TFTP32 is the one that I have used the most on the Windows platform. Cisco used to have a TFTP freebie they gave away but have since pulled that and started pointing folks over to using Solarwinds free tftp server. If you are using the Mac, check out my free eBook on your options for that platform. One area that I have used TFTP is the past is when the WAN link to a site has been under heavy utilization is that I will transfer all the IOS images I need and upload them to the site router and using the tftp-server function in IOS, transfer the IOS updates to the local routers/switches at that site.
When I need max file transfer speed or may be updating several devices at the same time, I usually switch to HTTP or FTP. One thing to keep in mind here when transferring multiple IOS images to multiple sites/devices at the same time is that you may need to throttle back how much bandwidth that the app you are using for the transfers is allowed to consume so that you dont overwhelm the WAN connection at a remote site.
One thing that is a default action that I usually do on any IOS images is to do the Verify command before rebooting the device to the new image. When you download any IOS/firmware image from Cisco, you will see the checksum value for that file. Especially on remote devices where you dont have onsite talent that is comfortable with helping with network gear, it is good to be able to take an extra step to make sure that you arent about to boot onto corrupted code. As an additional failsafe, if there is room available on local flash, is to leave the version of IOS that is being replaced so that you have the option of falling back to the older code if there is a problem. Theoretically, if the device you are reloading has a problem with the code that is being loaded, it may be able to switch over and boot from the older code that is still present in flash.