소켓 옵션 설정(클라이언트 측 소켓에 제공하는 옵션) - TCP_NODELAY, SO_LINGER, SO_TIMEOUT, SO_RCVBUF, SO_SNDBUF, SO_KEEPALIVE, SO_OOBINLINE, SO_REUSEADDR, IP_TOS

CODEDRAGON Development/Java

반응형

 

 

소켓 옵션 설정(클라이언트 측 소켓에 제공하는 옵션)

소켓 옵션은 자바 소켓 클래스 내부의 네이티브 소켓이 데이터를 보내거나 받는 방법을 지정하는데 클라이언트 측 소켓에 대해 아래에 나열된 9가지 옵션을 제공하고 있습니다.

옵션 이름은 소켓을 처음 개발한 버클리 유닉스의 C헤더 파일에 있는 이름을 그대로 빌려왔기 때문에 유닉스의 C명명규칙을 그대로 따르고 있습니다.

·       TCP_NODELAY

·       SO_LINGER

·       SO_TIMEOUT

·       SO_RCVBUF

·       SO_SNDBUF

·       SO_KEEPALIVE

·       SO_OOBINLINE

·       SO_REUSEADDR

·       IP_TOS

 

 

 

TCP_NODELAY

TCP_NODELAY 설정을 true로 하면 패킷의 크기에 상관없이 가능한 빨리 패킷 전송합니다. 이 옵션은 네이글 알고리즘(Nagle's algorithm)의 문제점인 원격 시스템이 로컬 시스템으로 확인을 충분히 빨리 보내지 않은 경우, 작은 단위의 데이터를 지속적으로 보내야 하는 애플리케이션에서는 느려지는 현상이 발생하는데 이 현상을, 이 옵션을 true로 설정하여 버퍼링 구조를 사용하지 않고 모든 패킷이 준비되는 즉시 전송하게 합니다.

public void setTcpNoDelay(boolean on) throws SocketException

public boolean getTcpNoDelay() throws SocketException

 

 

SO_LINGER

소켓이 닫힐 때, 전송되지 않은 데이터그램을 어떻게 처리할지 결정하는데 기본적으로 클로즈 메서드는 호출 즉시 반환하지만, 시스템은 내부적으로 아직 전송되지 않은 데이터를 계속해서 전송합니다.

링거 타임이 0으로 설정될 경우 소켓이 닫힐 때 아직 전송되지 않은 패킷은 버려집니다.

이 옵션이 켜 있고 링거 타임이 정수 값인 경우 클로즈 메서드는 지정된 시간 동안 데이터를 보내고 응답을 받기 위해 블록되고 지정된 시간이 초과될 경우, 소켓은 닫히고 아직 남아있는 데이터는 보내지 않으며 응답을 기다리지 않습니다.

public void setSoLinger(boolean on, int seconds) throws SocketException

public int getSoLinger() throws SocketException

 

 

 

SO_TIMEOUT

일반적으로, 소켓에서 데이터를 읽으려고 할 때 read()메소드 호출은 충분한 바이트를 읽을 때까지 블록되지만, SO_TIMEOUT을 설정하면 read()메소드의 호출이 지정된 밀리초 이상 블록되지 않습니다.

public void setSoTimeout(int milliseconds) throws SocketException

public int getSoTimeout() throws SocketException

 

 

SO_RCVBUF & SO_SNDBUF

네트워크의 입력에 사용된 수신 버퍼의 크기와 네트워크의 출력에 사용된 송신 버퍼의 크기를 제한합니다. 메소드 선언에는 송신 버퍼와 수신 버퍼를 각각 설정할 수 있는 것처럼 보이지만, 일반적으로 버퍼는 송신 버퍼와 수신 버퍼의 값보다 작게 설정됩니다.

예를 들어, 송신 버퍼의 크기를 64k로 설정하고 수신 버퍼의 크기를 128k로 설정하면, 송신과 수신 모두 64k의 버퍼 크기를 가지게 됩니다.

public void setReceiveBufferSize(int size) throws SocketException, IllegalArgmentException

public int getReceiveBufferSize() throws SocketException

public void setSendBufferSize(int size) throws SocketException, IllegalArgumentException

public int getSendBufferSize() throws SocketException

 

 

 

SO_KEEPALIVE

클라이언트 측 소켓에 제공하는 옵션 중 SO_KEEPALIVE가 설정된 경우와 설정되지 않은 경우를 살펴보겠습니다.

옵션이 설정된 경우

클라이언트는 이따금씩 유휴 연결을 통해 데이터 패킷을 보내어 서버와의 연결을 유지합니다.

옵션이 설정되지 않은 경우

네트워크 통신이 활발하지 않은 클라이언트는 서버가 장애로 종료된 상황에도 아무런 알림을 받지 못하고 계속 실행되게 됩니다.

 

옵션을 설정하거나, 현재 상태를 확인하기 위한 메소드입니다.

public void setKeepAlive(boolean on) throws SocketException

public boolean getKeepAlive() throws SocketException

 

 

 

SO_OOBINLINE

기본적으로 자바는 소켓에서 수신된 긴급데이터를 무시하지만, 긴급 데이터를 보통의 데이터와 함께 수신하고자 할 경우 아래의 메소드를 이용하여 SO_OOBINLINE 옵션을 설정하면 됩니다. 일단 SO_OOBINLINE이 설정되면 긴급 데이터 도착 시 일반적인 방법으로 읽을 수 있도록 소켓의 입력 스트림에 저장합니다.

 

소켓이 종료될 때, 로컬 포트를 즉시 해제하지 않는 경우 해당 포트로 전송 중인 나머지 패킷이 있는 경우에는 때로 일정 시간 동안 기다리게 됩니다.

소켓이 임의의 포트를 사용할 때는 큰 문제가 되지 않지만 소켓이 잘 알려진 포트를 사용할 때는 일정 시간 동안 다른 소켓이 해당 포트를 사용할 수 없도록 막기 때문에 문제가 됩니다.

 

public void setOOBInLine(boolean on) throws SocketException

public boolean getOOBInLine() throws SocketException

 

 

 

SO_REUSEADDR

SO_REUSEADDR가 켜진 경우 이전 소켓으로 전송된 데이터가 남아 있는 경우에도 또 다른 소켓이 해당 포트를 바인드 할 수 있습니다.

public void setReuseAddress(boolean on) throws SocketException

public boolean getReuseAddress() throws SocketException

 

 

 

IP_TOS 서비스 클래스

IPv4 헤더내에 ‘서비스 유형’ 및 ‘혼잡 알림’을 나타내는 8비트 필드로 구성되어 있으며 서비스의 클래스는 IP 헤더에서 IP_TOS라고 불리는 8비트 필드에 저장됩니다.

자바는 이 값을 확인하고 설정할 수 있는 2개의 메소드를 제공하고 있습니다.

public int getTrafficClass() throws SocketException

public void setTrafficClass(int trafficClass) throws SocketException