도서 정리/혼자 공부하는 네트워크

[혼자 공부하는 네트워크] Chapter 4 - 2 TCP와 UDP

라일라엘 2024. 7. 28. 22:11

TCP 통신 단계와 세그먼트 구조

TCP 통신 단계를 세 단계로 나누면 다음과 같다.

  1. 연결 수립
  2. 데이터 통신(재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어)
  3. 연결 종료

TCP는 통신하기 전에 연결을 수립하고 통신이 끝나면 연결을 종료한다. 그리고 데이터 송수신 과정에서 재전송을 위한 오류 제어, 흐름 제어, 혼잡 제어 등의 기능을 제공한다.

TCP의 연결 수립, 종료를 이해하기 위해선 MSS라는 단위와 TCP의 세그먼트 구조를 이해해야 한다.

MSS(Maximum Segment Size)는 TCP로 전송할 수 있는 최대 페이로드 크기

TCP의 세그먼트 구조는 다음과 같다

  • 송신지 포트, 수신지 포트 : 송수신지 애플리케이션을 식별하는 포트 번호가 명시된 필드
  • 순서 번호 : 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호
  • 확인 응답 번호 : 상대 호스트가 보낸 세그먼트에 대한 응답으로, 다음으로 수신하기를 기대하는 순서 번호가 명시된다
  • 제어 비트 : 플래그 비트라고도 불리며, 현재 세그먼트에 대한 부가 정보를 나타낸다
  • 윈도우 : 수신 윈도우의 크기가 명시된다. 수신 윈도우란 한 번에 수신하고자 하는 데이터의 양을 나타낸다

이 중에서 꼭 기억해야 하는 필드는 순서 번호 필드와 확인 응답 번호 필드, 그리고 관련된 제어 비트(ACK, SYN, FIN)이다.

제어 비트

제어비트는 8비트로 구성되며, 각 자리의 비트는 각기 다른 의미를 가진다. TCP의 기본 동작을 논할 때 자주 언급되는 세 개의 제어 비트는 다음과 같다.

  • ACK : 세그먼트 승인을 나타내기 위한 비트
  • SYN : 연결을 수립하기 위한 비트
  • FIN : 연결을 종료하기 위한 비트

순서 번호와 확인 응답 번호

순서 번호는 세그먼트의 올바른 송수신 순서를 보장하기 위한 번호로, 세그먼트 데이터의 첫 바이트에 부여되는 번호이다.

예를 들어 전송 계층이 1900바이트 크기의 데이터를 전송해야 하며, MSS가 500바이트라고 가정했을 때, 1900바이트짜리 데이터 덩어리를 MSS 단위로 쪼개면 네 개의 세그먼트로 쪼갤 수 있다.

처음 통신을 위해 연결을 수립한 경우 순서 번호는 무작위값이 되며, 이를 초기 순서 번호라고 한다. 초기 순서 번호가 100이라면 가장 먼저 보낼 세그먼트의 순서번호가 100이 된다. 이후 데이터를 송신할 때 순서 번호는 초기 순서번호 + 송신한 바이트 수로 설정된다. 따라서 두 번째 데이터를 송신할 때는 순서 번호가 600이 된다.

확인 응답 번호는 순서 번호에 대한 응답이다. 일반적으로 수신한 순서 번호 + 1로 설정된다.

확인 응답 번호 값을 보내기 위해서는 제어 비트에 승인을 나타내는 비트인 ACK 플래그를 1로 설정해야 한다.

TCP 연결 수립과 종료

연결 수립 : 쓰리 웨이 핸드셰이크

TCP의 연결 수립은 쓰리 웨이 핸드셰이크를 통해 이루어진다. 이는 세 단계로 이루어진 TCP 연결 수립 과정을 의미한다. 각 단계를 다음과 같이 설명할 수 있다.

  1. 송신 호스트가 수신 호스트에게 SYN 세그먼트를 보낸다. 이때 송신 호스트의 초기 순서 번호가 함께 보내진다.
  2. 수신 호스트가 송신 호스트에게 SYN + ACK 세그먼트를 보낸다. 이때 수신 호스트의 초기 순서 번호와 송신 호스트가 전송한 세그먼트에 대한 확인 응답 번호가 함께 보내진다.
  3. 송신 호스트가 다시 수신 호스트에게 ACK 세그먼트를 보낸다. 송신 호스트의 다음 순서 번호와 수신 호스트가 보낸 세그먼트에 대한 확인 응답 번호가 보내진다.

세그먼트를 받으면 그것에 대한 응답(ACK)을 보내야 한다.

이때 처음 연결을 시작하는 호스트의 연결 수립 과정을 액티브 오픈이라고 하고, 연결 요청을 받고 요청에 따라 연결을 수립하는 호스트의 연결 수립 과정을 패시브 오픈이라고 한다. 주로 서버가 패시브 오픈에 해당한다.

