728x90
반응형

cli.c
0.00MB
srv.c
0.00MB

 

 

TCP Keepalive HOWTO (tldp.org)

 

TCP의 경우, connection oriented protocol이지만, 송수신 중, 상대방 프로세스가 종료되는 등 정상적인 상황이 아닌 경우에는 세션의 종료여부를 감지할 수 없다. 

다시말해, LAN 케이블이 뽑힌다든지, 기타 비정상적인 종료가 있을 경우, 상대측에서 감지할 수 없다는 것이다.

 

1. TCP_KEEPIDLE

- 연결 활성화 상태를 유지하는 시간

- The time(in seconds) the connection needs to remain idle before TCP starts sending keepalive probes.

flags = 10;
setsockopt(sfd, SOL_TCP, TCP_KEEPIDLE, (void *)&flags, sizeof(flags)));

 

2. TCP_KEEPCNT

- 연결을 종료하기 전에 연결 유효성을 검사하는 횟수

- The maximum number of keepalive probes TCP should send before dropping the connection.

flags = 5;
setsockopt(sfd, SOL_TCP, TCP_KEEPCNT, (void *)&flags, sizeof(flags))) 

 

3. TCP_KEEPINTVL

- The time (in seconds) between individual keepalive probes.
flags = 5;
setsockopt(sfd, SOL_TCP, TCP_KEEPINTVL, (void *)&flags, sizeof(flags)));

 

4. SO_KEEPALIVE

flags =1;
setsockopt(rfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&flags, sizeof(flags)))

SO_KEEPALIVE 옵션은 TCP 소켓에 적용된다. 이 옵션을 1로 설정하면 일정 시간(통상 2시간)동안 해당 소켓을 통해 어떤 자료도 송수신되지 않을 때, 커널에서 상대방의 상태를 확인하는 패킷을 전송한다. 이 패킷에 대해 상대방이 정상적이면 ACK 패킷을 전송한다.

  ACK 패킷으로 정상이라고 응답하는 경우 응용 프로그램에는 어떠한 통보도 하지 않고 커널 간의 확인만으로 상대방이 살아 있음을 확인하고 마무리한다. 상대방으로부터 아무런 응답이 없거나 RST 응답을 받으면 소켓을 자동으로 종료한다.

  기본적으로 SO_KEEPALIVE 옵션은 서버측 소켓에 설정되어 상대방 시스템의 고장이나 정전, 네트워크 연결이 끊기는 등 통신이 불가능한 상황을 탐지해 준다. 상대방 시스템이 고장난 경우 ETIMEOUT 오류를, 상대방 시스템까지 네트워크 연결이 불가능한 경우 EHOSTUNREACH 오류를 반환한다. 응용 프로그램에서는 해당 오류에 따라 처리하면 된다. 시스템이나 네트워크 문제가 아닌 응용 프로그램 문제라면 응용 프로그램이 종료될 때 상대방 커널에서 FIN 패킷을 보내 연결 종료를 시작하기 때문에 응용 프로그램에서는 EOF에 대한 처리를 하면 된다.

  만약 SO_KEEPALIVE 옵션이 설정되지 않은 상태에서 상대방 시스템이 고장이거나 네트워크 연결 등에 장시간 문제가 발생하면 응용 프로그램은 아무런 상황을 모른 체로 계속해서 상대방의 응답을 기다려야 하는 상황이 발생한다.

  SO_KEEPALIVE 옵션은 자료의 송수신이 일정 시간 동안 없을 경우 응용 프로그램이 아닌 커널에서 상대방의 상태를 파악하기 위해서 패킷을 보내는 옵션임을 알았다. 그런데 여기서 일정 시간은 보통 2시간 정도이고, 커널 변수로 관리된다. 따라서 커널 변수를 수정해서 시간을 조정할 수 있지만, 이런 경우 다른 모든 소켓에도 적용되기 때문에 전체 성능에 영향을 준다. 때문에 신중을 기해야 한다.

 

 

* test 결과

tcpdump

15:12:53.465155 IP (tos 0x0, ttl 128, id 31112, offset 0, flags [DF], proto TCP (6), length 52) 
    210.217.178.185.55596 > host117.cslistener: Flags [S], cksum 0x4158 (correct), seq 1438701007, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 ==> (SYN)
15:12:53.465179 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
    host117.cslistener > 210.217.178.185.55596: Flags [S.], cksum 0x0b09 (incorrect -> 0x5897), seq 567562173, ack 1438701008, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0 ==> (SYN ACK)
15:12:53.465849 IP (tos 0x0, ttl 128, id 31113, offset 0, flags [DF], proto TCP (6), length 40)
    210.217.178.185.55596 > host117.cslistener: Flags [.], cksum 0xeb65 (correct), seq 1, ack 1, win 8212, length 0 ==> (ACK)

15:13:03.467762 IP (tos 0x0, ttl 64, id 50768, offset 0, flags [DF], proto TCP (6), length 40)
    host117.cslistener > 210.217.178.185.55596: Flags [.], cksum 0x0afd (incorrect -> 0x0a96), seq 0, ack 1, win 229, length 0

