TCP Keep-Alive 퀵 정리

[TCP keep-alive]

TCP KEEP-ALIVE는 옵션으로써 컨셉은 심플 합니다.
A – B가 서로 Connection이 Establish된 상태에서 (3-handshake)
지정된 시간(OS 설정 값 또는 어플리케이션 설정) 동안 서로
패킷 교환(Exchange)이 없을경우 payload가 없는 probe(프로토스 유닛 아님) 패킷을
보냅니다.
만약 정상일 경우 connection을 유지하고, 그렇지 않을 경우는 장애로
판단해서 본인 Connection도 close 합니다.

그러면 Keep-Alive를 어떨때 사용하면 좋냐면..

1. Checking for dead peers

A – B가 연결된 경우 B시스템이 장애로 인해서 restart 될 경우
A의 keep-alive 설정에 의해서 probe 패킷을 보내면
B는 RST(Reset)을 응답 합니다.

이럴 경우 B 시스템의 커넥션이 끊겼다는 것을 감지 할 수 있습니다.

※ TCP 프로토콜 자체에서 장애 감지가 없기 때문에 Keepalive 옵션을
통해서 감지

2. Preventing disconnection due to network inactivity

만약
A -> NAT -> B 일경우

NAT 또는 Proxy 서버는 커넥션들을 메모리에 캐싱하고 있음.
즉 제한된 사이즈만큼 queuing을 하는데
정책이 inactive된 것들 중에서 가장 오래된 커넥션을 지음.

이런 현상은 주로 A,B 서버는 이상이 없는데 요청이
많을 경우 커넥션이 자꾸 끊기는 경우 발생.

그래서 keep-alive를 통해서 inactive된 커넥션을
queue에 밀리지 않도록 상단으로 올려주는 효과를 통해서
disconnection을 방지

※ 주의사항 지나친 keep-alive의 남발은 주기적으로 probe 데이터를
보내기 때문에 network에 불필요한 traffic를 유발함

 

그렇다면 HTTP Keep-Alive는 ?

일단 결론적으로 말하면 TCP-KeepAlive 와 HTTP-KeepAlive는 전혀
다름.

TCP는 OS에 제어, HTTP 어플리케이션(웹 서버) 제어.

HTTP-KeepAlive는 HTTP/1.1 스펙 하지만 사실 클라이언트에서
하는게 없고 다 서버에서 담당.

쿨라이언트-서버가 주어진 시간에 요청이 계속 들어 오면
커넥션 연장 만약 그렇지 않을 경우 서버에서 커넥션을 끊음.

이런 이유는 매번 커넥션을 생성하면 성능이 떨어지기 때문

서버에서 설정하면 클라이언트 해더에 아래와 같이 표시됨

Keep-Alive: timeout=5, max=100
Connection: Keep-Alive

두번 요청 하면

Keep-Alive: timeout=5, max=99
Connection: Keep-Alive

timeout : 단위는 초 즉 커넥션 유지 시간 5초
max는 : 위에서 보면 최초 100에서 두번째는 -1된 99. 즉, 아무리 keep-alive로 유지를 한다고
해도 허가된 요청수. 해당 요청수가 넘으면 reconnect

여기까지 오늘 정리한 내용 입니다.

혹시 보완해야 할 사항 또는 의견있으시면
please ~~ 댓글요🙂

참고 자료

http://pungjoo.tistory.com/2
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
http://blog.aff.kr/383

 

Published by: beyondj2ee

Past SI AA, now I am pikicast developer in yellow mobile and daddy, Java, Spring, OpenSource, Application Architect :) Java Application Architect. mail : beyondj2ee@gmail.com twitter : twitter.com/beyondj2ee facebook : https:www.facebook.com/beyondj2ee blog: http:beyondj2ee.wordpress.com

Categories Uncategorized댓글 남기기

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중