순서 번호와 확인 응답 번호
- TCP 세그먼트 헤더에서 가장 중요한 필드
- TCP의 신뢰적인 데이터 전송 서비스의 중대한 부분
순서 번호의 사용
- 일련의 전송된 세그먼트에 대해가 아닌, 전송된 바이트 스트림에 대한 관점을 반영
- TCP는 데이터를 구조화하지 않고, 순서대로 정렬되어 있는 바이트 스트림으로 봄
- TCP는 데이터를 구조화하지 않고, 순서대로 정렬되어 있는 바이트 스트림으로 봄
- 세그먼트에 대한 순서 번호
→ 세그먼트에 있는 첫 번째 바이트의 바이트 스트림 번호 - 실제 TCP 연결 양쪽 모두 시작 순서 번호를 임의로 선택
→ 종료 이후에도 네트워크에 남아있던 세그먼트와의 오인될 확률을 최소화하기 위해
→ 같은 호스트 간의 나중 연결을 위해서
순서 번호 사용 예시
- 가정
- 호스트 A 프로세스는 TCP 연결상에서 호스트 B의 프로세스로 데이터 스트림의 전송을 원함
- 호스트 A의 TCP는 데이터 스트림의 각 바이트에 암시적으로 순서 번호를 지정
- 데이터 스트림은 500,000 Bytes로 구성된 파일이라고 가정
- MSS는 1000 Bytes
- 데이터 스트림의 첫 번째 바이트는 0으로 설정
- 세그먼트 구성
- TCP는 데이터 스트림으로부터 500개의 세그먼트들을 구성
- 첫 번째 세그먼트 → 순서 번호 0
- 두 번째 세그먼트 → 순서 번호 1000…
- 세 번째 세그먼트 → 순서 번호 2000… 같은 식으로 할당
- 각각의 순서 번호는 적절한 TCP 세그먼트의 헤더 내부의 순서 번호 필드에 삽입됨
- TCP는 데이터 스트림으로부터 500개의 세그먼트들을 구성
확인 응답 번호의 사용
- 호스트 B에서 A로 도착한 각 세그먼트는 호스트 A에 들어온 B의 데이터에 대한 순서 번호를 갖는다.
- TCP는 전이중 방식이기 때문에 A가 B에게 송신하는 동안에 수신도 가능
- 호스트 A가 자신의 세그먼트에 삽입하는 확인응답 번호는
호스트 A가 원하는 B의 데이터 다음 바이트 순서 번호이다.
확인 응답 번호 예시
- 가정
- 호스트 A가 B로부터 0 ~ 535까지 번호가 붙은 모든 바이트를 수신
- 호스트 B로 세그먼트를 송신하려 한다고 가정
- 송신 과정
- 호스트 A는 호스트 B의 데이터 스트림에서 536번째 바이트와 이후의 모든 바이트를 기다림
- 호스트 A는 세그먼트의 확인응답 번호 필드에 536을 삽입하고 세그먼트를 B에 송신
누적 확인응답 예시
- 가정
- 호스트 A가 호스트 B로부터 0 ~ 535 바이트를 포함하는 세그먼트,
900 ~ 1000의 바이트를 포함하는 또 다른 세그먼트를 수신 - 호스트 A는 아직 536 ~ 899의 바이트를 아직 수신하지 않았음
- 호스트 A가 호스트 B로부터 0 ~ 535 바이트를 포함하는 세그먼트,
- 호스트 A는 B의 데이터 스트림을 재생성하기 위해 536번째와 그다음 바이트를 아직 기다림
→ B에 대한 A의 다음 세그먼트는 확인응답 번호 필드에 536을 가진다.
→ 스트림에서 잃어버리기 전까지의 바이트까지만 확인응답
→ TCP는 누적 확인응답(cumulative acknowledgement)을 제공
세그먼트의 순서가 바뀔 때
- 위의 예시는 세 번째 세그먼트(9001000)가 두 번째 세그먼트(536899)보다 먼저 수신됨
→ 세 번째 세그먼트는 순서가 틀리게 도착했음 - TCP 연결에서 순서가 바뀐 세그먼트를 수신할 때 호스트에 어떤 행동을 하는가?
- 기본적으로 2가지 선택지가 존재
- 수신자가 순서가 바뀐 세그먼트를 즉시 버린다.
- 수신자 설계를 단순화할 수 있다.
- 수신자 설계를 단순화할 수 있다.
- 수신자는 바뀐 데이터를 보유하고, 빈 공간에 잃어버린 데이터를 채우기 위해 기다린다.
- 네트워크 대역폭 관점에서는 효율적이며, 실제로 취하는 방법
- 수신자가 순서가 바뀐 세그먼트를 즉시 버린다.
- 기본적으로 2가지 선택지가 존재
텔넷을 통한 순서 번호와 응답확인 번호 사례
- 텔넷을 통하면 TCP 순서와 확인응답 번호를 이해하는데 좋다.
텔넷 세션 과정
- 호스트 A와 호스트 B와 텔넷 세션을 시작
- 호스트 A가 세션을 시작한다고 가정 → A가 클라이언트, B가 서버가 됨
클라이언트 입력 송신
- 클라이언트에서 사용자가 입력한 각 문자는 원격 호스트에서 송신
- 원격 호스트는 각 문자의 복사본을 송신자에게 반송하여 텔넷 사용자 화면에 표시
→ 각 문자는 입력과 사용자 모니터 표시되는 시간 사이에 네트워크를 두 번 횡단
에코 백(echo back)
: 텔넷 사용자가 보는 문자가 원격 사이트에 수신되고 처리됐음을 알림
클라이언트와 서버 사이에서 송신되는 TCP 세그먼트
- 가정
- 사용자가 하나의 문자 ‘C’를 입력하고, 커피를 마신다고 가정
- 클라이언트 초기 순서 번호 = 42
→ 클라이언트에서 송신된 첫 번째 세그먼트는 순서 번호 42를 가진다. - 서버 초기 순서 번호 = 79
→ 서버로부터 송신된 첫 번째 세그먼트는 순서 번호 79를 가진다. - 확인 응답 번호 - 호스트가 기다리는 데이터의 다음 바이트의 순서 번호
→ TCP 연결 설정 후, 송신 전에 클라이언트는 바이트 79., 서버는 바이트 42를 기다림
- 과정
- 클라이언트에서 서버로 첫 번째 세그먼트가 송신된다.
- 세그먼트는 데이터 필드 안에 문자 ‘C’의 1바이트 표현을 포함
- 첫 번째 세그먼트에 순서 번호 필드 42를 가진다.
- 클라이언트는 서버로부터 아무 데이터도 수신받지 못했음
→ 첫 번째 세그먼트의 확인 응답 번호 필드에 79를 가짐
- 서버에서 클라이언트로 두 번째 세그먼트 송신 - 2가지 목적을 갖는다.
- 수신하는 서버에게 데이터에 대한 확인응답을 제공
- 확인응답 필드 안에 43을 넣음
→ 클라이언트에게 바이트 42를 수신했고, 바이트 43을 기다린다는 것을 알림
- 확인응답 필드 안에 43을 넣음
- 문자 ‘C’를 반대로 반향 되도록 하는 것
→ 두 번째 세그먼트는 데이터 필드에 ‘C’의 ASCII 표현을 한다.
→ 두 번째 세그먼트는 순서 번호 79를 가진다- 순서 번호 79 : TCP 연결의 서버-클라이언트 데이터 흐름의 최초 순서 번호
→ 서버가 보내는 데이터의 맨 첫 번째 바이트
- 순서 번호 79 : TCP 연결의 서버-클라이언트 데이터 흐름의 최초 순서 번호
- 클라이언트/서버 데이터에 대한 확인응답은
서버와 클라이언트 간에서 데이터를 운반하는 세그먼트 안에서 전달된다.
→ 이러한 확인응답은 데이터 세그먼트 상에서피기백(piggybacked)
된다라고 표현
- 수신하는 서버에게 데이터에 대한 확인응답을 제공
- 세 번째 세그먼트가 클라이언트에서 서버로 송신됨
- 서버로부터 수신한 데이터에 대한 확인응답을 하는 것이 목적
- 세 번째 세그먼트는 빈 데이터 필드를 갖는다.
→ 확인 응답은 어떤 클라이언트-서버 데이터와 함께 피기백 되지 않는다.
- 데이터를 포함하지 않아도 순서 번호를 갖는다.
← TCP가 순서 번호 필드를 가지고 있기 때문에
- 데이터를 포함하지 않아도 순서 번호를 갖는다.
- 세그먼트는 확인응답 번호 필드 80을 갖는다.
← 클라이언트 순서 번호 79의 바이트를 통해 바이트 스트림을 수신했기 때문
- 80으로 시작하는 바이트를 기다린다.
- 클라이언트에서 서버로 첫 번째 세그먼트가 송신된다.