В RFC 793 есть часть о подтверждении сегментов TCP:
Когда TCP передает сегмент, содержащий данные, он помещает копию в очередь повторной передачи и запускает таймер; когда подтверждение для этих данных получено, сегмент удаляется из очереди. Если подтверждение не получено до истечения таймера, сегмент передается повторно.
Подтверждение TCP не гарантирует, что данные были доставлены конечному пользователю , но только то, что принимающий TCP взял на себя ответственность за это.
Теперь это интересно. В нашем NOC мы часто устраняем проблемы с подключением между нашей сетью и внешней клиентской сетью, и всякий раз, когда мы отслеживаем трафик на брандмауэре и видим биты SYN и ACK, отправленные и полученные в обоих направлениях, мы предполагаем, что подключение установлено, и проблема не имеет ничего общего делать с сетью.
Но теперь этот RFC заставил меня задуматься - что еще я должен проверить (без настройки Wireshark), если установлено соединение TCP, но у пользователей все еще возникают проблемы с подключением?
источник
Ответы:
Эта часть RFC касается передачи ответственности операционной системе или какому-либо следующему этапу процесса. Это в основном связано с разделением слоев.
Я всегда думал об этом так:
Все, что он говорит, это то, что это подтверждение уровня 3 («Я слышу ваши байты»), а не подтверждение более высокого уровня . Рассмотрим, например, различие между TCP ACK, SMTP
250 OK
после того, как почтовый шлюз следующего перехода принимает сообщение, сообщение о получении сообщения (например, согласно RFC 3798 ), пиксель отслеживания открытого сообщения, благодарственное письмо от PA, и ответ: «Да, я сделаю это».Другим конкретным примером будет принтер:
Я хотел бы предположить, что если пользователи видят и отправляют ACK, но все еще испытывают проблемы с подключением, на порядок выше вероятность возникновения перегрузок, ОС или приложений, чем что-либо, строго связанное с сетью.
Для диагностики я предлагаю искать ретрансляторы, а не конкретно ACK.
источник
recv()
сокет, и в этом случае полученные данные будут оставаться в буфере приема сокета TCP на неопределенный срок.С точки зрения RFC, «конечный пользователь» - это приложение. Нет гарантии, что приложение получило данные, только то, что процесс TCP получил их.
С вашей точки зрения NOC, сеть функционирует, и данные достигают конечного хоста. Предположительно, это все, что вас волнует.
источник
Вы могли видеть это таким образом.
Вы - M.Smith, и вы хотите отправить письмо M.Toto (лица - это слой приложения).
Чтобы отправить письмо, отправляйтесь в местное почтовое отделение A, которое отправит письмо в местное почтовое отделение B M.Toto (почтовые отделения являются уровнем TCP).
Все может быть хорошо между вами, почтовое отделение A и почтовое отделение B - B отправят ACK на почтовое отделение A. Но ничто не гарантирует, что письмо прибудет в M.Toto. Что-нибудь могло случиться между почтовым отделением B и M.Toto.
Это в основном то, что говорит RFC.
источник