클라 서버 1-1 대응되며 양방향 통신한다.
신뢰성과 순서를 보장한다
full duplex data :
양방향 데이터 흐름이 가능하며, 같은 연결에서 동시에 송신과 수신이 가능.
MSS (Maximum Segment Size):
TCP는 한 번에 전송할 수 있는 최대 세그먼트 크기(MSS)
MSS이하로 세그먼트를 나눠 전송한다.
MSS의 크기는 최대 전송 단위(MTU 패킷에 링크레이어 헤더까지 붙인 것) 보다 작아야함
누적 ACK (Cumulative ACKs) 사용
파이프라이닝 (Pipelining)
혼잡 제어(congestion control)와 흐름 제어(flow control) 메커니즘을 통해 네트워크와 수신자의 상태에 맞게 전송할 수 있는 데이터의 양을 조절
(네트워크의 혼잡이 크면 내 패킷을 보내는 속도를 줄인다 -> 윈도우 사이즈를 줄인다)
연결 지향 (Connection-oriented)
handshaking
흐름 제어 (Flow Control)
혼잡은 고려 X, 리시버의 버퍼가 overflow하지 않도록 전송을 조절

시퀀스 번호
각 세그먼트의 첫 번째 바이트의 위치를 나타냄
ACK 번호
ACK 번호는 수신자가 다음에 기대하는 바이트의 시퀀스 번호를 나타냄

TCP는 타이머를 1개 사용한다.
타이머를 사용 할 때는 타임아웃의 시간을 적절히 설정하는 것이 중요하다.
➡️ RTT보다 조금 더 긴 시간을 기준으로 설정한다.
RTT는 패킷을 보내고 ACK를 받을 떄 까지 걸리는 시간이다.
RTT는 전송마다 다 다르기 떄문에 평균 RTT를 구해야 한다.
평균을 구할 때 최근 RTT에 가중치를 두어 지수가중이동평균(EWMA)을 구한다.

하지만 이 평균을 그대로 사용한다면 도착하는 패킷의 절반 정도는 타임아웃이 발생할 것이다.
때문에 평균보다 조금 높은 값을 선택햐야한다.
➡️ 편차 * 4 를 평균에 더한 값을 타임아웃 시간으로 정한다.
편차또한 가장 최근 RTT의 편차에 대해 가중치를 부여한다.

timeout interval= 평균 RTT + 4 * 편차

송신자는 ACK를 못 받은 가장 오래된 패킷에 대해 타이머를 유지한다
TCP 수신자의 ACK을 생성하는 상황을 살펴보자.
1,2,3,4 패킷을 보냈는데 순서대로 잘 도착한 상황.
➡️ ACK1, ACK2, ACK3, ACK4를 다 보내는 것은 낭비이다.
➡️ ACK를 바로 보내지 않고 500ms 기다렸다 가장 최근의 ACK 만 보냄
1,2,3,4 패킷을 보냈는데 ACK가 loss발생하고 4에 대한 ACK (ACK 5)만 도착.
➡️ 어쩄든 ACK 5 가 도착했으니 4패킷까진 잘 받았구나 알수 있다.
➡️ 누적 ACK이기 떄문에 가능
(ACK 5 인 이유는 TCP에서 ACK는 다음 기대하는 시퀀스 번호이므로 ACK4가 아니라 ACK 5이다.)

1,2,3,4 패킷을 보냈는데 3번이 loss발생하고 4는 도착.
(기대하는 시퀀스번호 < 도착한 패킷의 시퀀스 번호)
➡️ 가장 마지막으로 보냈던 ACK인 중복 ACK를 보냄
➡️ 예시에서 보냈었던 ACK 3 번을 다시 보냄
1,2,3,4 패킷을 보냈는데 3번이 loss발생하고 4에 대한 ACK가 도착,
그 후 3이 재전송 되어 수신한 상황
➡️ 즉시 그에 대한 ACK를 보냄 (ACK 4)
(여기서 이전에 도착했던 4번 패킷을 버퍼링을 통해 유지할지 drop할지는 구현의 문제이다)



loss 발생으로 중복 ACK가 3개 이상 오면 타임아웃 전에 빠른 재전송을 한다.
타임아웃을 기다리는 것은 오버헤드가 크다
떄문에 타임아웃이 오기 전에 loss를 감지해서 빠르게 재전송을 할 수 있다.

GBN과 TCP의 신뢰적 데이터 전송의 비교
공통점 - 순차적 데이터 도착, 재전송, 슬라이딩 윈도우
차이점 - TCP는 빠른 재전송 가능