본문 바로가기
네트워크

5. TCP(Transmission Control Protocol)_전송제어

by Testengineer 2021. 10. 9.
반응형

 

전송 제어

TCP는 네트워크 상태에 따라 데이터 전송량을 제어하는 알고리즘이 있다. 흐름 제어의 기반에 있는 것이 송수신 단에서 각각 버퍼의 역할을 하는 윈도우이다. 송신단에 있는 것이 송신 윈도우, 수신 단에 있는 것이 수신 윈도우로 각 호스트의 TCP 세션마다 송신 윈도우와 수신 윈도우를 가지고 있다.

수신 윈도우

수신 윈도우(Receiver window)는 TCP 연결에서 수신 버퍼 역할을 한다. 그런데 송신 측이 수신측의 현재 윈도우 크기를 모른다면 세그먼트를 너무 많이 전송해서 수신 윈도우 크기를 넘어서면 손실이 발생할 것이다. 이런 문제를 방지하고 데이터 송신을 효율적으로 제어하기 위해  TCP 프로토콜 헤더에 자신이 현재 수신 윈도우 여유 크기를 담아 서로 상대방에게 알려준다. 

송신 윈도우

송신 윈도우(Sender window)는 고정 값이 아니라 네트워크 환경에 따라 동적으로 크기가 조절된다. 송신 윈도우 크기는 송신 측 혼잡 윈도우(Congestion window)와 수신 측 수신 윈도우 중 작은 값이 설정된다.

송신 윈도우 = Min(혼잡 윈도우, 수신 윈도우 여유 크기)

혼잡 윈도우는 TCP에서 네트워크 혼잡 상황(품질)에 따라 윈도우 크기를 조절함으로써 데이터 송신량을 제어하는 윈도우이다. 혼잡 윈도우는 슬로우 스타트(slow start) 개념과 TCP 재전송이 영향을 미친다. 슬로우 스타트는 새롭게 TCP 연결이 이뤄졌을 때 상대방으로부터 ACK를 받기 전에 보낼 수 있는 세그먼트 개수를 1개부터 시작해 2개, 4개, 8개로 두 배씩 증가시켜 나가는 것이다. 연결 초기는 네트워크 품질을 모르는 상황이기 때문에 처음부터 많은 세그먼트를 보내면 손실이 발생할 수 있기 때문에 전송량을 점진적으로 늘려가는 것이다.

ssthresh(Slow start threshold)까지 슬로우 스타트 방식으로 증가하고 이후는 혼잡 회피(Congestion avoidance)로 1씩 윈도우를 증가시켜 나간다. 그러다가 재전송 타임아웃이나 중복 ACK에 의한 재전송이 발생하면 다시 혼잡 윈도우를 줄여 전송량이 줄어들도록 제어한다.

재전송 타임아웃과 중복 ACK 발생 시 윈도우 크기가 줄어드는 방식은 서로 다른데, 재전송 타임아웃 발생 시에는 Slow start threshold값이 현재 윈도우의 50% 수준으로 줄어들고, 윈도우 크기는 1부터 다시 시작해 슬로우 스타트 방식으로 증가한다. 그에 비해 중복 ACK 발생 시에는 Slow start threshold값이 현재 윈도우의 50% 수준으로 줄어드는 것은 동일하나 줄어든 Slow start threshold 값만큼 윈도우 크기가 줄어들오 혼잡 회피로 윈도우 크기를 늘려간다. 중복 ACK 재전송은 중간에 데이터 세그먼트가 누락된 것이 있지만 이후 데이터 세그먼트는 정상적으로 전달되고 있는 상태로서 네트워크 품질이 타임아웃보다 양호하다고 판단해 재전송 발생 이전 윈도우 크기의 50% 수준에서 시작하므로 1부터 시작하는 타임아웃에 비해 윈도우 크기를 회복하는 시간이 단축되어 빠른 복구(Fast Recovery)라고 한다. 그리고 재전송을 감지하는 시간 또한 타임아웃에 비해 짧아서 빠른 재전송(Fast Retransmission)이라고 한다. 

슬라이딩 윈도우

송신 윈도우는 ACK를 받기 전에 한번에 송신할 수 있는 최대량이다. 그리고 송신한 세그먼트에 대한 ACK가 도착하면 그만큼 윈도우에서 빠져나가고 그만큼 새롭게 전송할 수 있는 여유가 생긴다. 이렇게 동작하는 방식이 슬라이딩 윈도우(Sliding window)라고 한다.

송신 윈도우 크기는 상대방에게서 수신된 세그먼트에 포함된 수신 윈도우 크기나 혼잡 윈도우 크기 변경에 따라 바뀌게 되므로 슬라이딩되면서 윈도우 크기에 변경이 일어난다.이를 윈도우 열기, 확장, 축소, 닫음으로 구분한다. 닫음(Close)은 수신 윈도우가 모두 차서 더는 세그먼트를 수신할 수 없을때 송신 윈도우가 더 이상 송신하지 않게 하는 것으로, TCP 세그먼트 헤더의 윈도우 크기가 0으로 수신된다. 이 상태는 윈도우 크기가 0보다 큰 세그먼트를 받을 때까지 계속된다.

 

네이글 알고리즘

