호우동의 개발일지

Today :

article thumbnail

순서 번호와 확인 응답 번호

  • TCP 세그먼트 헤더에서 가장 중요한 필드
    • TCP의 신뢰적인 데이터 전송 서비스의 중대한 부분

 


순서 번호의 사용

  • 일련의 전송된 세그먼트에 대해가 아닌, 전송된 바이트 스트림에 대한 관점을 반영
    • TCP는 데이터를 구조화하지 않고, 순서대로 정렬되어 있는 바이트 스트림으로 봄

  • 세그먼트에 대한 순서 번호
    → 세그먼트에 있는 첫 번째 바이트의 바이트 스트림 번호

  • 실제 TCP 연결 양쪽 모두 시작 순서 번호를 임의로 선택
    → 종료 이후에도 네트워크에 남아있던 세그먼트와의 오인될 확률을 최소화하기 위해
    → 같은 호스트 간의 나중 연결을 위해서

 

순서 번호 사용 예시

순서번호

  • 가정
    • 호스트 A 프로세스는 TCP 연결상에서 호스트 B의 프로세스로 데이터 스트림의 전송을 원함
    • 호스트 A의 TCP는 데이터 스트림의 각 바이트에 암시적으로 순서 번호를 지정
    • 데이터 스트림은 500,000 Bytes로 구성된 파일이라고 가정
    • MSS는 1000 Bytes
    • 데이터 스트림의 첫 번째 바이트는 0으로 설정

  • 세그먼트 구성
    • TCP는 데이터 스트림으로부터 500개의 세그먼트들을 구성
      • 첫 번째 세그먼트 → 순서 번호 0
      • 두 번째 세그먼트 → 순서 번호 1000…
      • 세 번째 세그먼트 → 순서 번호 2000… 같은 식으로 할당

    • 각각의 순서 번호는 적절한 TCP 세그먼트의 헤더 내부의 순서 번호 필드에 삽입됨

 


확인 응답 번호의 사용

  • 호스트 B에서 A로 도착한 각 세그먼트는 호스트 A에 들어온 B의 데이터에 대한 순서 번호를 갖는다.
    • TCP는 전이중 방식이기 때문에 A가 B에게 송신하는 동안에 수신도 가능
    • 호스트 A가 자신의 세그먼트에 삽입하는 확인응답 번호는
      호스트 A가 원하는 B의 데이터 다음 바이트 순서 번호이다.

 

확인 응답 번호 예시

  • 가정
    • 호스트 A가 B로부터 0 ~ 535까지 번호가 붙은 모든 바이트를 수신
    • 호스트 B로 세그먼트를 송신하려 한다고 가정

  • 송신 과정
    1. 호스트 A는 호스트 B의 데이터 스트림에서 536번째 바이트와 이후의 모든 바이트를 기다림
    2. 호스트 A는 세그먼트의 확인응답 번호 필드에 536을 삽입하고 세그먼트를 B에 송신

 

누적 확인응답 예시

  • 가정
    • 호스트 A가 호스트 B로부터 0 ~ 535 바이트를 포함하는 세그먼트,
      900 ~ 1000의 바이트를 포함하는 또 다른 세그먼트를 수신
    • 호스트 A는 아직 536 ~ 899의 바이트를 아직 수신하지 않았음

  • 호스트 A는 B의 데이터 스트림을 재생성하기 위해 536번째와 그다음 바이트를 아직 기다림
    B에 대한 A의 다음 세그먼트는 확인응답 번호 필드에 536을 가진다.
    → 스트림에서 잃어버리기 전까지의 바이트까지만 확인응답
    → TCP는 누적 확인응답(cumulative acknowledgement)을 제공

 

세그먼트의 순서가 바뀔 때

  • 위의 예시는 세 번째 세그먼트(9001000)가 두 번째 세그먼트(536899)보다 먼저 수신됨
    → 세 번째 세그먼트는 순서가 틀리게 도착했음

  • TCP 연결에서 순서가 바뀐 세그먼트를 수신할 때 호스트에 어떤 행동을 하는가?
    • 기본적으로 2가지 선택지가 존재
      1. 수신자가 순서가 바뀐 세그먼트를 즉시 버린다.
        • 수신자 설계를 단순화할 수 있다.

      2. 수신자는 바뀐 데이터를 보유하고, 빈 공간에 잃어버린 데이터를 채우기 위해 기다린다.
        • 네트워크 대역폭 관점에서는 효율적이며, 실제로 취하는 방법

 

 


