0. TCP는 신뢰적인 데이터 전송을 보장
- 비신뢰적인 IP 위에서 신뢰적인 데이터 전송 서비스를 보장한다.
- 순서가 바뀌지 않음
- 손상이나 중복이 없음
- 손실이 없음
- 타이머가 많으면 오버헤드가 될 수 있다. → 단일 재전송 타이머를 사용
1. TCP 송신자
NextSeqNum = InitialSeqNumber
SendBase = InitialSeqNumber
while (true) {
switch (event) {
/*
TCP는 애플리케이션으로부터 데이터를 받고,세그먼트로 이 데이터를 캡슐화하고,IP에게 이 세그먼트를 넘김.
+ 바이트이 바이트 열 번호를 순서 번호로 포함.
+ 타이머가 이미 다른 세그먼트에 대해 실행 중이 아니면,이 세그먼트를 IP로 넘길 때 타이머를 시작
ㄴ= 타이머는 확인되지 않은 가장 오래된 세그먼트를 쨰깎쨰깎
ㄴ 타이머 만료 주기는 Timeoutinterval
*/
case DATA_RECEIVED_FROM_APPLICAION_ABOVE:
create TCP segment with sequence number NextSeqNum
if (timer not currently running)
start timer
pass segment to IP
NextSeqNum += length(data)
break;
/*
타임아웃 이벤트에 대해 타임아웃을 일으킨 세그먼트를 재전송하여 응답
-> 그 후, TCP의 타이머 다시 시작
*/
case TIMER_TIMEOUT:
retransmit not-yet-acknowledged segment with smallest sequence number
start timer
break;
/*
수신자로부터의 수신 확인응답 세그먼트(ACK) 수신
변수 SendBase와 ACK 값 y를 비교
- TCP 상태 변수 SendBase : 수신 확인응답이 확인되지 않은 가장 오래된 바이트의 순서 번호
(+ SendBase-1 = 수신자에게서 정확하게 차례대로 수신되었음을 알리는 마지막 바이트의 순서 번호)
- 누적 확인응답 사용 => y는 y바이트 이전의 모든 바이트의 수신 확인
- 만일 y〉SendBase이면,ACK는 이전에 확인응답 안 된 하나 이상의 세그먼트들을 확인한 것
=> 송신자는 자신의 SendBase 변수를 갱신
- 아직 확인응답 안 된 세그먼트들이 존재한다면 타이머 재시작
*/
case ACK_RECEIVED_WITH_ACK_FIELD_VAIUE_OF_y:
if (y > SendBase) {
SendBase = y
if (not-yet-acknowledged segments exist)
start timer
}
break;
}
}
2. TCP 수신측 정리
- 정상적으로 올 시 → 정상적으로 전송이 된다.
- 정상적으로 도착했는데 , 정상적인 것보다 앞 순서의 ack 대기중이면 누적된 하나의 ack 전송
- 정상적인 세그먼트가 오지 않고 그 다음 신호가 온경우, 격차가 적은 이전에 도착한 ack 중복 전송
- 이때 수신측은 가장 오래전에 도착하지 않은 것을 바라보고 있다.
⇒ 즉, 그 이전에 도착한 ack만 보낸다는 뜻
- 도착하지 않은 세그먼트들이 들어온 경우, 격차의 최소값에서 시작하다고 하면 바로바로 ack 신호를 전송
3. TCP 는 GBN 과 SR의 혼합물
- 단일 타이머로 해당 범위의 세그먼트들이 다 들어올 때까지 대기하는 것 →GBN
- 올바르게 수신 된건 모아두었다가 제대로 오지않은 세그먼트만 재전송을 요청하고 받는 것 → SR

4. 타임아웃 시간 재설정