연결 종료

연결을 종료하는 과정은 송수신 호스트가 각자 한 번씩 FIN과 ACK를 주고받으며 이루어진다. 각 단계를 다음과 같이 설명할 수 있다.

  1. 송신 호스트가 수신 호스트에게 FIN 세그먼트를 보낸다.
  2. 수신 호스트가 송신 호스트에게 ACK 세그먼트를 보낸다. 이때 송신 호스트의 세그먼트에 대한 확인 응답 번호가 함께 보내진다.
  3. 수신 호스트가 송신 호스트에게 FIN 세그먼트를 보낸다.
  4. 송신 호스트가 수신 호스트에게 ACK 세그먼트를 보낸다. 이때 수신 호스트의 세그먼트에 대한 확인 응답 번호가 함께 보내진다.

연결 종료는 네 단계로 연결을 종료한다는 점에서 포 웨이 핸드 셰이크라고 부르기도 한다.

연결을 수립할 때와 마찬가지로 먼저 연결을 종료하는 과정에서도 액티브 클로즈패시브 클로즈가 존재한다.

TCP 상태

TCP는 연결형 통신과 신뢰할 수 있는 통신을 유지하기 위해 다양한 상태를 유지한다. 상태는 어떤 통신 과정에 있는지를 나타내는 정보이며, TCP는 상태를 유지하고 활용한다는 점에서 스테이트풀 프로토콜이라고도 불린다.

연결이 수립되지 않은 상태

  • CLOSED : 아무런 연결이 없는 상태
  • LISTEN : 일종의 연결 대기 상태. 일반적으로 서버로 동작하는 패시브 오픈 호스트는 LISTEN 상태를 유지한다.

연결 수립 상태

  • SYN-SENT : 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤 SYN+ACK 세그먼트를 기다리는 상태. 연결 요청을 보낸 뒤 대기하는 상태.
  • SYN-RECEIVED : 패시브 오픈 호스트가 SYN + ACK 세그먼트를 보낸 뒤 ACK 세그먼트를 기다리는 상태
  • ESTABLISHED : 연결이 확립되었음을 나타내는 상태로 데이터를 송수신할 수 있는 상태. 두 호스트가 마지막 ACK 세그먼트를 주고받으면 ESTABLISHED 상태로 접어들게 된다.

연결 종료 상태

  • FIN-WAIT-1 : 연결 종료의 첫 단계로, FIN 세그먼트로 연결 종료 요청을 보낸 뒤 이 상태가 된다.
  • CLOSE-WAIT : 종료 요청인 FIN 세그먼트를 받고 그에 대한 응답으로 ACK 세그먼트를 보낸 후 대기하는 상태
  • FIN-WAIT-2 : FIN-WAIT-1에서 ACK 세그먼트를 받으면 이 상태가 된다. 상대 호스트의 FIN 세그먼트를 기다리는 상태.
  • LAST-ACK : CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤 이에 대한 ACK 세그먼트를 기다리는 상태
  • TIME-WAIT : 액티브 클로즈 호스트가 FIN 세그먼트를 수신한 뒤, ACK 세그먼트를 전송한 뒤 접어드는 상태. 이 상태에서 일정 시간을 기다린 뒤 CLOSED 상태로 전이된다. 일정 시간을 기다리는 이유는, ACK 세그먼트가 제대로 전송되지 않았을 때 대응하기 위함이다.
  • CLOSING : 동시에 연결을 종료하려 할 때 전이되는 상태이다. 서로 FIN 세그먼트를 보내고 상대가 보낸 FIN 세그먼트에 대한 ACK 세그먼트를 보냈지만, 아직 상대에게 ACK 세그먼트를 받지 못한 상태이다. 이 경우 ACK 세그먼트를 수신한다면 각자 TIME-WAIT 상태로 접어든 뒤 종료한다.

UDP 데이터그램 구조

UDP는 비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜로 연결 수립 및 해제, 재전송을 통한 오류 제어, 혼잡 제어, 흐름 제어 등을 수행하지 않으며 상태도 존재하지 않는다. 때문에 스테이트리스 프로토콜의 일종이라고도 한다.

UDP 데이터그램 구조는 간단하며, 다음과 같다.

  • 송신지 포트와 수신지 포트 : 송수신지의 포트 번호
  • 길이 : 헤더를 포함한 UDP 데이터그램의 바이트
  • 체크섬 : 데이터그램 전송 과정에서 오류 발생을 검사하는 필드. 데이터그램의 훼손 여부만 점검하므로, 신뢰성/비신뢰성과는 관계없다.

TCP는 하나씩 확실하게 패킷을 전달하는 것과 같다면, UDP는 패킷을 빠르게 마구 던지는 것과 같다. 그 과정에서 패킷이 손실되거나 패킷의 순서가 바뀔 수도 있다.