반응형
소켓 옵션 의미
소켓 옵션을 사용하면 소켓 함수의 기본 동작을 변경할 수 있으며, 이를 통해 소켓코드와 프로토콜 구현 코드를 세부적으로 제어 가능.
소켓 옵션은 처리 주체에 따라 크게 두 종류로 구분
1. 소켓 코드가 처리하는 옵션 (setsockopt() 두번째 옵션 - SOL_SOCKET)
옵션을 설정하면 소켓 코드에서 해석하고, 처리한다.
2. 프로토콜 구현 코드가 처리하는 옵션 (setsockopt() 두번째 옵션 - IPPROTO_IP, IPPROTO_TCP)
옵션을 설정하면 프로토콜 구현 코드에서 해석하고 처리한다. 프로토콜 의존적인 성격이 있으므로 프로토콜 종류에 따라 옵션 자체가 달라진다.
소켓 옵션 - SO_REUSEADDR 옵션
현재 사용 중인 IP주소와 포트번호를 재사용할 수 있다.
다시 말하면, 현재 사용 중인 IP주소와 포트 번호를 이용해 bind() 함수를 호출 할 수 있다.
같은 서버를 두 개 이상 실행해도 문제가 없다. (물론 그 중 하나만 클라이언트 요청에 응답한다.)
만약 SO_REUSEADDR 옵션을 설정하지 않았다면 bind() 함수에서 오류 발생
* SO_REUSEADDR 옵션 설정하는 목적
1. TCP 서버 종료 후 재실행 시 bind()함수 오류 발생 방지
유닉스/리눅스 운영체제에서 멀티프로세스 기반 TCP 서버에서 종종 발생하는 문제.
TCP 서버에 문제가 발생해 강제 종료되더라도 자식 프로세스가 남아 포트번호를 계속 사용하므로 서버 재실행 시 바인딩 오류 발생.
윈도는 일반적으로 멀티스레드 기반이지만 이식성을 고려해 SO_REUSEADDR 옵션 설정 추천
2. 여러 IP주소를 보유한 호스트에서 같은 기능의 서버를 IP 주소별로 따로 운용 가능
유닉스/리눅스 운영체제에선 서버 실행 시 IP가 달라도 포트가 같으면 바인딩 오류 발생.
3. 멀티캐스팅 응용 프로그램이 같은 포트 번호 사용 가능
소켓 옵션 - TCP_NODELAY 옵션
TCP_NODELAY 옵션은 TCP 프로토콜 구현 코드가 처리하는 옵션(IPPROTO_TCP) 중 하나이다.
TCP_NODELAY 옵션은 Nagle(네이글) 알고리즘 작동을 중지하는 역할을 한다.
Nagle 알고리즘은 작은 패킷이 불필요하게 많이 생성되는 일을 방지해 네트워크 트래픽을 감소시키는 알고리즘이다. 따라서 TCP 프로토콜에서는 기본적으로 동작하도록 되어있다. 따라서 일반적으로 TCP_NODELAY 옵션을 설정하지 않는 것이 바람직하다.
그러나 TCP_NODELAY 옵션이 필요한 경우가 있다.
.......................................................................................................................
Nagle 알고리즘
Nagle 알고리즘을 이해하려면, 먼저 TCP 전송 원리를 이해해야 한다.
Nagle 알고리즘 동작 방식은 다음 두 가지로 요약할 수 있다.
1. 보낼 데이터가 MSS(Maximum segment size)로 정의된 크기만큼 쌓이면 상대편에 무조건 보낸다.
이 경우 슬라이딩 윈도우 방식으로 데이터를 계속 보낼 수 있다.
2. 보낼 데이터가 MSS보다 작으면 이전에 보낸 데이터에 대한 ACK이 오기를 기다린다.
ACK이 도착하면 보낼 데이터가 MSS보다 작어도 상대편에 보낸다.
이 경우 데이터를 전송할 때마다 ACK을 기다리고, ACK을 받으면 다음 데이터를 전송하는 동작을 반복한다.
.......................................................................................................................
요약
"데이터가 충분히 크면 바로 보내고, 그렇지 않으면 쌓일 때까지 대기한다.
데이터가 충분히 쌓이지 않았더라도 이전에 보낸 데이터를 상대편이 받았다면 다음 데이터를 보낸다."
Nagle 알고리즘의 장단점
장점: 작은 패킷이 불필요하게 많이 생성되는 일을 방지해 네트워크 트래픽 감소시킴
단점: 데이터가 충분히 쌓일 때까지 또는 ACK이 도달할 때까지 대기하는 시간 때문에 응용프로그램의 반응 시간이 길어질 수 있다.
그래서 TCP_NODELAY 옵션이 필요한 경우가 언제냐고? (Nagle 알고리즘을 중지해야할 경우)
Nagle 알고리즘의 장점을 포기하는 대신 응용프로그램의 반응 속도를 빠르게 할 때 사용.
그러나 응용 프로그램 수준에서 데이터 전송 방식을 수정하는 등의 방법으로 대처하는 것이 바람직.
TCP_NODELAY 옵션은 최후의 수단으로 고려해야.
반응형