If you are using UDP and have dropped packets then you lose data, which really slows things down as you have to repeat the transfer. Many UDP apps do the checking and retries at that layer, but it tends to be slower than TCP as TCP's checking and retry mechanism has been very well optimized over the last 35 years. If no problems occur in TCP, it's only about 80 instructions to get through the layer. Most of the bulk is handling the very strange errors and conditions that can occur.