일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 안드로이드 웹뷰
- 하이퍼레저 패브릭
- Golang
- Play2
- 스칼라
- 파이썬
- play2 강좌
- 파이썬 데이터분석
- 이더리움
- hyperledger fabric
- Actor
- 주키퍼
- 플레이프레임워크
- 스위프트
- Akka
- 파이썬 동시성
- CORDA
- 블록체인
- 스칼라 강좌
- Adapter 패턴
- Hyperledger fabric gossip protocol
- play 강좌
- 하이브리드앱
- 파이썬 머신러닝
- 그라파나
- 스칼라 동시성
- Play2 로 웹 개발
- 파이썬 강좌
- akka 강좌
- 엔터프라이즈 블록체인
- Today
- Total
HAMA 블로그
keepalive 란? 본문
1. TCP/IP 에서의 Keepalive
- 옵션이므로 설정여부는 상황에 따라 다르다.
- TCP keepalive는 setsockopt()을 사용하여 소켓 옵션(SO_KEEPALIVE)을 설정하면 사용할 수 있게 됩니다.
- 소켓 옵션이 설정되면 tcp_keepalive_interval로 지정된 시간 동안 연결이 유휴 상태가 되었을 때 keepalive 탐색 패킷을 보냅니다.
- 두 지점간에 상대방의 안부를 묻기위해 payload 가 없는 패킷을 주기적으로 보내는것이다. (지정된 시간동안 서로 패킷교환이 없을 경우에 )
- 그 패킷에 반응이 없으면 접속을 끊는다.
- NAS 같은것은 중간에서 두 지점사이에 데이타 교환이 없으면 , 큐의 오래된쪽으로 이동시켜 놓는데 (결국 임의로 삭제하면 , 두 지점의 연결이
갑자기 끊김) Keepalive 옵션을 통해서 꾸준히 유지중이라고 NAS 에게 알려주는 장점이 있다.
- keepalive를 사용하는 주된 이유는 종단 시스템 중의 하나가 다운될 때 발생할 수 있는 한쪽만 열린 연결 상태를 정리하는 것입니다.
2. HTTP 에서의 Keepalive
- http 는 특성상 커넥션을 유지하지 않습니다.
- 하지만 keepalive 를 설정하면 유지하게 됩니다.
- KeepAliveTimeout 5 하면 5 초동안 유지됩니다.
- 서버는 연결을 맺을수있는 소켓을 생성하는데 한계가 있습니다.
- 따라서 연결을 오래 유지하면 , 다른 사람들이 연결을 못하게됩니다.
- 하지만 사람들이 적게 접속한다면, 소수의 사람이 빠르게 인터넷을 사용할수있습니다. (리소스를 얻기위해 재 접속이 필요없으니)
- 마찬가지로 서버의 메모리 용량이 무지 크다면, KeepAlive 설정을 해줘도 넉넉한 커넥션을 맺을수 있겠지요.
- 너무 오래 놔둘 필요는 없고 2~5초 정도면 충분할듯합니다.
3. 소켓 timeout 이란
첫째, Connection 에서의 타임아웃
=> 연결시도를 설정한 타임아웃까지는 해봐라~ 설정시간이 지나면 그냥 포기해~ 그게 편해~~
둘째. read/write 에서의 타임아웃
=> 한쪽이 먼일이 생기거나, 랜선이 빠졌는데도 불구하고 오매불망 기다리고있을순 없잖아. |
타임아웃 시간까지만 기다리고 , 그만 잊고 새 색시 찾으러 가야지~
소켓 옵션이 설정되면 tcp_keepalive_interval로 지정된 시간 동안 연결이 유휴 상태가 되었을 때 keepalive 탐색 패킷을 보냅니다.
응답 메시지가 수신될 때까지 또는 tcp_ip_abort_interval로 지정된 시간이 다 경과할 때까지 탐색 패킷을 보냅니다. 응답은 연결 상대측을 지연시키는 요소의 영향을 받습니다. 연결 상대측이 연결을 닫거나 다시 부팅을 하면 응답 메시지는 RST(reset packet)가 됩니다. 수신 주소에 도달할 수 없다는 ICMP 메시지를 수신하게 될 가능성도 있습니다. 라우터가 고장나거나 케이블 연결이 끊긴 경우에 그런 상황이 발생합니다. 그 외에도 많은 가능한 상황이 있습니다. 탐색 패킷 자체는 tcp_rexmit_interval로 지정된 간격으로 보내집니다.
keepalive를 15분 미만으로 설정해서는 안된다고 제안하는 이유 중의 하나는 바로 이것입니다. 그렇게 설정하면 TCP가 장애를 일으킬 가능성이 다분히 있습니다. tcp_rexmit_interval의 값은 3초로 기본 설정됩니다. 20초 정도로 높게 설정할 수도 있습니다. 그런데, tcp_keepalive_interval을 tcp_rexmit_interval 보다 작은 값으로 줄이면, 재전송하기 전에 keepalive 탐색 패킷을 보낼 것입니다. 하지만, 네트워크가 느리거나 팻 상태가 되면 재전송이 매우 중요합니다. 어쩌면 통신 상대측 시스템이 느려서 아직 응답하지 않은 것일 수도 있습니다. 재전송을 보내는 이유가 바로 이것입니다. 이것은 누군가에게 조금 전에 내가 한 말을 들었느냐고 묻는 것과 같습니다. 상대방이 없다고 판단되면 대화를 미리 중단하거나 상대방이 있는지 알아 보려고 시간을 낭비하게 될 것입니다. 상대측이 여전히 대화에 참여하고 있다면 그에게 직접 조금 전에 내가 한 말을 들었느냐고 다시 묻게 될 것입니다. 이렇게 되면 네트워크가 팻 상태가 됩니다. 네트워크가 팻 상태가 되면 될수록 제대로 작동이 되려면 재전송을 더 많이 해야 합니다. 그렇게 하여 TCP가 장애를 일으키게 됩니다.
레퍼런스:
http://egloos.zum.com/munhwan/v/1006786
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/Sockettimeout
'Network' 카테고리의 다른 글
Half close socket 이란 (0) | 2015.09.07 |
---|---|
SSH 터널링 상세이론 (0) | 2015.07.14 |
홀펀칭 기초 (0) | 2015.07.14 |
와이파이로 기기간 연결 강화한다 (0) | 2015.06.11 |
모바일기기 wifi의 ip주소를 수동으로 설정하기 (0) | 2015.06.11 |