#tcp
Вопрос:
Я столкнулся со странной проблемой. Когда происходит повторная передача tcp, она должна отправлять ту же полезную нагрузку с пропущенным пакетом. Но я видел, как повторная передача отправляла другую полезную нагрузку в системе Windows. Это нормально ? и любой RFC объясняет это?
пример 1:
- tcp.seq:605921 tcp.len:546 этот пропущен
- tcp.seq:605921 tcp.len:1188
- tcp.ack:607109
Пример 2:
- tcp.seq:4529820 tcp.len:419 этот пропущен
- tcp.seq:4530239 tcp.len:1460
- tcp.ack:4529820
- tcp.seq:4531699 tcp.len:92
- tcp.seq:4529820 tcp.len:1460
- tcp.ack:4531791
Ответ №1:
Повторная передача TCP заключается не в повторной отправке пропущенных пакетов, а в отправке пропущенных данных. Вполне может случиться, что повторно переданные данные будут объединены со следующими данными в одном пакете. Ваш вопрос показывает только разную длину полезной нагрузки, а не (как указано в названии) другую полезную нагрузку. Полученные данные приложения, скорее всего, одинаковы, только они упакованы по-разному для транспортировки.
Комментарии:
1. @eeie9999: TCP-это протокол потока байтов, а не протокол сообщений. Упаковка производится только во время транспортировки. Если ваше приложение не может работать с различными видами упаковки (например, ожидать, что один
recv
файл будет точно соответствовать одномуsend
), то ваше приложение не работает. К сожалению, такие неправильные представления вместе с неверными ожиданиями и, как следствие, неработающими приложениями не являются редкостью.2. спасибо, нашел тот же вопрос и ответ, osqa-ask.wireshark.org/questions/30019/…