TCP_KEEPIDLE defines the heartbeat frequency

This means the interval between the last data packet sent (simple ACKs are not considered data) and the first keepalive probe; after the connection is marked to need keepalive, this counter is not used any further

flags = 10; // 10 seconds
setsockopt(sfd, SOL_TCP, TCP_KEEPIDLE, (void *)&flags, sizeof(flags));

 

15:13:08.475715 IP (tos 0x0, ttl 64, id 50769, offset 0, flags [DF], proto TCP (6), length 40)
    host117.cslistener > 210.217.178.185.55596: Flags [.], cksum 0x0afd (incorrect -> 0x0a96), seq 0, ack 1, win 229, length 0
15:13:13.483723 IP (tos 0x0, ttl 64, id 50770, offset 0, flags [DF], proto TCP (6), length 40)
    host117.cslistener > 210.217.178.185.55596: Flags [.], cksum 0x0afd (incorrect -> 0x0a96), seq 0, ack 1, win 229, length 0
15:13:18.492715 IP (tos 0x0, ttl 64, id 50771, offset 0, flags [DF], proto TCP (6), length 40)
    host117.cslistener > 210.217.178.185.55596: Flags [.], cksum 0x0afd (incorrect -> 0x0a96), seq 0, ack 1, win 229, length 0
15:13:23.499762 IP (tos 0x0, ttl 64, id 50772, offset 0, flags [DF], proto TCP (6), length 40)
    host117.cslistener > 210.217.178.185.55596: Flags [.], cksum 0x0afd (incorrect -> 0x0a96), seq 0, ack 1, win 229, length 0
15:13:28.507734 IP (tos 0x0, ttl 64, id 50773, offset 0, flags [DF], proto TCP (6), length 40)
    host117.cslistener > 210.217.178.185.55596: Flags [R.], cksum 0x0afd (incorrect -> 0x0a91), seq 1, ack 1, win 229, length 0

TCP_KEEPINTVL defines the heartbeat frequency when there is no answer from the other side;

TCP_KEEPCNT dictates how many unanswered heartbeat will indicate a dropped connection;

flags = 5;
setsockopt(sfd, SOL_TCP, TCP_KEEPCNT, (void *)&flags, sizeof(flags));
flags = 5;
setsockopt(sfd, SOL_TCP, TCP_KEEPINTVL, (void *)&flags, sizeof(flags));

 

결론: [15:13:28] read() ends

 

Holmes He

 

setsockopt, SO_KEEPALIVE and Heartbeats

There are two end purposes for sending heartbeats through a persistent connection. For a back-end application, heartbeats are generally used to detect an absent client, so as to drop a connection and

holmeshe.me

 

728x90
반응형
728x90
반응형

목이아파 병원에 왔다.

일자목 거북목 그게 뭔데 어쩌라고 하면서 살아온 댓가인가?

너무 아프다.

mri 촬영을 해야하는데 가격이 마침 25만원이란다.

실비처리로 받을수 있는지 모르겠다.

좋은 실비보험 하나 들어놓을걸..

그냥 싼걸로 아무거나 선택해서 들어놓은 실비보험이 효자노릇을 해줄지 모르겠다.

부디 목디스크가 아니길..

목디스크여도 수술까지는 가지않아야한다. 

mri찍는데 20분이나 걸린다고 한다. 처음 알았다.

어쨌든 미국이 아닌걸 감사해야하나?

어쨌든 수술만은 피하길 간절히 기도하면서 mri 촬영을 기다려본다

728x90
반응형
728x90
반응형

1. 지방소득세

지방자치단체의 구성원인 주민을 대상으로 과세되는 지방세로 소득의 크기에 따라 과세되는 소득분(특별징수,종합소득세분,양도소득세분,법인세분)으로 구분됩니다.

 

2. 특별징수하는 지방소득세

그 과세표준이 되는 소득에 대하여 소득세, 법인세를 원천징수하는 때 

* 원천징수: 소득이나 수익을 지급하는 쪽에서 세금의 일부를 거두어들이는 방법

 

3. 지방소비세

지방소비세는 지방재정 확충의 일환으로 국세인 부가가치세액의 5%를 지방세로 이양

 

4. 납세의무자

납세의무자란 지방세법에 따라 지방세를 납부할 의무가 있는자

 

5. 납세자

납세자란 납세의무자(연대납세의무자와 제2차 납세의무자 및 보증인을 포함)와 지방세를 특별징수하여 납부할 의무를 지니는자를 말한다.

 

6. 교부청구란

관세관청이 체납자의 재산을 압류 등을 하기 전에 다른 기관에서 체납처분, 강제집행을 하는 경우 체납자 재산 환가대금에 대하여 배당을 받기 위하여 교부를 청구하는 것

 

7. 법정기일

부가세나 소득세처럼 신고로서 납세의무가 확정되는 경우에는 납세자의 신고일을 법정기일로 보아 국세 우선권을 적용한다. 

728x90
반응형

+ Recent posts