Глюки в прокси time_wait и Established
От: alexora  
Дата: 16.06.03 13:57
Оценка:
Я пишу типа обратного прокси. Работает на ура. Но на самом серваке при $netstat -na, оно вываливает что есть 2 потока как Established и 8 Time_wait. Я не могу вдуплить какого у меня тут time_wait появляется. Вроде как только accept возвращает сокет, я сразу создаю поток, считываю с него и закрываю.
Может кто то подскажет почему time_wait появляются и отчего.



Заранее благодарен.

Вот куски кода :
...
///////////////////////////жду подключение/////////////////////////

while((client_socket=accept(mysocket, (sockaddr *) &client_addr, &client_addr_size)))
{
error = UpdateParams();
HOSTENT *hst;
hst=gethostbyaddr((char *) &client_addr.sin_addr.s_addr,4,AF_INET);
DWORD thID;
/////////////////////////создаю поток, передав сокет///////////////
CreateThread(NULL,NULL,SexToClient,&client_socket,NULL,&thID);
}

...

///////////////////////////////функция которая по сокету, которій принимает accept, обрабатывает запрос///////
DWORD WINAPI SexToClient(LPVOID client_socket)
{
SOCKET my_sock;
my_sock=((SOCKET *) client_socket)[0];
char buff[20*1024];
int bytes_recv;
while((bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0)) && (bytes_recv != SOCKET_ERROR))
{
SOCKET server_sock;
server_sock=socket(AF_INET,SOCK_STREAM,0);
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORTREDIRECT);
HOSTENT *hst;
if (inet_addr(SERVERADDR)!=INADDR_NONE) dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
else
if (hst=gethostbyname(SERVERADDR))
((unsigned long *)&dest_addr.sin_addr)[0]=((unsigned long **)hst->h_addr_list)[0][0];
else
{
closesocket(server_sock);
WSACleanup();
return -1;
}
if (connect(server_sock,(sockaddr *)&dest_addr,sizeof(dest_addr))) return -1;
send(server_sock,&buff[0],bytes_recv,0);
long bytes_servget;
while((bytes_servget=recv(server_sock,&buff[0],sizeof(buff),0)) && (bytes_servget != SOCKET_ERROR))
{
send(my_sock,&buff[0],bytes_servget,0);
}
}
closesocket(my_sock);
return 0;
}
Re: Глюки в прокси time_wait и Established
От: clairbee Россия http://clairbee.void.ru/
Дата: 16.06.03 19:10
Оценка:
Здравствуйте, alexora, Вы писали:

A>Может кто то подскажет почему time_wait появляются и отчего.

От того, что ты первый закрываешь соединение.
Плата за спокойствие.

ЗЫ: Все подробно описано в RFC по TCP.
--
Роман И. Кузьменко (http://clairbee.void.ru/) (mailto:kuz@pisem.net)
Re[2]: Глюки в прокси time_wait и Established
От: alexora  
Дата: 16.06.03 20:45
Оценка:
Здравствуйте, clairbee, Вы писали:

C>Здравствуйте, alexora, Вы писали:


A>>Может кто то подскажет почему time_wait появляются и отчего.

C>От того, что ты первый закрываешь соединение.

тоесть "первый закрываю соединение" ?

можешь указать где именно глюк ?

Заранее благодарен
Re[3]: Глюки в прокси time_wait и Established
От: clairbee Россия http://clairbee.void.ru/
Дата: 16.06.03 20:48
Оценка:
Здравствуйте, alexora, Вы писали:

A>тоесть "первый закрываю соединение" ?

A>можешь указать где именно глюк ?

Кто первый закрыл соединение?
Ты, или твой peer?
Либо глюка нет (т.е. если time_wait не мешает (8 сокетов — не проблема)),
либо в дизайне системы.
--
Роман И. Кузьменко (http://clairbee.void.ru/) (mailto:kuz@pisem.net)
Re[2]: Глюки в прокси time_wait и Established
От: alexora  
Дата: 16.06.03 20:52
Оценка:
То что я кинул в первой месаги, то это старое было. Я чуть лоханулся
Вот самое последнее :
Тут я все правильно закрываю
////////////////////////////////
closesocket(my_sock); <- это закрывает клиента
closesocket(server_sock); <- это сокет
//////////////////////////////////



DWORD WINAPI SexToClient(LPVOID client_socket)
{
SOCKET my_sock;
my_sock=((SOCKET *) client_socket)[0];

char buff[1000000];
long bytes_recv;

while((bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0)) && (bytes_recv != SOCKET_ERROR))
{
SOCKET server_sock;
server_sock=socket(AF_INET,SOCK_STREAM,0);
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORTREDIRECT);
HOSTENT *hst;
if (inet_addr(SERVERADDR)!=INADDR_NONE) dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
else
if (hst=gethostbyname(SERVERADDR))
((unsigned long *)&dest_addr.sin_addr)[0]=((unsigned long **)hst->h_addr_list)[0][0];
else
{
closesocket(server_sock);
WSACleanup();
return -1;
}
if (connect(server_sock,(sockaddr *)&dest_addr,sizeof(dest_addr))) return -1;
send(server_sock,&buff[0],bytes_recv,0);
long bytes_servget;
while((bytes_servget=recv(server_sock,&buff[0],sizeof(buff),0)) && (bytes_servget != SOCKET_ERROR))
{
send(my_sock,&buff[0],bytes_servget,0);
}
closesocket(server_sock);
}
closesocket(my_sock);
return 0;
}
Re: Глюки в прокси time_wait и Established
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 16.06.03 20:54
Оценка:
Здравствуйте, alexora, Вы писали:

