[Network] 9. 소켓의 다양한 옵션
소켓의 옵션과 입출력 버퍼의 크기
옵션 정보
아래 표는 소켓의 특성을 변경시킬 때 사용하는 옵션 정보들이다.
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의 할당이 가능하도록 할 수 있다.
'Computer Science > Network' 카테고리의 다른 글
[Network] 11. 프로세스간 통신 (0) | 2023.05.28 |
---|---|
[Network] 10. 멀티 프로세스 기반의 서버 구현 (0) | 2023.05.28 |
[Network] 8. 도메인 이름과 인터넷 주소 (0) | 2023.05.28 |
[Network] 7. 소켓의 우아한 종료 (0) | 2023.05.28 |
[Network] 6. UDP 기반 서버/클라이언트 (0) | 2023.05.28 |