| [ CnUnix ] in KIDS 글 쓴 이(By): terzeron (microkid) 날 짜 (Date): 2002년 3월 30일 토요일 오후 12시 03분 33초 제 목(Title): Re: [Q] TCP/IP flow 1. 'SYN'은 초기 연결 맺을 때 3-handshaking에서만 사용되는 것 아닌가요? C가 3단계에서 연결을 다시 맺으려 하는 것도 아니면서(소스 포트가 이전과 동일합니다.) SYN을 왜 날리는지 모르겠습니다. 이런 것이 TCP/IP 가능하다면 어떤 식으로 coding하면 가능한 일일까요? 대부분은 말씀하신 것처럼 open을 할 때, sender와 receiver가 각각 첫번째 세그먼트에 '난 지금 시작한다!'라는 의미로 SYN을 켜서 보냅니다. 이미 연결이 끊어진 상태에서 다시 같은 연결 정보(TAO 캐시같은)를 가지고 빠르게 재연결을 시도할 때에도 SYN을 쓸 수 있겠죠. 사실 TCP 구현마다 어떻게 쓰느냐에 달렸다고도 볼 수 있는데(응용이나 꽁수로 SYN을 사용) 아마 연결이 끊어져서 재연결을 하려는 게 아닌가 짐작될 따름입니다. 2. 서버의 setsockopt에 TCP_KEEPALIVE 를 주면 클라이언트가 어떤 미친짓을 해도 저런 idle한 session은 생기지 않을런지. ndd에 tcp_keepalive_interval이 있던데 그걸 이용하면 굳이 소프트웨어에 손을 대지 않아도 동일한 효과를 얻을 수 있을까요? 소켓에도 그런 옵션(SO_KEEPALIVE)이 있습니다만 이것은 통상 2시간 동안 데이터 교환이 없을 때에나 의미가 있습니다. 그리고 정말 idle한 session이 유지되도록 일부러 만들려고 할 때에 필요하겠죠. 3. 동일한 서버에 접속하는 다른 회사의 클라이언트는 문제가 생기지 않는다고 해서 그 쪽 flow를 봤더니 window size가 하나같이 다 8760이더군요. 이쪽 것은 64240인데. 이런 것도 관련이 있을 수 있을까요? 만일 window size를 변경하려 한다면... 으... ndd parameter는 아무리 봐도 감이 안오고, setsockopt에서 SO_RECVBUF를 변경하면 될 것 같은데. 이 값이 웃기게도 optval=1460 으로 하면 실제로는 5840, optval=1460*5 하면 실제로 8760이 되는데 이유를 모르겠네요. window size는 TCP가 동적으로 변화시킬 수 있기 때문에 다른 클라이언트와의 상태가 다르다고 문제가 될 것 같지는 않습니다. 물론 위의 windows-based platform에서의 버그는 다른 이야기지만요. SO_RCVBUF를 변경한다고 하더라도 커널이 가지고 있는 min, max값이 있을 것이므로 여기에 맞추겠죠. 이것도 커널의 구현에 따라 다를 수 있겠습니다. 결국 문제는 커널에서 비롯된 것이 아니라 소켓프로그래밍에 숨어있는 것이 아닐까 싶습니다. 커널을 의심하면 뭐 믿고 할 수 있는 게 없는 거죠. 게다가 유닉스 중에서도 상당히 '나이스'하고 '그레이스풀'한 솔라리스를 의심한다면야 더욱 더... ^^ 연결을 두 개 열어서 작업을 하시는 것 같은데, 두 연결을 위한 설정이나 데이터, 또는 함수 사용 방법에 문제가 있는 것 아닐까요? |