가득찬 양방향의 데이터(full duplex data)
같은 연결 내에서 양방향의 데이터 흐름
MSS: Maximum Segment Size
연결 지향적(connection-oriented)
데이터를 교환하기 전에 handshaking 과정을 거친다.
흐름 제어(flow controlled)
수신자의 용량에 넘치도록 데이터를 보내지 않는다.
1:1(point-to-point)
하나의 송신자, 수신자
신뢰성 있는(reliable), 순서가 보장되는(in-order)
파이프라이닝(pipelined)
- 데이터 흐름의 첫 번째 바이트는 0번으로 지정된다.
예제 1: File은 500,000 바이트, MSS는 1,000 바이트.
MSS vs MTU
MSS: Maximum Segment Size
MTU: Maximum Transmission Unit
예제 2: 호스트 A가 호스트 B로부터 0~535까지 바이트와 900~1000까지 바이트를 받았다고 하자.
TCP는 스트림에서 첫 번째 누락된 바이트까지만 바이트를 인식하기 때문에, TCP는 누적된 ACK(cumulative acknowledgements)을 제공한다.
처음: 랜덤한 난수로 지정된 시퀀스 번호(Initial sequence number)
그 이후: Initial sequence number(ISN) + 전송한 바이트의 수
다른 측에서 올 것이라고 예상되는 seq # 번호.
누적된 ACK 방식.
위의 그림에서는 클라이언트와 서버의 시퀀스 번호가 각각 42와 79로 시작.
보내는 데이터의 바이트 수가 1이기에 +1씩 된 것임.
하지만 RTT의 값은 변화한다!
- timeout이 너무 짧다면? - 일찍 timeout이 될 수 있고, 불필요한 재전송이 일어날 수 있다.
- timeout이 너무 길다면? - 세그먼트 손실에 대해 느리게 반응한다.
- SampleRTT는 달라지기에, estimated RTT를 "smoother"하게 만들어야 한다.
- 주로 a = 0.125 이다.
Estimated RTT + safety margin
TCP는 IP를 신뢰할 수 없기에 그 위에 rdt 서비스를 만든다.
파이프라이닝 된 세그먼트
누적된 ACKs
단일의 재전송 타이머
재전송의 유발 요소
- timeout 이벤트
- 중복된 ACKs
중복된 ACKs를 무시한다.
흐름 제어와 혼잡 제어를 무시한다.
재전송을 통해 수신자는 Seq=92를 받았지만, 이전에 Seq=100, 20 bytes의 data 까지 받았다는 뜻으로 ACK=120을 보낸다!
중복된 ACKs를 통해서 잃어버린 세그먼트를 탐색한다.
TCP 빠른 재전송
송신자가 같은 데이터에 대해서 3 ACKs("triple duplicate ACKs)를 받으면 가장 작은 seq #를 가지고 있는 unACKed 세그먼트를 재전송한다.
TCP는 흐름 제어 서비스를 어플리케이션에 제공한다.
왜?
: 송신자가 수신자의 버퍼를 넘치게 하는 가능성을 제거하기 위해서!
어떻게?
: TCP는 송신자가 수신 창이라는 변수를 유지 관리하도록 하여 흐름 제어를 제공한다.
송신자가 TCP 연결을 통해 수신자에게 큰 파일을 보내고 있다고 가정하자.
수신자는 이 연결에 수신 버퍼를 할당하고, RcvBuffer로 그 크기를 나타낸다.
RcvBuffer의 크기는 소켓 옵션에 설정되어있다.(주로 4096 바이트 크기)
수신자는 수신자 대 송신자 세그먼트의 TCP 헤더에 rwnd 값을 포함함으로써 사용 가능한 버퍼 공간을 "광고"한다.
송신자는 unACKed("in-flight") 데이터의 양을 수신자의 rwnd 값으로 제한하여 수신자의 버퍼가 넘치지 않도록 한다!
데이터를 교환하기 전에, 송신자와 수신자는 "handshake"를 진행한다.
TCP 연결은 3-way handshake가 기반이 된다!
클라이언트, 서버 각각이 연결 측면을 닫는다.
FIN bit가 1인 TCP 세그먼트를 보낸다.
수신한 FIN에 ACK로 응답한다.