I would be happy to do the overhead calculations but others have pretty much already said it all. There are other variables, IPv4 vs IPv6, the latter being very slightly slower on large packets because the headers are bigger, but with small packets these overheads are very significant. With TCP there’s also the option of having added overhead in the form of ‘timestamps’ - 12 bytes appended to the TCP header which is used to improve TCP performance by allowing precise time measurement of the messages’ end-to-end transit time.
A much more significant thing can be the slowness inherent in some TCP connections either due to outdated TCP software in one end or the other, or problems with packet loss over the link including packet corruption which causes loss. Packet loss temporarily slows some versions of TCP down enormously and it takes a certain amount of time to recover to full speed. Some new software is much better in this respect. If you have problems somewhere between the two ends when you’re transferring stuff with TCP then this will usually ruin you speed.
Finally some speed testers are horrendously inaccurate, either because of bad design, intentional lying, or congestion, with too many users competing for the same links into the speed tester servers, or too many users overloading the servers themselves. The servers’ readings can be miles out in either direction, under- or over-reading. One server says my upstream is 20Mbps, when in fact it is about 1.65 Mbps upstream TCP payload throughput. So it’s vital to test with several different servers and I recommend testing in the small hours. Unless a server is known to be an exaggerating liar, then take the highest readings as that will usually be due to that server having the best path to/from your ISP. If your ISP has an on-network speed test server then that’s probably always the one to go for. If you have done the overheads arithmetic above, then you’ll be able to rule out impossible TCP throughput figures for your sync rates down/up, and will know when a server is an exaggerating liar. (The server won’t know anything about sync rates though. It will just be exaggerating for reasons best known to themselves.)