네이글(Nagle's) 알고리즘은 네트워크 상에서 오가는 패킷 수를 줄임으로써 네트워크 효율성을 높이고자 존 네이글이 고안한 알고리즘이다. TCP/IPv4의 경우 헤더 정보만 40바이트에 달하는데, 작은 패킷들이 빈번하게 오간다면 실제 전송하려는 데이터의 양보다 헤더 정보가 더 많아져서 네트워크 효율성이 떨어지고, 작은 패킷들이 많이 송수신된다면 혼잡 충돌이 발생할 가능성도 높아진다. 이를 개선하기 위해 네이글 알고리즘은 작은 데이터를 모아서 하나의 패킷에 보내게 한다.

네이글 알고리즘에서는 소량의 데이터가 들어오는 경우 바로 네트워크로 전송하지 않고 버퍼에 넣어둔다. 그리고 이전 송신한 데이터에 대한 ACK가 수신되면 버퍼에 쌓여 있는 데이터를 한 번에 송신한다. 물론 송신할 데이터가 MSS(Max Segment Size) 보다 큰 경우에는 바로 송신한다.

애플리케이션에서 알파벳을 한 번에 한 문자씩 Send 하고 있을 때 네이글 알고리즘이 off 상태면 TCP 세그먼트도 알파벳 하나씩 담아서 전송하지만 on인 상태에서는 앞에 전송된 데이터에 대한 ACK가 수신될 때까지 전송을 지연한 후 한 번에 전송함으로써 알파벳 여러 개 모아서 한 세그먼트에 함께 전송된다.

네이글 알고리즘은 네트워크 상에서 오가는 패킷 수를 줄임으로써 효율성을 높일 수 있다는 장점이 있지만 송신 호스트가 ACK를 받을 때까지 기다렸다 송신함으로써 성능 저하를 유발한다. 따라서 네트워크의 전송량이나 부하보다 빠른 응답속도가 중요한 환경에서는 사용하지 않는 것이 바람직하다.

네이글 알고리즘은 TCP Nodelay 파라미터로 설정한다.

지연 ACK

지연 ACK(Delayed ACK)는 네트워크 상에서 오가는 ACK 패킷수를 줄여줌으로써 네트워크 효율성을 높여주는 것이다. 수신 측에서 최대 약 200ms까지 기다려서 송신할 데이터 패킷에 ACK를 같이 보내거나 세그먼트 크기를 채운 2개 패킷당 1개 ACK를 전송함으로써 ACK 패킷을 줄인다.

네이글 알고리즘과 지연 ACK는 동시에 설정하면 성능 저하를 유발하므로 주의해야 한다. 

 

TCP KeepAlive

TCP KeepAlive는 연결을 맺고 있는 두 호스트 중 한 서버가 다운되거나 하는 상황이 발생했을 때 상대방은 데이터 TCP 연결이 사라진 것을 모를 수 있는데 이와 같은 비정상 연결을 판단해 TCP 연결을 정리하는 기능을 한다. KeepAlive는 TCP 필수요건은 아니지만 대부분의 운영체제에서 지원하고 있다.

기본 TCP 연결 유지 시간은 마지막 데이터 패킷 이후 첫 Probe 전송 시간 간격을 의미하며, RFC 1122에서 KeepAlive 시간은 적어도 2시간을 권고하고 있어 대부분의 운영체제에서 기본값이 2시간으로 지정되어 있다. 

KeepAlive로 인해 장애가 발생하는 경우는 호스트 간 KeepAlive 시간보다 방화벽이나 L4의 KeepAlive 시간이 짧게 설정돼 있는 경우 서버는 TCP 연결이 살아있다고 생각하는데 L4에서는 연결을 끊어버림으로써 일부 서비스에서 에러가 발생할 수 있다. 이런 경우인지 확인하는 방법은, TCP 연결이 이뤄진 양쪽 호스트에서 "netstat -an"명령으로 현재 establish 된 연결 목록을 뽑아 연결 개수와 상호 사용하는 송수신 포트가 일치하는지 확인해야 한다.

 

TCP 프로토콜 네트워크 체크

telnet [IP address][Port] 명령

텔넷은 원격지에 있는 호스트와 연결해 터미널을 사용할 수 있게 해주는 표준 프로토콜이다. telnet명령은 이 프로토콜을 사용할 수 있게 해주는 명령이다. 특정 포트를 지정해서 연결할 수 있는 기능이 있어 호스트의 포트 오픈 여부를 확인할 때도 자주 사용한다. 서버에는 listening 하고 있지만 방화벽과 같이 경유하는 네트워크 관련 장비에서의 포트 오픈 여부를 확인할때 유용하다.

 

netstat -an 명령

서비스 포트가 서버에서 정상적으로 리스닝되고 있는지, 명령을 수행한 호스트와 연결된 TCP 세션의 상태를 확인할 수 있다.

 

netstat -s -p [protocol] 명령

옵션 s는 시스템 부팅 이후 각 프로토콜별 누적 통계를 조회하는 명령이다. netstat -s만 사용하면 IP, UDP, TCP 등 기본적인 프로토콜에 대한 통계가 한 번에 표시된다.

 

출처: 권문수, [실무로 배우는 시스템 성능 최적화], 위키북스, 2016, 746~760p

반응형

'네트워크' 카테고리의 다른 글

6. UDP & 기타 프로토콜  (0) 2021.10.16
4. TCP(Transmission Control Protocol)_전송보장  (0) 2021.10.02
3. IP 프로토콜 네트워크 체크 명령  (0) 2021.08.08
2. IP(Internet Protocol)  (0) 2021.08.01
1. 네트워크 기초  (0) 2021.07.27

댓글