Network/Network Composition

시퀀스 번호(Sequence Number)와 ACK(Acknowledge Number)

seongduck 2022. 12. 20. 21:11

이 작동을 하는 TCP먼저 알아보자

 

TCP 프로토콜의 역할


  • 신뢰할 수 없는 공용망에서 정보 유실이 없는 통신을 보장하기 위해 세션을 안전하게 연결
  • 데이터 분할 기능
  • 분할된 데이터 패킷이 잘 전송됐는지 확인하는 기능
    • 패킷에 번호(Sequence Number)를 부여하고 잘 전송됐는지 응답(Acknowledge Number)한다.
    • 수신자를 고려하여 전송 크기(Window Size)를 고려하여 통신

 

패킷 순서와 응답 번호


  • TCP에서는 분할된 패킷을 잘 분할하고 수신 측이 잘 조합하도록 패킷에 순서를 주고 응답 번호를 부여
  • 패킷에 순서를 부여하는 것을 시퀀스 번호
  • 응답 번호를 부여하는 것을 ACK 번호
  • 이 두 번호가 상호작용하여 중간에 순서가 바뀐것을 확인 가능

  1. 보내는 쪽에서 패킷에 번호를 부여하고 받는 쪽은 이 번호의 순서가 맞는지 확인
  2. 받은 패킷 번호가 맞으면 응답을 주는데 다음 번호의 패킷을 요청 (이 숫자를 ACK 번호라 부름)
  3. 송신 측이 1번 패킷을 보냈는데 수신 측이 이 패킷을 잘 받는다변 1번을 잘 받았으니 2번을 달라함
  4. 이 표시로 ACK 번호2를 보냄

 

양방향 통신


위 그림처럼 단방향이 아닌 양방향으로도 이뤄질 수 있다.

  1. 출발지에서 시퀀스 번호를 0으로 보냄(SEQ = 0)
  2. 수신측에서는 0번 패킷을 잘 받았다는 표시로 응답 번호(ACK)에 1을 적어 응답한다. 이때 수신측에서는 자신이 처음 보내는 패킷이므로 패킷에 시퀀스 번호 0을 부여한다. (SEQ = 0, ACK = 1)
  3. 이 패킷을 받은 송신 측은 시퀀스 번호를 1로(수신 측이 ACK 번호로 1번 패킷을 달라고 요청 했으므로), ACK 번호는 상대방의 0번 시퀀스를 잘 받았다는 의미로 시퀀스 번호를 1로 부여해 다시 송신

 

Window Size & Sliding Window


  • TCP는 상대방이 얼마나 잘 받았는지 확인하기 위해 ACK 번호를 확인 후 다음 패킷 전송
  • 패킷 전송이 잘됐는지 별도 패킷 받는 것이 통신 시간을 늘리지만 먼거리일 경우 왕복 지연시간(RTT)이 늘어나므로 훨씬 유리
    • 따라서 데이터를 패킷에 보낼 때 한꺼번에 많이 보내고 응답은 한 번만 받음
  • 이때 한 번에 데이터를 받을 수 있는 데이터 크기를 윈도 사이즈(Window Size)라고 함
  • 네트워크 상황에 따라 윈도 사이즈를 조절하는 것이 슬라이딩 윈도(Sliding Window)라고 함

윈도 사이즈 3일 경우

 

3 - HandShake (3방향 핸드셰이크)


  • TCP에서는 안전한 통신을 위해 통신 시작 전 연결 작업을 진행
    • 수신자가 준비가 안되면 데이터가 버려지기 때문
  • 3번의 패킷을 주고받으면서 통신을 서로 준비하는 것을 뜻함

 

  1. 클라이언트에서 통신을 시도할 때 Syn 패킷을 보냄(SYN - SENT라고 부름)
  2. 클라이언트의 Syn을 받은 서버는 SYN-RECEIVE 상태로 변경되고 Syn, Ack로 응답
  3. 이 응답을 받은 클라이언트는 ESTABLISHED 상태로 변경하고 그에 대한 응답을 서버로 다시 보냄
  4. 서버에서도 이 응답을 받고 ESTABLISHED 상태로 변경
    1. 이 상태는 서로 연결이 성공적으로 완료 됐음을 의미

3 핸드 셰이크

이렇게 여러 통신이 겹치면 기존 통신과 새로운 통신을 구분할 필요가 생긴다.

이를 구별하기 위해 플래그(Flag)라는 값을 넣어 통신

 

플래그(Flag) 종류


  • SYN
    • 연결 시작의 용도이며 시작될 때 SYN 플래그에 1로 표시하여 보냄
  • ACK
    • ACK 번호가 유효할 경우, 1로 표시
    • 초기 SYN 외에 모든 패킷은 기존 메세지에 대한 응답이므로 ACK 플래그는 1
  • FIN
    • 연결 종료 시 1로 표시
    • 연결 강제 종료를 위해 연결을 일방적으로 끊을 때 사용
  • URG
    • 긴급 데이터인 경우, 1로 표시해 보냄
  • PSH
    • 서버 측에서 전송할 데이터가 없거나 버퍼링 없이 데이터를 응용 프로그램으로 즉시 전달할 것을 지시할 때 사용
16비트 출발지 포트 번호 16비트 도착지 포트 번호
32비트 시퀀스 번호
32비트 ACK 번호
4비트 헤더 길이 6비트 예약 URG ACK PSH RST SYN FIN 16비트 윈도 사이즈
16비트 TCP 체크섬 16비트 긴급 포인터
옵션
데이터  

위는 TCP 헤더 내용

 

3방향 핸드셰이크 과정

  1. 통신을 처음 시도하므로 송신자는 SYN필드를 1로 표기해 패킷에 전송 
    1. 이때 자신이 사용할 첫  SEQ NO(시퀀스 번호)를 적어서 보냄
  2. 이 SYN 패킷을 받은 수신자는 SYN과 ACK 비트를 플래그에 1로 표기해 응답
    1. 자신이 보내는 첫 패킷이므로 SYN을 1로 표기
    2. 기존 송신자가 보냈던 패킷의 응답이기도 하므로 ACK 비트도 함께 1로 표기
    3. 이때 자신이 사용할 SEQ(시퀀스 번호)를 적고 ACK번호는 송신자가 보낸 시퀀스 번호(SEQ=10)에 1을 추가한 값(ACK=11)을 넣어 응답
      1. 이 ACK 번호는 10번까지 잘 받았으니 다음에는 10+1번을 달라는 의미
  3. 이때부터는 기존 메시지의 응답이므로 ACK 필드만 1로 표기됨
  4. 수신자가 ACK 번호를 20으로 표기해 보냈기 때문에 시퀀스 번호를 21로 표기해 응답
    1. 동시에 수신자의 시퀀스 번호 20에 대한 응답이므로 ACK 번호를 21로 보냄
      1. 이 ACK 번호는 20번을 잘 받았으니 다음 시퀀스 번호를 보내달라