IT_Programming/Network Programming

성능 향상을 위한 소켓 제어

JJun ™ 2009. 11. 12. 09:06

--------------------------------------------------------------------------------------------------

참고: TCP/IP 소켓 프로그래밍

--------------------------------------------------------------------------------------------------

 

1. setsockopt 함수
   - setsockopt (소켓 지시자, 옵션 레벨, 옵션 종류, 옵션값, 옶션크기)
   - 성공여부 : 지정된 소켓에 옵션을 적용하고, 성공 시 0, 실패 시 -1을 리턴한다.
      #include <sys/types.h>
      #include <sys/socket.h>
      int  setsockopt (int sockfd, int level, int optname, const void *optval, int optlen);

 

 

2. getsockopt 함수
   - getsockopt (소켓 지시자, 옵션 레벨, 옵션 종류, 옵션값, 옶션크기) 
   - 성공여부 : 지정된 소켓에 설정되어 있는 옵션 값을 저장하고, 성공 시 0, 실패 시 -1을 리턴#include <sys/types.h>
       #include <sys/socket.h>
       int  setsockopt (int sockfd, int level, int optname, const void *optval, int optlen);

 

 

      errono 오류 값

            - EBADF : sockfd 인자(소켓 파일 지시자)가 유효하지 않다.

            - ENOTSOCK : sockfd 인자가 소켓 파일 지시자가 아니다.

            - ENOPROTOOPT : optname이(옵션 종류) 주어진 레벨에 맞지 않다. 

 

 

3. 소켓 옵션 레벨 종류

 

   -  소켓 레벨에서의 처리 (SOL_SOCKET)

       : 소켓은 네트워크 프로토콜과 사용자 애플리케이션간에 서로 통신할 수 있도록 해주는 연결고리 같은

         존재다. 이 레벨에서 처리할 수 있는 내용은 송/수신 버퍼 크기 조절, 브로드캐스팅 허용, 연결 여부

         확인 등 프로토콜 독립적인 성격을 갖는 상위 레벨에서의 소켓 제어 등이 있다.

 

   -  프로토콜 레벨에서의 처리 (IPPROTO_IP, IPPROTO_TCP)

       : 함수의 인자를 설명하면서 언급한 레벨 중 네트워크 프로토콜 레벨에서 제어한다.

         이 레벨에서 처리할 수 있는 내용은 IP 헤더 포함 여부 결정, IP 패킷의 TTL(Time to Live) 값 변경,

         Nagle 알고리즘 작동 정지 등 프로토콜 종속적인 성격을 갖는 하위 레벨에서의 소켓 제어다.

 

--------------------------------------------------------------------------------------------------

  

 

마지막 바인딩 포트를 재사용(SO_REUSEADDR) 옵션은가장 활용성이 높은 옵션이다.

이는 이미 사용 중인(바인딩 되어 사용되고 있는), IP 주소와 Port 번호를 재사용할 수 있게 설정 할 수 있다.

 

소켓이 종료될 경우

 

1) 접속 종료 요청 메시지(FIN)를 전송한다.

2) 이 상태에서는 아직 종료 요청을 받은 쪽에서 처리해야 할 작업이 남아 있을 수 있으니,

    즉시 연결 해제를 못하고 잘 받았다는 의미로 FIN 메시지를 응답 메시지(ACK)로 전송한다.

 

3) 처리해야 할 작업이 다 끝나서 종료해도 좋다는 메시지(FIN)를 전송한다.

4) 최종 응답 메시지(ACK)를 전송한다.

 

위의 과정(4-handshaking)대로 진행된다.

 

종료를 요청한 쪽에서는 FIN 메시지를 보내고 TIME WAIT 상태가 되어 일정시간 동안 기다려야 하고,

종료를 요청받은 쪽에서는 ACK 패킷을 받고, 소켓 연결을 해제한다.

 

문제는 여기서 발생한다.

종료를 요청한 쪽이 TIME WAIT 상태일 때, 아직 바인딩된 IP주소와 Port 번호에 대한 소유권을 가지므로

다시 바인딩할 경우 오류가 발생한다. 이는 SO_REUSEADDR 옵션을 통해 해결할 수 있다.

 

--------------------------------------------------------------------------------------------------