Цитата
Для начала рекомендую найти в опциях Ethernet-адаптера TCP/UDP offload checksum и выключить его. Это приведет к корректным контрольным суммам в WireShark. А уже потом дальше разбираться.
Спасибо, ценный совет. Отключил (думал так нельзя, раз железно-значит железно), сейчас КС в порядке в нормальных соединениях.
Цитата
поле опции должны завершаться двумя нулями.
по сниферу у вас видно, что эти нули присутствуют.
Но у вас значения поля содержащее длину заголовка меньше как раз на те два байта, в которых нули.
У вас поле длины заголовка 24, а должно быть 26.
Вы какой стэк используете ?
Готовый или самописный ?
Вот выкладываю две картинки: первая - не ставлю опции, КС в порядке, соединение устанавливается. Вторая - добавляю опцию 0х2 - указание MSS, длина - 0x4 и размер MSS - 0x5b4. Добавил по Вашему совету еще 32-битное поле (видел где-то что опции должны по 32 бита выравниваться, да и размер TCP заголовка в словах по 32 бита) - 0x1 (NOP) 0x1(NOP) 0x0 0x0. Размер заголовка - 28. Видим, завершается двумя нулями, однако же тот же самый ворнинг "Short segment..." и malformed packet. Посчитал вручную КС - совпадает с моей, поставленной в пакете, wireshark хочет видеть КС без учета поля опций. При этом почему то опции вообще не распознает, хотя на компьютерном соединении можно в wireshark развернуть опции и посмотреть что есть что...
Пробовал последние 32 бита забивать нулями, пробовал числа 0x00010101, 0x01010100 - блин, ну не выходит каменный цветок. Ругается всегда одинаково, как на второй картинке, опции видеть не хочет, КС хочет видеть без опций.
Стек за образец взял готовый, микрочиповский, но каждую строчку уже там прочувствовал. IP, ICMP ECHO, UDP, ARP - все работает отлично, вот с TCP - засада какая-то непонятная...
PS Посмотрел пакет ACK SYN нормального TCP соединения компов - опции вообще нулями не заканчиваются (третья картинка), MSS указывается точно также, КС посчитал - все совпадает так как я считаю.
Эскизы прикрепленных изображений