[네트워크] 네이글 알고리즘
전송 계층에서 사용하는 프로토콜은 UDP와 TCP가 존재합니다.
먼저 UDP는 데이터의 송수신이 보장되지 않는 통신이지만
통신속도가 TCP와 비교했을 때 비교적 빠르다는 장점이 있습니다.
실생활에서 볼 수 있는 UDP 통신은 비디오 스트리밍이 있습니다.
TCP의 경우 UDP와 정반대의 특징을 가지고 있습니다.
패킷 송수신의 순서를 지키며 통신합니다.
순서를 지키는 통신 방법으로 TCP는 3-way-handshaking 방법을 사용합니다.
클라이언트에서 요청한 정보를 서버가 응답과 함께 데이터를 보내면
다시 클라이언트에서 정상적으로 수신을 했다고 알려줍니다.
- (클라이언트 → 서버) : 데이터 요청
- (서버 → 클라이언트) : 통신 성공 보고 및 요청 데이터 송신
- (클라이언트 → 서버) : 요청 데이터 수신 완료 보고
(위의 통신 모습이 마치 악수를 하는 모습과 닮아 handshaking이라고 합니다.)
3-way-handshaking 방식은 UDP와 달리 안정성을 보장하지만
통신하는 패킷 대비 사용하는 자원이 많다는 단점이 있습니다.
예를 들어, N개의 문자를 TCP로 보내려고 하면
총 N번의 3-way-handshaking이 실행되기 때문에 속도가 매우 느립니다.
따라서 이 문제를 해결하기 위해 사용되는 알고리즘이 네이글 알고리즘 입니다.
네이글 알고리즘의 핵심은 “한 번에 많이 보내기” 입니다.
위의 N개의 문자 문제에서 네이글 알고리즘을 적용하면
첫 번째 TCP 통신에서 서버의 응답을 받기 직전까지
송신 버퍼에 데이터를 최대한 적재합니다.
그리고 이 패킷을 송신하면 N번 반복하던 3-way-handshaking 통신을
훨씬 적은 횟수로 완료할 수 있습니다.
이처럼 데이터를 한 번에 많이 보내기 때문에 네트워크 효율성이 좋지만
송신 버퍼에 데이터를 많이 담기 위해 컴퓨터 자원을 사용하기 때문에
반응속도가 느려질 수 있다는 단점이 있습니다.
네이글 알고리즘은 TCP 소켓에 기본적으로 적용되어 있으며,
제거하고 싶은 경우 setsockopt 함수를 사용하면 됩니다.
1
2
int opt_val = TRUE; // FALSE: 네이글 사용, TRUE: 네이글 미사용
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &opt_val, sizeof(opt_val));