728x90
- 주소의 재할당
- Time-Wait 상태의 단점 : 시스템에 문제가 생겨서 서버가 갑작스럽게 종료된 상황에서 재빨리 서버를 재 가동시켜서 서비스를 이어가야해도 Time-wait상태라면 바로 접속이 불가능해진다. 따라서 항상 Time-wait상태가 반가운것은 아니다. 또한 Time-wait상태는 상황에 따라서 더 길어질 수 있어서 더큰 문제가 될 수도 있다.
- 아래 과정은 종료과정인 Four-way handshaking 과정에서 Time-wait 상태가 길어질 수 밖에 없는 문제상황이다.
- 호스트 A가 전송하는 Four-way handshaking 과정에서 마지막 데이터가 손실이 되면 호스트 B는 자신이 보낸 FIN메시지를 호스트 A가 수신하지 못한것으로 생각하고 FIN메시지를 재전송한다 그러면 FIN메시지를 수신한 A는 Time-wait타이머를 재가동한다. 때문에 네트워크의 상황이 원활하지 못하다면 Time-wait상태가 언제까지 지속될지 모르는 일이다.
- 해결책 : 소켓의 옵션 중 SO_REUSEADDR의 상태를 변경하면된다. 이의 적절한 변경을 통해서 Time-wait상태에 있는 소켓에 할당되어 있는 Port번호를 새로시작하는 소켓에 할당되게끔 할 수 있다 . SO_REUSEADDR의 디폴트 값은 0(FALSE)인데 이는 Time-wait상태에ᅟᅵᆼᄊᅠ는 소켓의 PORT번호는 할당이 불가능함을 의미한다. 따라서 이 값을 1(TRUE)로 변경 해줘야 한다. 방법은예쩨 Reuseadr_eserver.c에서 주석처리되어있는 아래의 코드부분으로 주석을 해제하면된다.
- optlen = sizeof(option);
- option = TRUE;
- setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (void*)&option, optlen);
- 09-3 : TCP_NODELAY
- Nagle 알고리즘
- 네트워크상에서 돌아다니는 패킷들의 흘러 넘침을 막기 위해서 1984년에 제안된 알고리즘이다 . 이는 TCP상에서 적용되는 매우 단순한 알고리즘으로써 이의 적용여부에 따른 데이터 송수신 방식의 차이는 다음과 같다.
- 위 그림은 문자열 " Nagle"을 Nagle 알고리즘을 적용해서 전소할때와 적용하지 않고 전송할 때의 차이를 보여준다.
- 결론 : Nagle 알고리즘은 앞서 전송한 데이터에 대한 ACK메시지를 받아야만 다음 데이터를 전송하는 알고리즘이다.
- 그림 09-3 은 극단적인 상황의 연출이다.
- 프로그램상에서 문자열을 출력버퍼로 전달할 떄 한문자씩 전달하지 않고 전체 문자열을 한번에 전달하기 떄문에 문자열 "Nagle"의 전송이 그림 09-3에서 보이는 상황처럼 전개되지는 않는다. 하지만 문자열을 이루는 문자가 약간의 시간간격을 두고 출력 버퍼로 전달된다면 (이러한 유형으로 출력버퍼에 전달되는 데이터가 존재한다면) 그림 09-3과 유사한 상황이 연출될 수도 있다. 즉 그림에서 보이는 상황은 시간간격을 두고 출력버퍼로 전달되는 데이터의 전송으로 이해해야한다.
- Nagle알고리즘의 단점 : 전송하는 데이터의 특성에따라서 Nagle알고리즘의 적용여부에 따른 트래픽의 차이가 크지 않으면서도 Nagle알고리즘을 적용하는 것보다 데이터의 전송이 빠른경우도 있다. 예를 들어서 용량이 큰 파일 데이터의 전송이 있다. 파일 데이터를 출력버퍼로 밀어 넣는 작업은 시간이 걸리지 않는다 때문에 Nagle알고리즘을 적용하지 않아도 출력버퍼를 거의 꽉채운 상태에서 패킷을 전송하게 된다. 따라서 패킷의 수가 크게 증가하지도 않을 뿐더러 ACK를 기다리지않고 연속해서 데이터를 전송하니 전송속도도 놀랍게 향상된다.
- 결국 일반적으로는 Nagle알고리즘을 적용하지 않으면 속도의 향상을 기대할 수 있으나 무조건 Nagle알고리즘을 안 적용할 경우 트래픽에 상당한 부담을 주게됨으로 데이터의 특성을 정확히 판단후에 Nagle알고리즘을 중지해야한다.
- Nagle알고리즘의 중단
- 바로 위에서 언급한 아래 상황에서까지 Nagle알고리즘을 고집할 필요는 없다 즉 필요하다면 Nagle알고리즘도 중단시켜야 한다.
- Nagle알고리즘의 적용 여부에 따른 트래픽의 차이가 크지 않으면서도 Nagle알고리즘을 적용하는것보다 데이터의 전송이 빠른경우
- 방법은 아래와 같다.
- int opt_val = 1;
- setsockopt(sock, IPROTO_TCP, TCP_NODELAY, (void*)&opt_val, sizeof(opt_val));
- 그리고 Nagle알고리즘의 설정상태를 확인하려면 다음과 같이 TCP_NODELAY에 설정된 값을 확인하면 된다.
- int opt_val;
- socklen_T opt_len;
- opt_len = sizeof(opt_val);
- getsockopt(sock, IPROTO_TCP, TCP_NODELAY, (void*)&opt_val, &opt_len);
- Nagle알고리즘이 설정된 상태라면 함수호출의 결과로 변수 opt_val에는 0이 저장되며 반대로 설정되지 않은 상태라면 1이 저장된다.
728x90
'책 > 윤성우 TCPIP' 카테고리의 다른 글
10-01 프로세스의 이해와 활용 (4) ~ 10-03 : 시그널 핸들링 (1) (0) | 2020.12.18 |
---|---|
10-1 프로세스의 이해와 활용 (0) | 2020.12.15 |
09-2 : SO_REUSEADDR (2) (0) | 2020.12.13 |
09-2 : SO_REUSEADDR (0) | 2020.12.12 |
09-1 소켓의 옵션과 입출력 버퍼의 크기 (2) (0) | 2020.12.11 |