You see, TCP makes a promise to you. The promise is that if you use a TCP connection between application X and application Y, and you send A, then, B, then C, A will get there before B gets there, and B will get there before C gets there.
Notice I didn't say that TCP promises that A will get there at all. Maybe a vindictive garden gnome cut your ethernet cable with pinking shears. Maybe your router caught fire. Who knows; sometimes the traffic doesn't get through. TCP will simply fail in those cases, but it will promise that B will not get through unless A does first. It might have to break up A into multiple pieces, so you might get A A A B C, but you'll never get A C or C A B.