Ch 4. TCP(2) - TCP 연결과 흐름제어
TCP 연결 설정
- 능동적 열림(Active open)
- 클라이언트는 서버가 열어 놓은 포트로 TCP연결을 요청
- 수동적 열림(Passive open)
- 서버는 네트워크 응용을 수행하기 위해 정해진 포트를 열고 클라이언트의 요청을 기다림
세 방향 핸드쉐이크(Three-way handshake)
- 두 호스트는 TCP 연결을 위해 3개의 패킷이 송/수신되어야함
- 클라이언트는 서버에게 자신을 연결하라는 의미로 클라이언트 측 SEQ번호(순서번호)와 함께 SYN = 1 플래그가 저장된 세그먼트를 전송
- 이를 수신한 서버는 클라이언트에게 이에 대한 수락으로 ACK=1, 서버를 클라이언트에 연결하라는 의미로 SYN=1 플래그를 저장하며 클라이언트로부터 수신한 패킷의 SEQ+1를 ACK필드 값에, 서버 측의 순서번호를 SEQ필드에 저장하여 전송
- 서버로부터 SYN 패킷가 수신된 클라이언트는 서버에게 순서번호를 인지했다는 의미로 ACK=1플래그, ACK 필드 값은 수신한 패킷의 SEQ+1로 저장하여 전송
네 방향 핸드쉐이크(Four-way handshake)
- 두 호스트의 연결 종료는 4개의 패킷으로 이루어짐
- 연결을 종료하려는 클라이언트는 서버에게 FIN 플래그 값을 1로 설정하여 전송
- 이를 수신한 서버는 메시지 정상 수신에 대한 응답으로 ACK 메시지를 전송, 서버 측 응용 프로그램에게 클라이언트가 연결을 종료하려고함을 알림
- 응용 프로그램이 연결 종료에 대한 처리를 한 서버는 서버 측 또한 연결을 종료하기 위해 FIN=1 플래그가 담긴 ACK 메시지를 전송(ACK 필드 값은 2의 ACK 필드 값과 동일)
- 이를 수신한 클라이언트는 ACK 메시지를 보내 서버에게 해당 메시지가 정상 수신됨을 알려줌 이를 수신한 서버는 연결을 종료, 클라이언트는 서버로부터 누락된 패킷을 확인하기 위해 일정 시간 대기한 후 종료(Time-Waited 타이머)
TCP 흐름 제어
- 데이터 통신에서 송신측의 데이터 전달 속도가 수신측의 처리 속도보다 빠르다면 데이터의 손실과 같은 문제가 발생할 수 있음
- 수신자가 송신되는 데이터의 크기 및 속도를 제어하여 문제의 발생을 방지
슬라이딩 윈도우

