2) If both sides have the same tcpdump, it's not a network problem. Find the software problem. truss or strace can help
3) If the sides differ; figure out if the network is broken, or the os/network card is lying.
4) If the network is broken, fix it ;)
5) if the os/network card is lying, turn off the lying (mostly offloads, like segmentation, large receive, and checksum) and go back to step 1
This is basically common pattern debugging. I'm not getting the results that I expect; find a way to observe when/where the data in progress changes from what I expect to something else; along the way, being as explicit as needed about what data is expected. The closer you can narrow down where the failure occurs, the more likely you are to be able to find the failure, or a person responsible for fixing the failure who you can give your investigation results to and they can fix the failure.
I think that's why Stack Overflow websites focused on shallow conditions flourish -- the deep dives are usually specific to a given situation.