|
|
  |
TCP/IP for Stellaris, TCP/IP стэк для МК Stellaris |
|
|
|
Jul 21 2011, 12:20
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 14-04-10
Пользователь №: 56 652

|
Всем добрый день. Около полугода назад была необходимость в поднятии собственного высокопроизводительного и простого TCP\IP стека. Могу поделится своими трудами. Есть вещи которые стоило бы допилить, но в рамках проекта они были не нужны. С удовольствием выслушаю критику. А если кто-то захочет допилить мелочи, то отвечу на все вопросы. Ах, да! забыл сказать стек документирован на русском языке
Прикрепленные файлы
TCP_1_1.7z ( 82.46 килобайт )
Кол-во скачиваний: 41
|
|
|
|
|
Jul 21 2011, 12:45
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 14-04-10
Пользователь №: 56 652

|
Цитата(scifi @ Jul 21 2011, 15:35)  Подозрительно: кода всего 600 строчек. А все RFC, имеющие отношение к TCP, потянут скорее на 600 страниц. Видимо, этот TCP работает только в очень особых случаях. смотря что вы называете особыми случаями. Если вас интерисуют DNS запросы, работу через gateway, DHCP - то кончено же нет. А если вас например интерисует передача большого объема данных по протоколу UDP в пределах одной подсети - то это то что надо. TCP реализован не идеально(огрехи описаны в документации), но опять таки, для моей задачи достигнутой пропускной способности было достаточно. тот же DHCP например дописать для разбирающегося человека - не проблема, другое дело, что в рамках моей задачи он небыл необходим
|
|
|
|
|
Jul 21 2011, 12:59
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 14-04-10
Пользователь №: 56 652

|
дока в pdf, вместо odt Цитата Цитата(mstumbra @ Jul 21 2011, 16:45) * TCP реализован не идеально(огрехи описаны в документации), но опять таки, для моей задачи достигнутой пропускной способности было достаточно.
По-видимому, повторная посылка в случае потери пакета не реализована. То есть при потере пакета сессия TCP повисает. Если так, то это и есть главное ограничение. повторная посылка реализована  основное ограничение tcp - следующий пакет данных не посылается до получения подтверждения. то есть данные будут посылаться повторно до получения подтверждения или сброса соеденения(ACK | RST)
|
|
|
|
|
Jul 21 2011, 13:11
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE Ах, да! забыл сказать стек документирован на русском языке Что-то я там нифига не вижу ни описания, ни примера использования. Так, огрызочек, хотя кое-что можно разобрать. QUOTE высокопроизводительного и простого TCP\IP стека. По поводу высокопроизводительности у меня масса вопросов. malloc там как-то совсем инородно выглядит. Не видать Fast Retransmit и вообще не ясно, как организована работа с подтверждениями и перепосылками. Собственно говоря, вообще не очень ясен программный интерфейс к собственно стеку, но это к вопросу выше. Проверки на валидность всех полей в пакетах все-же очень желательна. Не видно работы с опцией MSS. Пока писал, появились ответы на некоторые вопросы. QUOTE основное ограничение tcp - следующий пакет данных не посылается до получения подтверждения. О какой производительности стека может идти речь?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 21 2011, 13:14
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 14-04-10
Пользователь №: 56 652

|
Цитата(Rst7 @ Jul 21 2011, 16:11)  О какой производительности стека может идти речь?  25 Мбит\с А по UDP - 80 Мбит\с там ведь все написано
|
|
|
|
|
Jul 21 2011, 13:23
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE ПРИЛОЖЕНИЕ Б .... Руки бы отрывал за то, что крутят бездумно эти параметры. QUOTE Вы не дочитали описание: предлагается залезть в реестр Windows и отключить Delayed ACK. Дочитал. Фтопку. QUOTE Там сразу сказано, что это сделано для упрощения и экономии памяти. Это для оправдания рукожопия сделано  Или нежелания сделать красиво. QUOTE 25 Мбит\с
А по UDP - 80 Мбит\с Это не производительность. Нормальный стек дает более 80МБит на TCP.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 21 2011, 13:28
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 14-04-10
Пользователь №: 56 652

|
Цитата Кстати, если я правильно помню, uIP тоже допускает только один неподтверждённый пакет. Там сразу сказано, что это сделано для упрощения и экономии памяти. Здесь, видимо, что-то похожее. Если так не делать, то прийдется хранить все время в буффере все неподтвержденные пакеты, что увеличит объем использованной памяти во много раз. Штука полезная, но мне было проще отключить задержку ACK в WIN Цитата Дочитал. Фтопку. Никто ж не заставляет этот параметр менять) без него скорость падает(точно не помню), но предполагаю, что до 3-5 Мбит\с.
|
|
|
|
|
Jul 21 2011, 13:45
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE (scifi @ Jul 21 2011, 14:35)  Подозрительно: кода всего 600 строчек. А все RFC, имеющие отношение к TCP, потянут скорее на 600 страниц. Видимо, этот TCP работает только в очень особых случаях. Познавательно меряться размером выходного кода. У меня CODE 3 718 bytes of CODE memory Сделан под LPC17xx. Реализован достаточно близко к требованиям RFC; TCP, ICMP, UDP, ARP (упрощенный, без кэша); адекватно работает с отложенными ACK; Fast Retransmit штатно поддерживает только для передачи, можно прикрутить и для приема; практически работает в режиме zero-copy. Размер каждого TCP-сокета - 49 байт (ну ибо zero-copy). Программный интерфейс - не bsd-style, а событийный. Со скоростью там все в порядке
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 21 2011, 13:57
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 14-04-10
Пользователь №: 56 652

|
Цитата Не видать Fast Retransmit и вообще не ясно, как организована работа с подтверждениями и перепосылками. а что не ясно то? отсчет таймаутов идет с помощью systick таймера(описано в документации) по истечении заданного промежутка времени происходит перепосылка данных используя DMA контроллер МК, чтоб не отнимать время у приложения пользователя. Все по-моему логично
|
|
|
|
|
Jul 21 2011, 14:05
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE Если так не делать, то прийдется хранить все время в буффере все неподтвержденные пакеты, что увеличит объем использованной памяти во много раз. А не надо так делать. Надо генерировать пакеты по необходимости. У меня в стеке есть три callback'а для режима передачи SEND - сгенерить новых данных для передачи (не более стольки-то) и вернуть количество сгенеренных данных. REGENERATE - откатиться на точку последнего подтверждения ACK - переместить точку последнего подтверждения на сколько-то байт. CODE char *out; char *ack;
SEND(p,max) { len=max; memcpy(p,out,len); out+=len; return len; }
REGENERATE(p,max) { len=max; memcpy(p,ack,len); out=ack; return len; }
ACK(len) { ack+=len; } В начале out и ack указывают на начало буфера передачи. На самом деле в реальности там нет memcpy. Это псевдокод для иллюстрации. На самом деле там какой-то циклический буфер, или железка, или еще чего - например, http-сервер в виде машины состояний, который непосредственно печатает в p, а ack и out для него - не более чем состояние. QUOTE а что не ясно то? Да уже все ясно. Однопакетный стек. Тысячи их, uip впереди колонны шагает.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|