Задать вопрос

Возможно ли у получателя определить «границы пакетов» TCP отправителя?

Коллеги, кривоватый получился вопрос. Уточню. Итересует ответ от специалистов, хорошо понимающих TCP/IP.

Насколько я понимаю, MTU для Ethernet - около 1500 байт. Соответственно, если я делаю отправку в сокет меньшего количества байтов, то они могут задержаться в буфере до следущей (нескольких) отправок, если нет флага PSH. Всё так?
Получатель (для примера примере возьмём NodeJS) будет дергать колбек на получение данных в сокет для каждого моего "сообщения". Для каждой моей отдельной посылки, меньшей 1500 и снабженной PSH. А может получиться так, что пакет по дороге фрагментируется? И придёт двумя TCP-пакетами? И тогда я получу два вызова колбека?

Или, если я отправлю более 1500, тогда это точно уходит несколькими пакетами. Это будет несколько вызовов колбеков на принимающей стороне? Гарантированно столько, сколько пакетов или непредсказуемо? Или на это еще может наложиться цикличность опроса в event-машине NodeJS и вычиток и колбеков может быть иное количество?

Я пробую из одного процесса nodejs в другой кинуть в сокет 60К и получаю 4 вызова колбека на приёмнике. Это вроде бы меньше, чем по вызову на пакет, но и больше чем один вызов на всю посылку.

Соответственно, вопроса два:
- Предсказуемо ли количество колбеков?
- Можно ли понять, что вот эти несколько TCP-пакетов - это одна посылка клиента? Видел в анализаторе некие reassembled-пакеты, но пока не понял, про что это.

Вопрос задаю потому что хочу узнать - могу ли я на приёмнике получать как бы события "клиент отправил посылку". И не важно во сколько это уложилось TCP-пакетов.
Или нет? Или просто труба из которой байты валятся в правильном порядке, но без каких либо границ, или как минимум не соответствующих операциям записи в сокет у отправителя.

Если туманно изложил - дополню.
  • Вопрос задан
  • 2782 просмотра
Подписаться 4 Оценить 2 комментария
Решения вопроса 1
gbg
@gbg Куратор тега Компьютерные сети
Любые ответы на любые вопросы
Scorpi и Павел Китьян нужно срочно начать читать замечательный учебник Снейдера - Эффективное программирование TCP/IP
1004494083.jpg

Если коротко - вы должны отправлять перед передачей данных длину передаваемого, затем принимать куски, суммировать их длины и собирать из них итог.

Вы никогда не должны завязываться на то, что TCP внутри себя режет поток байт на датаграммы. Для программиста TCP - труба о двух сокетах, один - на клиенте, второй - на сервере.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Scorpi
@Scorpi
Я пытался сделать принималку изображений по TCP на node.js и тоже столкнулся с этой проблемой.
В результате ничего лучше не придумал как сначала отправлять размер файла, а потом просто считать кол-во принятых байт чтобы знать где конец.

Сейчас погуглил, и пишут что можно узнать где конец передачи по \n
Т.е. если пришёл end-line - значит передача закончена.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы