Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите с Ethernet TCP/IP
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Fast Ethernet/Gigabit Ethernet/FibreChannel
alexPec
Начал писать TCPIP. При отладке началось...

Вопрос №1:
Смотрю пакеты wireshark-ом. Для начала соединил 2 компа и установил TCP соединение. (пакеты на первом рисунке) . Пакет SYN (№51) проходит нормальный, SYN,ACK (52) нормальный, а ACK(53) - уже с ошибкой контрольной суммы. При передаче данных wireshark тоже говорит что пакеты PSH с ошибкой контрольной суммы. Слышал, что КС вычисляется аппаратно кое-где, но тогда поле КС равно 0. А тут не 0. Повторюсь, это при соединении между 2 компами, при этом данные передаются, соединение устанавливается нормально.

Вопрос №2:
Соединяю комп и свой контроллер. Делаю установить соединение (SYN пакет от компа, на втором рис. первый пакет), в контроллере формирую свой пакет SYN,ACK, отсылаю, комп на него не реагирует, а wireshark пишет непонятное "Short segment. Segment/fragment does not contain full TCP header....". Контрольная сумма с ошибкой, но на это уже внимания не обращаю.
После долгих мучений убрал опцию MSS в заголовке, т.е. поля options не стало вообще - все стало ок, соединяется, данные отсылаются, КС в порядке.
Как добавить MSS в заголовок, подскажите. На втором рис пакет, где он добавлен, но wireshark вообще распознавать в нем опции не хочет. Пишет Malformed и все. При этом вычисленная wireshark-ом КС соответствует той, как если бы в пакете не было поля options вообще. Почему добавили одну опцию и пакет стал "does not contain full TCP header" и "Malformed" ???

Все уже перечитал, перепроверил, КС на калькуляторе просчитал - все вроде по науке. Подскажите что-нибудь!
dimka76

поле опции должны завершаться двумя нулями.
по сниферу у вас видно, что эти нули присутствуют.
Но у вас значения поля содержащее длину заголовка меньше как раз на те два байта, в которых нули.

У вас поле длины заголовка 24, а должно быть 26.

Вы какой стэк используете ?
Готовый или самописный ?


Посмотрите сниффером как соединяется ваш компьютерос с каким-нибудь сайтом.
Rst7
Для начала рекомендую найти в опциях Ethernet-адаптера TCP/UDP offload checksum и выключить его. Это приведет к корректным контрольным суммам в WireShark. А уже потом дальше разбираться.
alexPec
Цитата
Для начала рекомендую найти в опциях 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 указывается точно также, КС посчитал - все совпадает так как я считаю.
dimka76
Вообще, с точки зрения расчета контрольной сумма, оции это просто данные.
Может быть, вы при расчете КС не верный размер данных для вычисления указываете.

RFC4413
Цитата
4.3. Опции

Опции размещаются в конце заголовка TCP и учитываются при вычислении контрольной суммы. Опция может начинаться на любой границе байта. Заголовок TCP должен дополняться нулями для выравнивания по 32-битовой границе.

Необязательные поля заголовка идентифицируются полем типа опции. Опции типа 0 и 1 занимают один октет. Все остальные опции имеют 1-октетное поле типа, за которым следует октет размера (length) и поле данных, размером length-2 октета.


http://rfc2.ru/4413.rfc#p4.3.1
alexPec
Все, нашел. Ошибка не в ТСР а в IP заголовке, длина данных указана не верно была. Сейчас все нормально.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.