1. 소켓 옵션
1.1. 소켓 옵션 변경 함수
- **int getsockopt(int s, int level, int ootname, void optval, socklen_t optlen) : 소켓 옵션의 값을 가져옴
- **int getsockopt(int s, int level, int optname, const void optval, socklen_t optlen) : 소켓 옵션의 값 변경
- optval의 종류
- SO_REUSEADDR : 소켓 주소 자원 재사용
- SO_SNDBUF : 소켓 쓰기 버퍼의 크기 조정
- SO_RCVBUF : 소켓 읽기 버퍼의 크기 조정
- SO_LINGER : 소켓 종료 방식의 조저
- TCP_NODELAY(IPPROTO_TCP 영역) : Naggle 알고리즘 사용
1.2. 우아한 종료(Graceful Shutdown)

- 양쪽 애플리케이션이 더 이상 전송할 데이터가 없음을 서로에게 알리고, 모든 데이터를 손실 없이 전달한 후 FIN을 교환하여 정상적으로 연결을 종료한 상태
- Half-Close : 한 쪽 방향의 스트림만 종료하고, 반대 방향 스트림은 아직 살아있는 상태
- 우아한 종료의 조건
- 모든 데이터가 ACK됨
- 상대가 FIN을 받고 ACK을 보냄
- 상대도 FIN을 보내고 ACK을 받음
- TIME_WAIT을 정상적으로 수행함
- RST 없이 종료됨
1.3. 소켓 재사용
- 이미 사용되었거나 TIME_WAIT 중인 (IP, PORT) 조합을 새로운 소켓에서 다시 사용할 수 있게 하는 기능
- 기본적으로 TIME_WAIT 상태에서는 같은 포트를 바로 bind할 수 없음(지연 패킷 충돌 방지)
- setsockopt 함수에서 SO_REUSEADDR 옵션을 설정하면 소켓 재사용이 가능하게 됨
- Linux 3.9부터는 SO_REUSEPORT 옵션을 통해 여러 프로세스가 동시에 같은 프로세스에서 listen이 가능하게 됨
1.4. 연결 방식 조정
struct linger
{
int l_onoff;
int l_linger;
};