При создании веб-сервера клиент не распознает кадр HTTP 200 OK - PullRequest
2 голосов
/ 07 апреля 2010

Я создаю свой собственный веб-сервер на основе учебника. Я нашел простой способ установить TCP-соединение и отправить один сегмент данных http (веб-сервер будет работать на микроконтроллере, поэтому он будет очень маленьким)

В любом случае, вот последовательность, которую мне нужно пройти:

  1. получить SYN

  2. отправить SYN, ACK

  3. получить ACK (соединение установлено)

  4. получить ACK с помощью команды HTTP GET

  5. отправить ACK

  6. отправить FIN, ACK с данными HTTP (например, 200 OK)

  7. получить FIN, ACK <- я не получаю этот пакет! </p>

  8. отправить ACK

Все работает нормально, пока я не отправлю свое подтверждение и сообщение HTTP 200 OK. Клиент не отправит подтверждение этим двум пакетам и, таким образом, веб-страница не отображается. Я добавил pcap-файл последовательности, в которой записал это с помощью wireshark.

Файл Pcap: http://cl.ly/5f5/httpdump2.pcap

Все порядковые номера и номера подтверждения верны, контрольная сумма в порядке. Флаги тоже правильные. Я понятия не имею, что происходит не так.

Ответы [ 3 ]

1 голос
/ 07 апреля 2010

Я думаю, что шаг 6. должен быть просто FIN, без ACK. Какой пакет от клиента вы ACKing в этом месте? Также я не понимаю, почему 4. должен быть ACK вместо обычного пакета данных - клиент подтвердил соединение на 3.

Эта диаграмма состояний TCP может помочь.

0 голосов
/ 11 мая 2010

Следовательно, в поле длины IP было слишком много 8 битов. Я сделал ошибку в моих расчетах. Теперь все работает как шарм!

0 голосов
/ 07 апреля 2010

WireShark говорит (о пакете FIN):

Сломанный TCP: поле подтверждения ненулевой, пока флаг ACK не установлен

Я не знаю точно, что является причиной вашей проблемы, но если WireShark не нравится этот пакет, возможно, клиент тоже не любит. Таким образом, это должно быть FIN + ACK или вы должны установить поле подтверждения на 0.

Если это не решит проблему, вы можете сначала попытаться отправить данные, а затем отдельный пакет FIN. Допустимо включать данные в FIN, но чаще отправлять FIN самостоятельно (как видно из другой трассировки pcap, которую вы опубликовали ранее).

Кроме того, вам, вероятно, следует установить флаг PUSH в пакете с помощью 200 OK

Наконец, я не вижу попыток повторной передачи для пакета FIN - это потому, что вы сразу же остановили захват?

...