- 수신측에서 설정한 윈도우 크기만큼 송신측에서 수신측의 확인응답 없이 TCP 패킷을 전송할 수 있게 하여 흐름을 동적으로 제어하는 기법
- 윈도우 크기: 전송했으나 아직 확인 응답 받지 못한 데이터 크기 + ACK 없이 전송할 수 있는 데이터의 크기
- 송신 윈도우의 범위는 수신측 여유 버퍼 공간을 반영하여 동적으로 변화함(세그먼트의 window size 필드에 송신 측이 보낼 수 있는 윈도우 크기를 설정하여 전송)
비정상 윈도우 신드롬(Silly Window Syndrome)
- 슬라이딩 윈도우 사용의 부적절한 결과
- 송신측 응용프로그램이 전송하는 데이터 크기가 작은 경우 IP헤더, TCP헤더가 붙어 1바이트의 전송에도 40바이트가 추가적으로 전송되야 함, 이는 최악의 전송 효율을 나타냄
Nagle 알고리즘
- 비정상 윈도우 신드롬을 해결하기 위한 송신측 알고리즘
- 전송할 데이터를 어느정도 모아 한번에 전송하는 방법
- 송신측은 다음 세 조건중 하나가 만족되는 경우에만 세그먼트를 전송
- 응용 프로그램으로부터 받은 데이터를 버퍼에 저장하고 저장된 데이터의 크기가 MSS가 된 경우
- 수신측으로부터 확인 응답을 받은 경우
- 타이머가 완료된 경우(MSS 값이 상당이 클 경우 발생)
- 네트워크와 응용 프로그램의 데이터 처리 요구를 동시에 고려함
- 네트워크 처리 속도가 빠르다면 작은 세그먼트에 대해서도 신속한 처리가 가능 (ACK 수신)
- 네트워크 처리 속도가 느리다면 데이터를 모아서 전송, 네트워크의 불필요한 오버헤드를 줄일 수 있음
Clark 해결책
- 비정상 윈도우 신드롬을 해결하기 위한 수신측 알고리즘
- 수신측 윈도우 크기가 0이 되었을 경우 수신 버퍼가 최대 세그먼트 크기만큼 남았을 때 또는 버퍼의 여유 공간이 버퍼 크기의 절반이 될 때 까지 수신 윈도우 크기를 0으로 하여 ACK 전송
지연 확인 응답(Delayed Acknowledgement)
- 수신 버퍼에 충분한 공간이 생기기 전에는 확인 응답을 보내지 않음
- 수신측은 여분의 버퍼 공간을 확보할 수 있음
- 송신 측에서의 재전송이 계속 발생할 수 있으므로 200ms마다 ACK 송신
슬로우 스타트(Slow Start)
- 송신 측에서 네트워크 상태에 따라 흐름을 제어하는 기법
- 네트워크의 전송 처리 능력을 반영하기 위해 혼잡 윈도우(congestion window)를 두어 전송 속도를 제어
- 혼잡 윈도우는 확인 응답을 받을 때마다 증가
- MSS 크기만큼의 세그먼트 단위 혼잡윈도우를 이용
- cwnd=1에서부터 시작하여 ACK 세그먼트의 수신시마다 1씩 증가함
- 1개 세그먼트 송신 -> 1개 ACK 세그먼트 수신 -> 2개 세그먼트 송신 -> 2개 ACK 세그먼트 수신 -> 4개 세그먼트 송신 -> 4개 ACK 세그먼트 수신 -> ~
- 실제 송신측에서 ACK 없이 전송 가능한 윈도우의 크기는 min(수신측 윈도우 크기, 혼잡 윈도우 크기)
TCP 혼잡 제어
- 세그먼트 수가 네트워크 장비의 큐 용량보다 많이 도착했을 경우 큐는 오버플로우가 발생하여 세그먼트를 폐기함 (혼잡)
- 혼잡으로 인한 전송 지연때문에 세그먼트를 재전송한다면 이는 더 큰 혼잡을 초래한다
혼잡 윈도우
- TCP는 네트워크 혼잡 상황을 반영하기 위해 혼잡 윈도우(cwnd)를 사용
- 임계값(SlowStart Threshold size)보다 작을 경우 cwnd는 2배씩 증가
혼잡 회피(Congestion Avoidence)
- 혼잡 윈도우 크기(cwnd)와 슬로우 스타트 임계값 값에 의해 제어
- 주어진 연결에 대해 cwnd는 1, 임계값은 65,535로 초기화
- 혼잡 윈도우 크기가 임계값에 도달할 경우 혼잡 회피 모드로 돌입
- 혼잡 회피 모드에서는 cwnd는 윈도우 안의 모든 세그먼트들이 확인 되었을 때에만 1씩 증가
- 혼잡 윈도우의 다중 감소 기법을 사용
- 혼잡이 타임아웃에 의해 발생했다면 cwnd는 1부터 재시작
- 임계값(ssth)는 cwnd의 절반으로 설정
- 슬로우 스타트 모드로 동작
- 중복 확인 응답(duplicated ACK)에 의해 혼잡이 발생한 경우 신속한 재전송 기법 사용
신속한 재전송
- 세그먼트가 누락된 경우 수신측은 순서가 다른 세그먼트를 받음
- 수신측은 누락된 세그먼트를 수신할 때까지 누락된 세그먼트를 요청하는 확인 응답을 반복
- 송신측은 누락된 세그먼트에 대한 확인 응답 수신시 두가지를 고려
- 세그먼트 전송 지연: 도착할 세그먼트이므로 재전송하지 않음
- 세그먼트 분실: 세 개의 중복된 확인응답 메시지를 수신할 때까지 기다리도록 권장
- 세 개의 중복된 확인응답(Duplicated ACK) 수신시 재전송 타이머의 타임아웃을 기다리지 않고 해당 세그먼트에 대한 재전송을 수행
- RTO 값은 그대로 유지(네트워크 혼잡상황이 아닌 특정 세그먼트의 손실)
- cwnd는 현재의 $\frac{1}{2}$로 변경, 혼잡 회피 모드로 동작
- 누락되었던 세그먼트 수신시 수신한 모든 세그먼트에 대해 누적 확인 응답을 전송

신속한 복구
- 손실된 세그먼트에 대해 신속한 재전송을 수행하면 혼잡 회피는 수행하지만 슬로우 스타트는 수행하지 않음
- 중복된 확인응답을 수신했다는 것은 다른 세그먼트는 정상적으로 수신되고 있음을 의미
- 두 호스트 간의 데이터 전송량을 급격히 줄이지 않기 위해 사용
출처: 정진욱, 김현철 공저. “TCP/IP와 인터넷”, pp 194-233. 2004. (주)생능출판사