2008년 10월 7일 화요일

SO_KEEPALIVE tcp 연결유지

http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/

tcp 연결의 경우 접속이 끊어진걸 알지 못하는 경우가 있다. 특히나 트래픽이 적은 경우 문제가 된다. 이런 문제때문에 접속유지용으로 별 의미없는 내용을 주고 받는 식으로 구현을 해왔는데 (heartbeat/ping) 마침 시간이 나서 SO_KEEPALIVE 문서를 읽어봤다....

...읽어보고 그냥 지금까지 하던대로 핑퐁 주고받는식으로 짜기로 했지만 읽어둔것 대강 정리만 해둔다.

  • SO_KEEPALIVE 옵션을 켜두면 적절한 시간마다 0 length data 에 ACK 를 켜서 쏜다. 상대방은 굳이 KEEPALIVE 지원이 필요 없다. 길이가 0 라서 스트림식으로 도는 tcp 코드는 수정이 필요없다. 완존 투명.
  • 이때 사용되는 커널변수들은 세가지로 모두 /proc/sys/net/ipv4/ 에서 확인가능
    • tcp_keepalive_time
    • tcp_keepalive_intvl
    • tcp_keepalive_probes
  • 시스템레벨에서 위값을 바꾸는 방법도 소개되어있는데 이건 내 관심밖
  • 프로그램레벨에서 바꿔주려면 setsockopt 로 SOL_TCP 레벨에서 아래 세값이 각각 위의 값에 대응한다.(참고로 SO_KEEPALIVE 는 SOL_SOCKET 레벨이지. 사실 SOL_TCP 레벨값을 수정해본적은 지금껏 없었다..)
    • TCP_KEEPIDLE
    • TCP_KEEPINTVL
    • TCP_KEEPCNT
  • 문서상에서는 위 세가지 값이 시스템전체를 바꾸는게 아니고 해당 소켓에만 적용된다고 한다. 좋군. 그런데 이게 리눅스 외의 다른 OS 들에서도 사용할수 있는 방법인지 확인해보지는 못했다. 만약 이방법을 쓰고자 한다면 반드시 확인해봐야겠지.
  • 코드수정이 어려운경우엔 libkeepalive 라는걸 사용하는 방법도 있다.

SO_KEEPALIVE 를 쓰지 않기로 한 이유는.. ping/pong 구조 구현이 그다지 어렵지 않고 후에 필요하다면 서버쪽에서만 SO_KEEPALIVE 구현을 추가할수 있기 때문에 ping 방식이 문제가 생기더라도 투명하게 수정이 가능하다는점때문.


2009/02/13 추가.
결국 오늘 KEEPALIVE 구현을 추가했다.
SOL_TCP 값이 inet/tcp.h 에 들어있더라.






댓글 1개:

김태정 on Voiceportal :

trackback from: [linux/java]top 결과값 받아오기
리눅스 상에서 top를 실행하면 일정한 주기로 refresh된다. top을 실행한 후에 이를 다른 프로그램으로 보내주거나 파일로 저장하기 위해서 옵션을 넣어주면 된다. 먼저 man top를 해보자. 중요하게 봐두어야 할 것은 다음 두 옵션이다. -b : Batch mode operation Starts top in ’Batch mode’, which could be useful for sending output from top to other pro..