-소켓의 옵션과 입출력 버퍼의 크기-
소켓의 다양한 옵션
프로토콜 옵션은 계층별로 구별된다. protocol level로 SOL_SOCKET (소켓의 가장 일반적인 옵션),
getsockopt & setsockopt
getsockopt를 이용해서 옵션의 설정상태를 참조할수 있고 setsockopt함수를 이용해서 옵션을 설정할수 있다.
so_SNDBUF & SO_RCVBUF
-SO_REUSEADDR-
주소할당 에러(Binding Error) 발생
Time-wait 상태
TCP 소켓에서 두 호스트의 접속 종료를 할때 Four hand shaking이라는 단계를 거친다고 했다. 다시 한번 말하면 host A에서 host B로 접속 접속을 끊을 때 FIN 패킷이 전달되고 B에서는 A 한테 잠깐 기다리라는 ACK 패킷을 보낸다음 종료가 완료 됐음을 나타내는 FIN 패킷을 보내면 A에서는 FIN 패킷을 잘 받았다는 최종 ACK 패킷을 보내고 접속은 종료된다. 그런데 접속 종료를 먼저 시도한 호스트 그러니까 최종 ACK 패킷을 보내는 호스트 최종 ACK를 보내고 time-wait 상태에 있는데 이는 최종 ACK가 상대 호스트에게 잘 갔나 잠시 기다리는 것이다. 만약 최종 ACK가 제대로 전송이 되지 않았다면 상대 호스트는 FIN 패킷을 다시 보낼 것이기 때문에 이 FIN 패킷이 다시 오나 안오나 의무적으로 기다리는 시간이 time-wait 상태인 것이다.
주소의 재할당
이 time-wait 상태 때문에 서버측에서 접속 종료를 한뒤 바로 서버 프로그램을 시행하면 예전 프로그램에서 해당 PORT에 대한 time-wait 상태에 있기 때문에 bind error가 생긴다. 이는 서버에 문제가 생겨서 종료한 다음에 바로 서버를 재가동 시켜야 하는 상황에는 문제가 아닐수 없다. 이를 해결하기 위한 소켓 옵션이 SO_REUSEADDR이다. 디폴트로 SO_REUSEADDR이 0, 즉 false로 되어 있는데 이를 1, 즉 true로 설정하면 time-wait 상태에 있는 소켓에 할당되어 잇는 port 번호를 새로 시작 하는 소켓에 할당되게끔 할수 있다.
-TCP_NODELAY-
Nagle 알고리즘
nagle알고리즘은 네트워크 상에 패킷들의 흘러 넘침을 방지 하기 위해 제안된 알고리즘이다. 이는 기본적으로 TCP소켓에서 적용하는 것으로 패킷을 보내면 전송한 패킷에 대한 ACK 메시지를 받아야 다음 데이터를 전송한 것이다. 이는 ACK 메시지를 받을때까지 출력 버퍼에다가 데이터를 버퍼링 하기 때문에 적은 갯수의 패킷으로 데이터의 송수신이 가능하게 한다. 곧 네트워크 트래픽을 줄인다. 그러나 이 Nagle 알고리즘은 항상 좋은 것은 아니다. 일반적으로 출력버퍼로 데이터를 넣는데는 시간이 걸리지 않는다. 그렇기에 대용량 파일을 전송할 경우에는 nagle 알고리즘을 적용하나 안하다 출력버퍼에 최대로 데이터를 채우고 파일을 전송하게 되기 때문에 오히려 nagle 알고리즘을 적용하지 않고 전송하는 것이 빠르다.
Nagle 알고리즘의 중단
TCP_NODELAY의 설정값을 TRUE, 즉 1로 설정하면 된다.
No comments:
Post a Comment