Перейти к содержанию
    

Как посчитать, сколько TCP соединений может быть и кто их открыл

Здравствуйте!

В одной задаче не хватило установки MEMP_NUM_TCP_PCB = 15, пришлось поставить 20. А сколько нужно и как понять кто их захватил? Только отладчиком и руками? или есть какие-то средства в LwIP?

 

Задачи у меня сейчас крутятся следующие:

1) FTP клиент, перекачивает кучу файлов (сейчас на один ftp) и туда и оттуда.

2) smtp клиент, пишет письма (на несколько ящиков)

 

Ну, есть еще и UDP-шные линки, но я так понимаю, в LwIP это четко разнесено, на каждый тип своя область блоков выделена в памяти

 

Так вот как-то внезапно кончился диван не хватило 15 выделенных блоков на эти задачи, я как-то даже растерялся. Это как-то в LwIP подается контролю, какая задача заняла TCP блок памяти?

И как-то можно во время работы контролировать, сколько блоков свободно? Надеюсь, что в LwIP есть какие-то средства для этого.

 

Вполне может быть, что и просто утечка где-то, старые соединения не закрываются корректно. Но вот увеличил с 15 до 20 и все стабильно работает уже пару часов, еще бы понять кто же столько берет и зачем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вполне может быть, что и просто утечка где-то, старые соединения не закрываются корректно. Но вот увеличил с 15 до 20 и все стабильно работает уже пару часов, еще бы понять кто же столько берет и зачем.

Если сети больше 2-х клиентов(контроллер и компьютер), то может другой компьютер(вирус?) попытаться создать коннект и LwIP его исправно создаст.

А вообще надо смотреть с помощью Wireshark или tcpdump кто присылает коннект и закрывается ли он корректно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если сети больше 2-х клиентов(контроллер и компьютер), то может другой компьютер(вирус?) попытаться создать коннект и LwIP его исправно создаст.

А вообще надо смотреть с помощью Wireshark или tcpdump кто присылает коннект и закрывается ли он корректно.

Извините, я не указал в условиях- это соединение через GPRS/3G модем. Посчитал несущественным, но в свете Вашей гипотезы это может быть очень важным дополнением к моему описанию проблемы.

 

Спасибо за идею, "больше двух клиентов" вполне возможно. Не запланированных мной а "паразитов".

Про "других гостей" я даже не подумал, отличная идея, я же на GSM это сейчас не контролирую.

Кстати, иногда на объектах вижу в логах, как кто-то стучится в telnet порт (через GSM), но полного логгирования по другим портам не веду, может и там непрошенные гости забегают.

 

Прямо сейчас не представляю как, но наверняка есть какие-то настройки в LwIP, позволяющие это ограничить. Я подозреваю, что это переменная MEMP_NUM_TCP_PCB_LISTEN, так у меня она равна 6.

 

 

Попробую повторить проблему на кабеле и с Wireshark. Прибор умеет и через модем и по LAN, но обнаружил проблему именно при работе через модем (штатно так и используем в большинстве применений). Кабель не пробовал, думал то же самое увижу.

 

Upd:

ниже добавил часть моего файла конфигурации LwIP (1.4.1), может что-то еще просто несимметрично настроено и поэтому проблема?

 

#define SYS_LIGHTWEIGHT_PROT    1

#define ETHARP_TRUST_IP_MAC     0
#define IP_REASSEMBLY           0
#define IP_FRAG                 0
#define ARP_QUEUEING            0

/**
* NO_SYS==1: Provides VERY minimal functionality. Otherwise,
* use lwIP facilities.
*/
#define NO_SYS                  0

/* ---------- Memory options ---------- */
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
  lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
  byte alignment -> define MEM_ALIGNMENT to 2. */
#define MEM_ALIGNMENT           4

/* MEM_SIZE: the size of the heap memory. If the application will send
a lot of data that needs to be copied, this should be set high. */
#define MEM_SIZE                (30*1024)	//(10*1024)

/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
  sends a lot of data out of ROM (or other static memory), this
  should be set high. */
#define MEMP_NUM_PBUF           10
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
  per active UDP "connection". */