A>Я пишу типа обратного прокси. Работает на ура. Но на самом серваке при $netstat -na, оно вываливает что есть 2 потока как Established и 8 Time_wait. Я не могу вдуплить какого у меня тут time_wait появляется. Вроде как только accept возвращает сокет, я сразу создаю поток, считываю с него и закрываю.

A>Может кто то подскажет почему time_wait появляются и отчего.


Если я не сильно ошибаюсь, то система просто держит некоторое время дескриптор сокета со статусом TIME_WAIT. Сильно подозреваю, что это сделано, исходя из таких возможных соображений, как повышение общего быстродействие сокетной подсистемы (чтобы лишний раз не выполнять служебный код по выделению системных ресурсов, связанных с сокетом). Т.е. — так и должно быть... Если не ошибаюсь. В противном случае меня аргументированно поправят...
Re[2]: Глюки в прокси time_wait и Established
От: alexora  
Дата: 16.06.03 20:57
Оценка:
так на один такой time_wait 2 метра ОЗУ уходит
что то надо делать
еще идеи есть ?
Re[2]: Глюки в прокси time_wait и Established
От: Sashko Россия http://www.dc.baika.ru/
Дата: 17.06.03 03:05
Оценка:
> Сильно подозреваю, что это сделано, исходя из таких возможных соображений, как повышение общего быстродействие сокетной подсистемы (чтобы лишний раз не выполнять служебный код по выделению системных ресурсов, связанных с сокетом). Т.е. — так и должно быть... Если не ошибаюсь. В противном случае меня аргументированно поправят...

Не совсем так. 2MSL (Maximum Segment Lifetime) система держит сокет в состоянии TIME_WAIT в целях безопасности.

http://www.rsdn.ru/Forum/?mid=128392
Автор: Sashko
Дата: 11.11.02


Как происходит закрытие. Инициирующая закрытие сторона шлет FIN (A), после чего ждет ACK (A) на свой FIN (A) и так же ждет FIN (B) от peer'а. Peer получив FIN (A) отсылает ACK (A) на этот FIN (A), ждет close от application после чего шлет свой FIN (B) и дождавшись ACK (B) на свой FIN (B) спокойно уходит (происходит разрушение TCB структуры, то есть система полностью забывает про это соединение), так как он уверен, что другая сторона, получала от него и ACK (A) и FIN (B). Но вот у стороны инициировавшей закрытие, нет уверенности в том, что ее ACK (B) на FIN (B) peer'а дошел до peer'a (так как нет подтверждения на подтверждение, а если б оно было, то потом бы понадобилось подтверждение на подтверждение на подтверждение, и т.д., есть задачка, про два отряда, которые расположены за холмами и должны атаковать в одно время, для связи у них есть голуби, которые они шлют друг другу через холм, вопрос в том, сколько нужно послать голубей что б договориться об одновременной атаке). Поэтому, TCB переходит в состояние TIME_WAIT и ждет здесь 2MSL. Дело в том, что, если бы так не работал TCP, существовала бы вероятность, подхватить, не закрывшееся соединение, что может привести к некорректной дальнейшей работе.

А вообще про TIME_WAIT в этой группе так много писалось, что думаю этот вопрос можно выносить в разряд вопросов по C++, типа "Вот это да, i += ++i + i++;".

Резюме: RFC793, там все очень популярно, со схемами и пояснениями, думаю на много понятней, чем я здесь пытался объяснить.
Posted via RSDN NNTP Server 1.6 beta
Re[3]: Глюки в прокси time_wait и Established
От: Sashko Россия http://www.dc.baika.ru/
Дата: 17.06.03 03:09
Оценка:
> так на один такой time_wait 2 метра ОЗУ уходит

Каким образом ты это установил?
Posted via RSDN NNTP Server 1.6 beta
Re[2]: Глюки в прокси time_wait и Established
От: clairbee Россия http://clairbee.void.ru/
Дата: 17.06.03 06:16
Оценка:
Здравствуйте, Flamer, Вы писали:

