Нет подтверждения от установленного TCP-соединения - PullRequest
0 голосов
/ 06 июля 2018

Этот вопрос был размещен на StackExchange - NetworkEngineering. Люди предложили мне опубликовать это здесь. Вот мой оригинальный пост.

Я пытаюсь написать клиент, который инициирует TCP-соединение и отправляет некоторые данные. На стороне сервера я использую nc, который прослушивает определенный порт. Теперь я могу завершить трехстороннее рукопожатие. netstats показывает, что соединение установлено. Однако после того, как мой клиент начинает отправлять данные, он никогда не получает ACK.

Клиент реализован поверх DPDK и, таким образом, обходит стек ядра. Сервер связывается с другой сетевой картой. Две сетевые карты напрямую связаны. Часть TCP обрабатывается моим собственным кодом. Из-за недостатка знаний реализация значительно упрощена в том смысле, что я установил для многих полей фиксированные числа, например размер окна.

Как новичок в сети, я понятия не имею, что может пойти не так, и поэтому не уверен, какую информацию я должен предоставить, чтобы помочь вам определить проблему. Вот скриншот из wireshark. Мой клиент на 192.168.0.10:12345, а мой сервер слушает на 192.168.0.42:3456. ACK не отправляется со стороны сервера после пакета 6.

imagewireshark after 3-way handshaking">

Кроме того, причина неправильного FCS заключается в том, что мне пришлось добавить нули к SYN и первым ACK-пакетам, чтобы они составляли не менее 64 байтов, что является требованием клиентского сетевого адаптера.

Я сделал сравнение между пакетами от моего клиента и пакетами от nc клиента. Похоже, что для первого пакета данных единственное реальное отличие состоит в том, что у меня нет опций TCP, в то время как у nc есть метка времени. Может ли это быть проблемой?

Пожалуйста, дайте мне знать, если вы обнаружите что-нибудь, что может вызвать проблему без ACK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...