Назад | Перейти на главную страницу

Странное поведение протокола TCP в моей программе

Я недавно начал работать в области ИТ, и в качестве первого задания они хотят, чтобы я общался с удаленной платой с помощью простого сокета с использованием Java. Сегодня я выполнил всю работу, но заметил, что мои сообщения принимались неправильно ... Итак, я начал копать и начал использовать wirehark для лучшего понимания вопроса «Что происходит?». Я знаю, что перед отправкой данных клиент и сервер выполняют трехстороннее рукопожатие, затем клиент отправляет свои данные, а когда это сделано, он закрывает соединение и говорит серверу. Вот мой вопрос: я отправляю пакет на удаленную плату с помощью Packet Sender (идеально подходит для отладки и тестирования), и вот что я вижу:

 First 3 message are the handshake
 1. client SYN server
 2. server SYN, ACK client
 3. client ACK server
then I got this messages
 4. client PSH, ACK server
 5. server ACK client
 6. client FIN, ACK server
 7. server ACK client
 8. server FIN, ACK client
 9. client ACK server

PSH - это фаза, на которой я отправляю байт в сокет сервера, затем отвечает сервер, поэтому я закрываю (FIN) соединение, а затем сервер делает то же самое. Этот порядок очень важно соблюдать для правильного общения? Это результат моего пакета, отправленного с использованием моей программы на JAVA:

Handshake
 1. client SYN server
 2. server SYN, ACK client
 3. client ACK server
then I got this messages
 4. client PSH, ACK server
 5. client FIN, ACK server
 6. server ACK client
 7. server ACK client
 8. server FIN, ACK client
 9. client ACK server

Что вы думаете? Как я могу исправить эту проблему? Это действительно раздражает, потому что сервер вообще ничего не делал. Должен ли я попытаться открыть сокет на несколько миллисекунд? Всегда ли протокол TCP работает так, как описано выше в примере с отправителем пакетов, или его можно смешивать с другими запросами, как это происходит в моей программе? Спасибо вам всем

Я решил проблему, установив задержку в 300 мс перед закрытием Streand и Socket, чтобы у клиента и сервера было время поговорить друг с другом. Меньшая задержка заставит их снова рассинхронизировать! Может этот пост кому-то поможет: D