[Network] 9. 소켓의 다양한 옵션

2023. 5. 28. 16:15

소켓의 옵션과 입출력 버퍼의 크기

옵션 정보

아래 표는 소켓의 특성을 변경시킬 때 사용하는 옵션 정보들이다. 

Protocol Level Option Name Get Set
SOL_SOCKET SO_SNDBUF
SO_RCVBUF
SO_REUSEADDR
SO_KEEPALIVE
SO_BROADCAST
SO_DONTROUTE
SO_OOBINLINE
SO_ERROR
SO_TYPE
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
X
X
IPPROTO_IP IP_TOS
IP_TTL
IP_MULTICAST_TTL
IP_MULTICAST_LOOP
IP_MULTICAST_IF
O
O
O
O
O
O
O
O
O
O
IPPROTO_TCP TCP_KEEPALIVE
TCP_NODELAY
TCP_MAXSEG
O
O
O
O
O
O

Protocol Level과 Option Name을 인자로 넣어 해당 옵션을 참조하거나 설정할 수 있다. 

 

옵션 정보 관련 함수

옵션 확인할 때 getsockopt를 사용한다. 

#include <sys/socket.h>

int getsockopt(int sock, int level, int optname, void*optval, socklen_t *optlen);

 

옵션을 세팅할 때는 setsockopt를 사용한다.

#include <sys/socket.h>

int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);

 

사용예제 1 : 소켓의 타입정보 확인 

TCP인지 UDP인지 확인할 수 있다. 

여기서 사용된 SO_TYPE 옵션은 socket의 타입정보를 의미하는데 이는 변경이 불가능한 옵션이다. TCP의 경우 1, UDP의 경우 2라고 나온다.

 

사용예제 2 : 소켓의 입출력 버퍼 크기 확인

입력 버퍼의 크기를 참조 및 변경할 때에는 SO_SNDBUF, 출력 버퍼의 크기를 참조 및 변경할 때에는 SO_RCVBUF를 사용한다.

버퍼의 크기를 참조하는 코드
버퍼의 크기를 설정하고 참조하는 코드

입출력 버퍼는 주의깊게 다뤄야하기 때문에 요구사항이 완벽히 반영되지 않는다.

 

SO_REUSEADDR

time-wait

TCP 소켓은 종료할 때 4-way handshaking 방식을 사용한다. 이때 첫번째 메시지를 전달하는 host 소켓은 time-wait 상태를 거친다.

위의 사진에서 host 소켓의 마지막 부분에 time-wait가 발생함을 확인할 수 있다. 

time-wait는 마지막 ACK가 소멸되는 상황을 대비해 만들어진 개념이다. ACK 가 소멸되어버리면 호스트 B는 FIN 메시지를 계속 A에 전달하게 된다. ACK가 재송신 되지 못하고 소멸이 되기 때문이다.

time-wait 상태에는 해당 소켓이 소멸되지 않은 것이기 때문에 port 를 다른 소켓이 할당받을 수 없다. 커널에서 약 2~3분 소요된다고 알려져있으며, 이것이 누적될 경우 오류가 날 수 있다. 그래서 강제로 time-wait 상태에서 port의 할당이 가능하도록 할 수 있다.

BELATED ARTICLES

more