TCP 연결
TCP는 두 프로세스가 서로 '핸드셰이크'를 먼저 해야 하므로 연결지향형(connection-oriented)이다. 즉, 데이터 전송을 보장하는 파라미터들을 각자 설정하기 위한 사전 세그먼트들을 보내야 한다. 두 호스트 사이에 3개의 세그먼트가 보내지므로, 이 연결 설정 절차는 흔히 '세 방향' 핸드셰이크(three-way-handshake)라 부른다.
TCP는 TCP 헤더와 클라이언트 데이터를 하나로 만들어 TCP 세그먼트를 형성한다. 세그먼트는 네트워크 계층에 전달되며, 네트워크 계층 IP 데이터그램 안에 각각 캡슐화된다.
TCP 세그먼트 구조
TCP 세그먼트는 헤더 필드와 데이터 필드로 구성되어 있다. 데이터 필드는 애플리케이션 데이터를 담는다. MSS는 세그먼트의 데이터 필드의 크기를 제한한다.
왕복시간(RTT) 예측과 타임아웃
SampleRTT는 세그먼트가 송신된 시간으로부터 그 세그먼트에 대한 긍정응답이 도착한 시간까지 시간 길이다. 대부분의 TCP는 한 번에 하나의 SampleRTT 측정을 시행한다. 이는 라우터에서의 혼잡과 종단 시스템에서의 가변 부하 때문에 세그먼트마다 불규칙적이다. 따라서 RTT를 추정하기 위해 SampleRTT의 평균값인 EstimatedRTT를 채택한다.
EstimatedRTT = ( 1 - a ) EstimatedRTT + a SampleRTT
RTT의 변화율을 측정하는 것도 유용한데 이는 DevRTT로 SampleRTT가 EstimatedRTT로부터 얼마나 벗어나는지에 대한 예측으로 정의한다.
DevRTT = ( 1 - b ) DevRTT + b | SampleRTT - EstimatedRTT |
재전송 타임아웃 주기를 설정하는 것은 중요한데 타임아웃 값은 EstimatedRTT에 약간의 여유값을 더한 값으로 설정하는 것이 가장 좋다.
TimeoutInterval = EstimatedRTT + 4 DevRTT
신뢰적인 데이터 전달
TCP는 IP의 비신뢰적인 최선형 서비스에서 신뢰적인 데이터 전달 서비스(reliable data transfer service)를 제공한다. 타임아웃이 유발하는(timeout-triggered) 재전송의 한 가지 문제는 타임아웃의 주기가 때때로 비교적 길다는 것이다. 세그먼트를 잃었을 때, 긴 타임아웃 주기는 종단간의 지연을 증가시킨다. 다행히, 송신자는 중복 ACK에 의한 타임아웃이 일어나기 전에 패킷 손실을 발견한다. 중복 ACK는 송신자가 이미 이전에 받은 확인응답에 대한 재확인응답 세그먼트 ACK이다.
송신자는 종종 많은 양의 세그먼트를 연속적으로 보낼 수 있으므로, 만약 하나의 세그먼트를 잃어버린다면, 많은 연속적인 중복 ACK들이 존재할 수 있다. 만약 TCP 송신자가 같은 데이터에 대해 3개의 중복 확인응답을 수신한다면, 이것은 ACK된 세그먼트의 다음 3개의 세그먼트들이 분실되었음을 의미한다. 3개의 중복 ACK를 수신하는 경우에는 TCP는 세그먼트의 타이머가 만료되기 이전에 손실 세그먼트를 재전송하는 빠른 재전송(fast retransmit)을 한다.
흐름 제어(TCP Flow Control)
TCP 연결의 각 종단에서 호스트들은 연결에 대한 개별 수신 버퍼를 설정한다. TCP 연결이 순서대로 올바르게 바이트를 수신할 때, TCP는 데이터를 수신 버퍼에 저장한다. 이 버퍼를 오버플로우시키는 것을 방지하기 위해서 애플리케이션에게 흐름제어 서비스(flow-control service)를 제공한다. 이처럼 흐름제어는 속도를 일치시키는 서비스이다. 즉, 수신하는 애플리케이션이 읽는 속도와 송신자가 전송하는 속도를 같기 한다는 것이다. TCP 송신자는 IP 네트워크에서 혼잡 때문에 억제될 수 있다. 송신자 제어의 이 형태는 혼잡제어(congestion control)로 불린다.
TCP 수신자가 순서가 틀린 세그먼트를 버린다고 가정한다. TCP는 송신자가 수신 윈도우(receive window)라는 변수를 유지하여 흐름제어를 제공한다. 수신 윈도우는 수신 측에서 가용한 버퍼 공간이 얼마나 되는지를 송신자에게 알려 주는 데 사용된다. TCP 연갈상에서 호스트 A가 호스트 B에게 큰 파일을 전송한다고 가정할 때, 호스트 B는 이 연결에 수신 버퍼를 할당한다. 이때 할당된 수신 버퍼의 크기를 RcvBuffer라고 하자.
LastByteRead: 호스트 B의 애플리케이션 프로세스에 의해서 버퍼로부터 읽힌 데이터 스트림의 마지막 바이트 수
LastByteRcvd: 호스트 B에서 네트워크로부터 도착하여 수신 버퍼에 저장된 데이터 스트림의 마지막 바이트 수
LastByteRcvd - LastByteRead ≤ RcvBuffer
rwnd = RcvBuffer - [LastByteRcvd - LastByteRead]
rwnd로 명명된 수신 윈도우는 버퍼의 여유 공간으로 설정된다.
rwnd의 값보타 작은 확인응답이 안 된 데이터의 양을 유지함으로써 호스트 A는 호스트 B의 수신 버퍼에 오버플로우가 발생하지 않는다는 것을 확신한다.
LastByteSent - LastByteAcked ≤ rwnd
TCP 연결 관리
1단계: 클라이언트 측 TCP는 서버 TCP에게 SYN 비트라고 불리는 하나의 플래그 비트를 가진 세크먼트를 전송한다. 이를 SYN 세그먼트라고 부른다. 추가로 클라이언트는 최초의 순서번호(client_isn)를 선택한다. 그리고 최초의 TCP SYN 세그먼트의 순서번호 필드에 이 번호를 넣는다. 이 세그먼트는 IP 데이터그램 안에서 캡슐화되고 서버로 송신된다.
2단계: TCP SYN 세그먼트를 포함하는 IP 데이터그램이 서버 호스트에 도착했을 때, 서버는 데이터그램으로부터 TCP SYN 세그먼트를 뽑아낸다. 그리고 연결에 TCP 버퍼와 변수를 할당한다. 또한 클라이언트 TCP로 연결 승인 세그먼트를 송신한다. 이 세그먼트는 1. SYN 비트는 1로 설정한다. 2. TCP 세그먼트 헤더의 확인응답 필드는 client_isn+1로 설정된다. 3. 서버는 자신의 최초의 순서번호(server_isn)를 선택하고 TCP 세그먼트 헤더의 순서번호 필드에 이 값을 넣는다. 이 세그먼트를 SYNACK 세그먼트라고 한다.
3단계: 연결 승인 세그먼트를 수신하면 클라이언트는 연결에 버퍼와 변수들을 할당한다. 그 다음 클라이언트 호스트는 서버로 또 다른 세그먼트를 송신한다. 이 마지막 세그먼트가 서버의 연결 승인 세그먼트를 확인한다. 연결이 설정되면 SYN 비트는 0으로 바뀌고 세 방향 행드셰이크의 세 번째 단계는 클라이언트에서 서버로 세그먼트 페이로드에 데이터가 운반될 수 있다.
'2-2 > 컴퓨터네트워크' 카테고리의 다른 글
혼잡제어의 관리(Congestion Control) (5) | 2023.11.14 |
---|---|
파이프라인된 신뢰적 데이터 전송 프로토콜 (3) | 2023.11.12 |
신뢰적인 데이터 전달 프로토콜의 구축 - rdt 1.0/2.0/2.1/2.2/3.0 (1) | 2023.11.12 |