본문 바로가기

Golang/etc

tcp/ip - 09 소켓 옵션

728x90
반응형

소켓의 옵션은 계층 별로 분류할 수 있다. 

IPPROTO_IP : IP 프로토콜에 관련된 사항들

IPPROTO_TCP : TCP 프로토콜에 대한 사항

SOL_SOCKET : 소켓에 대한 가장 일반적인 옵션들

 

거의 모든 옵션은 설정 상태의 참조(GET) 및 변경(SET)이 가능하다. 하지만 SET이 불가능한 경우도 있는데, 그 대표적인 예가 바로 SO_TYPE 이다. 소켓의 타입은 소켓 생성시 한 번 결정되면 변경이 불가능 하다. 

 

소켓 버퍼와 관련있는 소켓 옵션들 

- SO_RCVBUF : 입력버퍼의 크기와 관련된 옵션

- SO_SNDBUF : 출력버퍼의 크기와 관련된 옵션

-> 두 옵션을 이용해서 입출력 버퍼의 크기를 참조할 수 있음. 

 

하지만 TCP 프로토콜에서 입출력 버퍼의 중요성은 엄청 크기 때문에,

setsockopt 함수호출을 통해 사용자가 지정한 크기를 참조할 뿐 그대로 변경하지는 않는다. 

 

 

* Time-wait 상태 

: 4-way handshaking 이후에 소켓이 바로 소멸되지 않고 Time-wait 상태에 들어감 

-> 먼저 FIN 메시지를 보낸 호스트에서 상대 호스트가 마지막 FIN 메시지에 대한 ACK를 수신하지 못했을 경우를 대비해서 소켓 종료 시간을 열어두는 것. 

 

서버, 클라이언트 프로그램에 상관없이 먼저 연결 종료요청을 한 서버에서 time-wait 상태에 들어가게 된다. 

 

하지만 이런 Time-wait 상태는 네트워크 상황에 따라서 예상보다 길어질 수 있고, 따라서 서버를 빨리 재가동 시켜야 할때 port bind에서 문제가 발생할 수 있다. 

 

이런 Time-wait 상태를 해결하기 위해 SO_REUSEADDR 의 상태를 default (0)에서 1로 바꿔주면된다. 

-> 이렇게 함으로써 Time-wait 상태에 있는 소켓의 port번호가 재할당이 가능해진다 (서버 재가동 가능)

 

*TCP_NODELAY

- Nagle 알고리즘? 

Nagle 알고리즘이란 네트워크상에서 돌아다니는 패킷들의 흘러넘침을 막기위해 제안된 알고리즘으로,

앞서 전송한 데이터에 대한 ACK 메시지를 받아야만 다음 데이터를 전송하는 알고리즘이다. 

 

먼저 어떤 데이터가 전송되었다면, ACK 메시지를 받기 전까지 출력버퍼에 데이터를 쌓아두었다가 ACK 메시지를 받으면 다시 데이터를 전송하는 방식의 알고리즘이다. 

 

대용량 파일의 전송 상황과 같이

Nagle 알고리즘의 적용 여부에 따른 트래픽의 차이가 크지 않으면서도, Nagle 알고리즘을 적용하는 것보다 데이터의 전송이 빠른 경우에는 이 알고리즘을 적용하지 않은 소켓 통신이 유리할 수 있다. 

 

TCP는 기본적으로 Nagle 알고리즘을 기반으로 하는데, 이 옵션을 사용하고 싶지 않다면 TCP_NODELAY를 1 (TRUE)로 변경해주면 된다. 

728x90
반응형

'Golang > etc' 카테고리의 다른 글

tcp/ip -10 멀티프로세스 기반의 서버 구현  (0) 2022.07.12
tcp/ip -08 DNS  (0) 2022.07.06
tcp/ip - 07 소켓의 종료  (0) 2022.07.04
golang udp example  (0) 2022.07.03
tcp/ip 05  (0) 2022.07.03