CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): whbear (서병국)
날 짜 (Date): 2002년 3월 29일 금요일 오후 11시 19분 01초
제 목(Title): [Q] TCP/IP flow


TCP/IP 에 대한 질문입니다.

클라이언트 및 서버의 OS는 Solaris 2.6 입니다.

Client/Server간의 네트웍에서 다음과 같은 에러가 발생해서 여쭙니다.
다음은 C/S 간의 flow 입니다.

(연결 시작)
....
1. S->C D=1186 S=4511 ACK=7429 Seq=6991 Len=208, Win=64240
2. C->S D=4511 S=1186 ACK=7199 Seq=7429 Len=0 Win=64240
....
C가 다른 곳과 교신하느라 S와는 약 1분 30초간 쉰 뒤 다시 데이타 
전송하려 함.
....
3. C->S D=4511 S=1186 SYN Seq=21030 Len=0 Win=64240
4. S->C D=1186 S=4511 ACK=7429 Len=0 Win=64240
5. C->S D=4511 S=1186 SYN Seq=21030 Len=0 Win=64240
6. S->C D=1186 S=4511 ACK=7429 Len=0 Win=64240
6. C->S D=4511 S=1186 RST Win=0
... 

1-2를 통해 1차적인 C/S간의 데이타 교환은 끝납니다. 
이후 C는 다른 곳과 네트웍 통신 이후 그곳에서 받은 데이타를 S에 전달하려 
3. 시점에서 무언가 해야 하지만 엉뚱하게 'SYN'이 발송 됩니다.
4.에서 서버는 3에 대한 reply가 아닌 2.번의 Seq 번호에 대한 ACK을 날리구요.
이 어긋남이 서로 계속 반복되다가 끝내 클라이언트는 RST를 날리고 죽지만 
서버는
또 그것을 이해못해 계속 세션을 살리는 상태가 됩니다.

결과적으로 서버는 idle한 ESTABLISHED되어 있는 세션을 많이 유지함으로써 
자원 낭비를 하고 있는 점이 문제 입니다.

궁금한 점은:
1. 'SYN'은 초기 연결 맺을 때 3-handshaking에서만 사용되는 것 아닌가요?
   C가 3단계에서 연결을 다시 맺으려 하는 것도 아니면서(소스 포트가 
   이전과 동일합니다.) SYN을 왜 날리는지 모르겠습니다.
   이런 것이 TCP/IP 가능하다면 어떤 식으로 coding하면 가능한 일일까요?
   
2.  서버의  setsockopt에 TCP_KEEPALIVE 를 주면 클라이언트가 어떤 미친짓을 
    해도 저런 idle한 session은 생기지 않을런지.
    ndd에 tcp_keepalive_interval이 있던데 그걸 이용하면 굳이 소프트웨어에 
    손을 대지 않아도 동일한 효과를 얻을 수 있을까요?
    
3.  동일한 서버에 접속하는 다른 회사의 클라이언트는 문제가 생기지 않는다고 
    해서 그 쪽 flow를 봤더니 window size가 하나같이 다 8760이더군요. 
    이쪽 것은 64240인데. 이런 것도 관련이 있을 수 있을까요?
    
    만일 window size를 변경하려 한다면... 으... ndd parameter는 아무리 
    봐도 감이 안오고,    setsockopt에서 SO_RECVBUF를 변경하면 될 것 같은데. 
    이 값이 웃기게도    optval=1460 으로 하면 실제로는 5840, optval=1460*5 
    하면 실제로 8760이 되는데    이유를 모르겠네요.

    
도움 좀 주세요~   


[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.