텔넷을 통한 순서 번호와 응답확인 번호 사례

  • 텔넷을 통하면 TCP 순서와 확인응답 번호를 이해하는데 좋다.

 


텔넷 세션 과정

  • 호스트 A와 호스트 B와 텔넷 세션을 시작
  • 호스트 A가 세션을 시작한다고 가정 → A가 클라이언트, B가 서버가 됨

 

클라이언트 입력 송신

  1. 클라이언트에서 사용자가 입력한 각 문자는 원격 호스트에서 송신
  2. 원격 호스트는 각 문자의 복사본을 송신자에게 반송하여 텔넷 사용자 화면에 표시
    → 각 문자는 입력과 사용자 모니터 표시되는 시간 사이에 네트워크를 두 번 횡단

    • 에코 백(echo back) : 텔넷 사용자가 보는 문자가 원격 사이트에 수신되고 처리됐음을 알림

 

클라이언트와 서버 사이에서 송신되는 TCP 세그먼트

클라이언트 서버 통신
클라이언트 서버 통신

  • 가정
    • 사용자가 하나의 문자 ‘C’를 입력하고, 커피를 마신다고 가정
    • 클라이언트 초기 순서 번호 = 42
      → 클라이언트에서 송신된 첫 번째 세그먼트는 순서 번호 42를 가진다.

    • 서버 초기 순서 번호 = 79
      → 서버로부터 송신된 첫 번째 세그먼트는 순서 번호 79를 가진다.

    • 확인 응답 번호 - 호스트가 기다리는 데이터의 다음 바이트의 순서 번호
      → TCP 연결 설정 후, 송신 전에 클라이언트는 바이트 79., 서버는 바이트 42를 기다림

  • 과정
    1. 클라이언트에서 서버로 첫 번째 세그먼트가 송신된다.
      • 세그먼트는 데이터 필드 안에 문자 ‘C’의 1바이트 표현을 포함
      • 첫 번째 세그먼트에 순서 번호 필드 42를 가진다.
      • 클라이언트는 서버로부터 아무 데이터도 수신받지 못했음
        → 첫 번째 세그먼트의 확인 응답 번호 필드에 79를 가짐

    2. 서버에서 클라이언트로 두 번째 세그먼트 송신 - 2가지 목적을 갖는다.
      1. 수신하는 서버에게 데이터에 대한 확인응답을 제공
        • 확인응답 필드 안에 43을 넣음
          → 클라이언트에게 바이트 42를 수신했고, 바이트 43을 기다린다는 것을 알림

      2. 문자 ‘C’를 반대로 반향 되도록 하는 것
        → 두 번째 세그먼트는 데이터 필드에 ‘C’의 ASCII 표현을 한다.
        → 두 번째 세그먼트는 순서 번호 79를 가진다
        • 순서 번호 79 : TCP 연결의 서버-클라이언트 데이터 흐름의 최초 순서 번호
          → 서버가 보내는 데이터의 맨 첫 번째 바이트

      • 클라이언트/서버 데이터에 대한 확인응답은
        서버와 클라이언트 간에서 데이터를 운반하는 세그먼트 안에서 전달된다.
        → 이러한 확인응답은 데이터 세그먼트 상에서 피기백(piggybacked)된다라고 표현

    3. 세 번째 세그먼트가 클라이언트에서 서버로 송신됨
      • 서버로부터 수신한 데이터에 대한 확인응답을 하는 것이 목적
      • 세 번째 세그먼트는 빈 데이터 필드를 갖는다.
        → 확인 응답은 어떤 클라이언트-서버 데이터와 함께 피기백 되지 않는다.

        • 데이터를 포함하지 않아도 순서 번호를 갖는다.
          ← TCP가 순서 번호 필드를 가지고 있기 때문에

      • 세그먼트는 확인응답 번호 필드 80을 갖는다.
        ← 클라이언트 순서 번호 79의 바이트를 통해 바이트 스트림을 수신했기 때문

        • 80으로 시작하는 바이트를 기다린다.