Вы словом "фрагментация" всех запутали 
Фрагментируются ip датаграммы. И этот процесс не зависит от работы TCP. Например, Вы можете отправить через ТСР 1000 байт. На уровне ip он могут быть фргаментированы на две датаграммы. Но на другом конце их дефрагментируют совершенно прозрачно для транспортного протокола и TCP получит порцию данных в 1000 байт. Тем не менее, это никак не гарантирует, что через ТСР данные пересылаются такими же порциями, как вы хотите вызывая функцию send. Во-первых, ТСР может собирать мелкие пакеты в более крупные ( т.н алгоритм Нагла, он отслючается опцией TCP_NODELAY ). Во-вторых, во время установки соединения оговаривается величина MSS — максимальный размер данных, пересылаемых за одну посылку ( 1460 для ethernet ). В третьих, TCP синхронизирует размер приемного окна и удаленная сторона может потребовать уменьшить окно, что может в принципе привести к уменьшению размера пересылаемых данных ( врядли это можно увидеть в современном мире ). В четвертых, на пути следования могут оказаться различные узлы вроде NAT ов, фаерволов, VPN, которые в общем случае могут пересобирать поток данных и пересылать его дальше другими порциями. Короче говоря, полагаться на то, что на приемном конце данные будут приняты такими же порциями, что и отправлялись нельзя. Нужно сразу уяснить — TCP протокол, в отличии от UDP — датаграммного протокола.Да пребудет с тобою сила | |