Socket의 옵션

Posted 2012. 10. 16. 16:15

1. SO_RCVBUF, SO_SNDBUF

이 옵션은 TCP의 소켓 옵션에 해당한다.

이 옵션을 설정하면 커널의 송/수신 버퍼의 크기를 조정 할 수 있다.

(커널 : 운영체재의 핵심부분으로 메모리에 상주하면서 시스템에 존재하는 자원을 관리한다)

응용프로그램이 원격지로 전송하는 자료는 일단 송신버퍼에 복사되어 있다가

원격지의 수신버퍼로 전송된다. 수신버퍼는 전송받은 자료를 응용프로그램이 읽어갈때까지 보관한다.

수신버퍼의 크기가 작으면 버퍼외의 자료를 수신측에서 모두 버려진다.

TCP에선 흐름제어를 통해 connect함수나 listen함수의 연결준비 단계에서 수신버퍼의 크기를

기준으로 송수신 버퍼값을 설정한다. 하지만 그렇다 하더라도 커널이 그대로 적용하지 않고

값을 참조한뒤 커널의 정책에 따라 버퍼의 크기를 결정한다.

즉, 적용한 버퍼의 값이 실제로 적용되지 않을 수 있다.




2. SO_REUSEADDR

이 옵션은 커널이 소켓을 사용하는 중에도 계속해서 사용 할 수 있게 하는 옵션입니다.

커널이 소켓을 사용하게 되는건. 연결 종료 과정에서 먼저 연결 종료를 시작한 쪽은 상대방으로 부터

FIN패킷을 받고 FINM_ACK패킷을 전송한 후 일정시간동안 종료하지 않고 커널이 해당 소켓을

점유할 때를 말한다. 이렇게 먼저 종료를 시작하는 시스템은 응용프로그램이 종료를 하더라도

소켓은 커널에서 일정시간동안 점유중인 상태로 있게 된다. 이런 경우 응용프로그램을 재실행하면 

bind를 호출할때 아직 점유중인 포트를 연결하려는 시도 때문에 오류가 난다.

일정 시간이 지나면 다시 접속이 가능 하지만 온라인게임서비스에서 일정 시간을 딜레이하는건

다소 무리가 있다. 이럴때 이 옵션을 사용하면 점유중에서도 연결이 가능하게 해준다.


3. SO_LINGER

이 옵션은 close함수를 호출할때 송신버퍼의 자료가 모두 전송된 것인지 확인인 하지 않고 종료를 할

것인지 정하는 옵션이다. TIME_WAIT관련..




4. TCP_NODELAY

Nagle알고리즘에 관련된 옵션이다.

Nagle알고리즘은 가능하면 여러번 보내지 말고 한번에 많이 보내는 원칙을 기반으로 만들어진것.

그리고 ACK를 수신해야만 다음 전송을 진행한다.

TCP는 기본적으로 Nagle알고리즘이 적용되어 있다.

적은양을 모으다 보면 통신량은 줄어들지만 지연될 수 있는 단점이 있다.

또한 사용하지않고 마구 보내게되면 전송량이나 부하가 커진다.

그냥 끄고 스케쥴러 사용하자