0. TCP는 신뢰적인 데이터 전송을 보장

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 수신측 정리

3. TCP 는 GBN 과 SR의 혼합물

Untitled

4. 타임아웃 시간 재설정