tcp_tw_reuse와 SO_REUSEADDR의 차이

Network 2017.02.08 14:30 Posted by 김한별 behonestar

tcp_tw_reuse

클라이언트에서 서버로 connect()하는 과정에서 커널은 내부적으로 가용 포트를 로컬 포트로 선정합니다. 이 때 tcp_tw_reuse 옵션이 활성화되어 있으면 TIME_WAIT 상태의 포트도 로컬포트로 선정될 수 있습니다. (일반적인 경우를 가정하여 bind()를 수행하지 않고 connect()하는 쪽을 클라이언트라고 지칭하였습니다.)


SO_REUSEADDR

서버에서 TIME_WAIT 상태의 특정 포트에 bind()하려면 소켓에 SO_REUSEADDR 옵션을 적용해야 합니다. bind()를 사용한 경우 해당 로컬 포트는 tcp_tw_reuse 설정이 적용되지 않습니다.


// 소켓 생성

sockSvr = socket(AF_INET, SOCK_STREAM, 0);

addrSockSvr.sin_family = AF_INET;

addrSockSvr.sin_port = htons(333);

addrSockSvr.sin_addr.S_un.S_addr = INADDR_ANY;


// 소켓 옵션 설정

setsockopt(sockSvr, SOL_SOCKET, SO_REUSEADDR, (const char *)&bValid, sizeof(bValid));          


bind(sockSvr, (struct sockaddr *)&addrSockSvr, sizeof(addrSockSvr));



출처


댓글을 달아 주세요