ruslannd
Oct 30 2009, 23:42
Использую библиотеку TCP/IP библиотеку от Keil. Есть следующая проблема:
Мое устройство на LPC2388 является сервером. Комп - клиент. Соединено все через Ethernet.
Есть проблема: от клиента пакеты могу принимать десятками за секунду. А от меня могу передать не более 3-4.
Затык происходит при ожидании, когда функция tcp_check_send кейловской библиотеки разрешит передать следующий пакет.
От длины пакета ничего не зависит. С чем это может быть связано?
ruslannd
Oct 31 2009, 13:51
Посмотрел монитором Ehternet'a.
Получилось что клиент (комп) отсылает пакет подтверждения (ACK) через 0,2 секунды. Я так понимаю, что это связано с флагами Ethernet пакета. Вот только какими? Или я что-то путаю?
Я не профессионал в этой области. но раз других комментариев нет, выскажусь. На сколько я понимаю, смотреть надо в сторону 'delayed ack'. Основной смысл такой:
Винда, посылает подстверждение получения пакета либо по истечении 200 мс, либо если сразу же после первого пакета был отправлен второй пакет без получения подтверждения доставки первого пакета (т.е. отправляется один ack на два пакета). Т.е. чтобы не загружать сеть мелкими пакетами винда посылает подтверждение на каждый второй принятый пакет. Видимо, применяемы вами, tcp/ip стек не поддерживает 'delayed ack'.
ЗЫ Кажется, на форуме уже поднимались подобные вопросы.
ruslannd
Oct 31 2009, 20:23
Я на форуме порылся, про delayed ack нашел, но применительно к кейловской реализации ничего не обнаружил. В настройках TCP ничего нет.
VslavX
Oct 31 2009, 21:00
Цитата(ruslannd @ Oct 31 2009, 15:51)

Получилось что клиент (комп) отсылает пакет подтверждения (ACK) через 0,2 секунды. Я так понимаю, что это связано с флагами Ethernet пакета.
Нет, это с флагами Ethernеt не связано. Это связано с особенностями протокола TCP, которые называются delayed ACK и Nagle Algorithm, причем эти особенности в Вашем случае "срабатывают" на стороне PC. Если у Вас клиент - самописная программа, то подавить эти "TCP features" для конкретного сокета можно при помощи функции setsockopt(TCP_NODELAY) или глобально (для всей системы):
http://msdn.microsoft.com/en-us/library/aa505957.aspx
ruslannd
Oct 31 2009, 21:24
Цитата(VslavX @ Nov 1 2009, 00:00)

Нет, это с флагами Ethernеt не связано. Это связано с особенностями протокола TCP, которые называются delayed ACK и Nagle Algorithm, причем эти особенности в Вашем случае "срабатывают" на стороне PC. Если у Вас клиент - самописная программа, то подавить эти "TCP features" для конкретного сокета можно при помощи функции setsockopt(TCP_NODELAY) или глобально (для всей системы):
http://msdn.microsoft.com/en-us/library/aa505957.aspxСпасибо. Проблема решена.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.