F>Если я не сильно ошибаюсь, то система просто держит некоторое время дескриптор сокета со статусом TIME_WAIT. Сильно подозреваю, что это сделано, исходя из таких возможных соображений, как повышение общего быстродействие сокетной подсистемы (чтобы лишний раз не выполнять служебный код по выделению системных ресурсов, связанных с сокетом). Т.е. — так и должно быть... Если не ошибаюсь. В противном случае меня аргументированно поправят...


Хех,
из таких соображений она держит состояние CLOSED.

А TIME_WAIT, как я и говорил тут раньше, держит та сторона соединения, которая инициировала соединение.
Типа она послала FIN(+ACK) и ждет в ответ FIN и ACK, + еще немного ждет, чтобы ее подтверждение peer'ного FIN'а стопудово дошло.

Блин, ну че тут рассказывать...
RFC по TCP.
--
Роман И. Кузьменко (http://clairbee.void.ru/) (mailto:kuz@pisem.net)
Re[3]: Глюки в прокси time_wait и Established
От: alexora  
Дата: 17.06.03 06:34
Оценка: -1
Здравствуйте, clairbee,

Я там код выше кинул
Там все нормально и вовремя закрывается.
А вот какого х... WAIT появляется пока никто не знает
Re[4]: Глюки в прокси time_wait и Established
От: clairbee Россия http://clairbee.void.ru/
Дата: 17.06.03 07:59
Оценка: +1
Здравствуйте, alexora, Вы писали:

A>Там все нормально и вовремя закрывается.

Да!

A>А вот какого х... WAIT появляется пока никто не знает

Я знаю!
И уже не раз все сказали: __так и должно быть__!!!
Хочешь знать почему?
Прочти пост Sashko от 17.06 07:05 и/или RFC по TCP.
--
Роман И. Кузьменко (http://clairbee.void.ru/) (mailto:kuz@pisem.net)
Re: Глюки в прокси time_wait и Established
От: Vamp Россия  
Дата: 17.06.03 08:07
Оценка:
К Доктору — то есть Снайдеру. Эффективное программирование TCP/IP. Там ответы на все вопросы.
Да здравствует мыло душистое и веревка пушистая.
Re: Глюки в прокси time_wait и Established
От: alexora  
Дата: 18.06.03 13:29
Оценка: -1
Я вставил setsockopt(server_sock,SOL_SOCKET,SO_REUSEADDR ,(char *)&wait, sizeof(wait)) и оно все равно создает кучу wait
вот последний код :

DWORD WINAPI SexToClient(LPVOID client_socket)
{
SOCKET my_sock;
my_sock=((SOCKET *) client_socket)[0];

char buff[1000000];
long bytes_recv;

while((bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0)) && (bytes_recv != SOCKET_ERROR))
{
SOCKET server_sock;
server_sock=socket(AF_INET,SOCK_STREAM,0);


void* wait;
if (setsockopt(server_sock,SOL_SOCKET,SO_REUSEADDR ,(char *)&wait, sizeof(wait)))
{
::MessageBox(hWnd,"setsockopt error","setsockopt error",MB_OK);
}

sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORTREDIRECT);
HOSTENT *hst;
if (inet_addr(SERVERADDR)!=INADDR_NONE) dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
else
if (hst=gethostbyname(SERVERADDR))
((unsigned long *)&dest_addr.sin_addr)[0]=((unsigned long **)hst->h_addr_list)[0][0];
else
{
closesocket(server_sock);
WSACleanup();
return -1;
}
if (connect(server_sock,(sockaddr *)&dest_addr,sizeof(dest_addr))) return -1;
send(server_sock,&buff[0],bytes_recv,0);
long bytes_servget;
while((bytes_servget=recv(server_sock,&buff[0],sizeof(buff),0)) && (bytes_servget != SOCKET_ERROR))
{
send(my_sock,&buff[0],bytes_servget,0);
}
closesocket(server_sock);
}
closesocket(my_sock);
return 0;
}



может буфер надо делать поменьше ?
кто небудь сталкивался с даной проблемой ?
мли оно так и должно работать ?
Re[2]: Глюки в прокси time_wait и Established
От: Sashko Россия http://www.dc.baika.ru/
Дата: 19.06.03 00:39
Оценка:
> Я вставил setsockopt(server_sock,SOL_SOCKET,SO_REUSEADDR ,(char *)&wait, sizeof(wait)) и оно все равно создает кучу wait
> вот последний код :

Либо ты нас совершенно не слушаешь, либо издеваешься.

PS: Код не смотрел, но хотел порекомендовать пользоваться тегами [code], [ccode], может тогда у кого-то будет больше желание его посмотреть.
Posted via RSDN NNTP Server 1.6 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.