#define MEMP_NUM_UDP_PCB        10
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
  connections. */
#define MEMP_NUM_TCP_PCB        25	//changed 20161209 to "25" for reserve ("20" was also working) "//changed 20161208 from not working "15" to working "20"	//20140205: 10
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
  connections. */
#define MEMP_NUM_TCP_PCB_LISTEN 6	//20140205: 5
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
  segments. */
#define MEMP_NUM_TCP_SEG        65	//20140205: 20
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
  timeouts. */
#define MEMP_NUM_SYS_TIMEOUT    10
#define MEMP_NUM_PPP_PCB 1

#define MEMP_NUM_NETCONN 25
/* ---------- Pbuf options ---------- */
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
#define PBUF_POOL_SIZE          25

/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
#define PBUF_POOL_BUFSIZE       LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN)



/* ---------- TCP options ---------- */
#define LWIP_TCP                1
#define TCP_TTL                 255

/* Controls if TCP should queue segments that arrive out of
  order. Define to 0 if your device is low on memory. */
#define TCP_QUEUE_OOSEQ         1

/* TCP Maximum segment size. */
#define TCP_MSS                 (1500 - 40)	  /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */

/* TCP sender buffer space (bytes). */
#define TCP_SND_BUF             (8*TCP_MSS)	//20140205: (5*TCP_MSS)

/*  TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
 as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */

#define TCP_SND_QUEUELEN        (8* TCP_SND_BUF/TCP_MSS) //20140205:	(4* TCP_SND_BUF/TCP_MSS)

/* TCP receive window. */
#define TCP_WND                 (4*TCP_MSS)	//20140205:	(2*TCP_MSS)


/* ---------- ICMP options ---------- */
#define LWIP_ICMP                       1

//#define LWIP_IGMP                       1

/* ---------- DHCP options ---------- */
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
  interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
  turning this on does currently not work. */
#define LWIP_DHCP               1


/* ---------- UDP options ---------- */
#define LWIP_UDP                1
#define UDP_TTL                 255

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, иногда на объектах вижу в логах, как кто-то стучится в telnet порт (через GSM), но полного логгирования по другим портам не веду, может и там непрошенные гости забегают.

Угу, они могут открыть соединение, что-нибудь прислать, а потом не послать FIN и висит это соединение, пока таймаут не кончится, вот здесь четко продемонстрировано. Но какой параметр LwIP за таймаут отвечает - не помню...

 

Если ваш прибор коннектится с удаленным компьютером, то наверное еще можно написать какой-нибудь ограничитель типа firewall - на приеме пакетов, когда идет разбор TCP, рубить левых по ip-адресу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Угу, они могут открыть соединение, что-нибудь прислать, а потом не послать FIN и висит это соединение, пока таймаут не кончится, вот здесь четко продемонстрировано. Но какой параметр LwIP за таймаут отвечает - не помню...

 

Если ваш прибор коннектится с удаленным компьютером, то наверное еще можно написать какой-нибудь ограничитель типа firewall - на приеме пакетов, когда идет разбор TCP, рубить левых по ip-адресу.

Большое спасибо! познавательно, буду копать и думать. Так как если внешние причины- то забивание всех коннектов только вопрос времени, тут количеством не решается.

А еще сложилось впечатление что в LwIP нет функции, которая ответит количество еще свободных коннектов, нужно свое писать. Хотя у меня версия старая(LwIP 1.4.1), может новая и имеет что-нибудь для этого.

Там есть хорошая идея в механизме выделения блока- если нет свободных, то пытается освободить самый старый с приоритетом меньше затребованного. Но вот что-то я не вижу как снаружи приоритеты выставлять, tcp_new() вообще не содержит аргумента приоритет, просто внутри нее жестко забито "tcp_alloc(TCP_PRIO_NORMAL)" и все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Таким макаром на какой-нибудь СТМ32 скоро антивирус ставить придется с файрволом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А еще сложилось впечатление что в LwIP нет функции, которая ответит количество еще свободных коннектов, нужно свое писать.

Сделать простой поиск по исходникам на сравнение с MEMP_NUM_TCP_PCB и получите переменную отвечающую за текущее количество соединений.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...