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

술술·2024년 9월 6일
0

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

  • TCP는 통신하기 전에 연결을 수립하고 통신이 끝나면 연결을 종료
  • 데이터 송수신 과정에서 재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어 등의 기능을 제공
  • MSS(Maximum Segment Size) - TCP로 전송할 수 있는 최대 페이로드 크기
    • 크기를 고려할 때 TCP 헤더 크기는 제외
    • 헤더의 크기까지 포함했던 MTU와는 대조적
  • 송신지 포트와 수신지 포트
    • 송신지 또는 수신지 애플리케이션을 식별하는 포트 번호가 명시되는 필드

  • 순서 번호(sequence number)
    • 순서 번호가 명시되는 필드
    • 순서 번호: 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호

  • 확인 응답 번호(acknowledgement number)
    • 상대 호스트가 보낸 세그먼트에 대한 응답
    • 다음으로 수신하기를 기대하는 순서 번호가 명시

  • 제어 비트(control bits), 플래그 비트(flag bits)
    • 현재 세그먼트에 대한 부가 정보를 나타냄

  • 윈도우(window)
    • 수신 윈도우의 크기 명시
    • 수신 윈도우: 한 번에 수신하고자 하는 데이터의 양



제어 비트

  • 기본적으로 8비트로 구성
  • 각 자리의 비트는 각기 다른 의미
  • ACK: 세그먼트의 승인을 나타내기 위한 비트
  • SYN: 연결을 수립하기 위한 비트
  • FIN: 연결을 종료하기 위한 비트
  • ACK 비트가 1로 설정된 세그먼트, FIN 비트가 1로 설정된 세그먼트, SYN 비트가 1로 설정된 세그먼트 → ACK 세그먼트, SYN 세그먼트, FIN 세그먼트


순서 번호와 확인 응답 번호

  • TCP의 신뢰성을 보장하기 위해 사용되는 중요한 필드

순서 번호

  • 순서 번호는 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호
  • 전송 계층이 응용 계층으로부터 전송해야 하는 1900바이트 크기의 데이터를 전달 받았다.
    • MSS 단위로 전송될 수 있음. MSS가 500바이트라고 가정
    • 세그먼트 A, B, C, D 순으로 전송된다고 가정
  • 처음 통신을 위해 연결을 수립한 경우, 제어 비트에서 연결을 수립하기 위한 비트인 SYN 플래그가 1로 설정된 세그먼트의 경우 순서 번호는 무작위 값이 됨
    • 이를 초기 순서 번호(Initial Sequence Number)라고 함
    • 초기 순선 번호가 100이라면 가장 먼저 보내게 될 세그먼트 A의 순서 번호가 초기 순서 번호인 100이 되는 것
  • 연결 수립 이후 데이터를 송신하는 동안 순서 번호는 송신한 바이트를 더해 가는 형태로 누적값을 가짐
    • 순서 번호는 초기 순서 번호 + 송신한 바이트 수 (= 초기 순서 번호 + 떨어진 바이트 수)


확인 응답 번호

  • 순서 번호에 대한 응답
  • 다음에는 이걸 보내 주세요, 다음으로 제가 받을 순서 번호는 이것입니다.
  • 확인 응답 번호는 수신자가 다음으로 받기를 기대하는 순서 번호
  • 일반적으로 수신한 번호 + 1
  • 확인 응답 번호 값을 보내기 위해서는 제어 비트에서 승인을 나타내는 비트인 ACK 플래그를 1로 설정 해야 함




TCP 연결 수립과 종료

연결 수립: 쓰리 웨이 핸드셰이크(three-way handshake)

  • 3개의 단계로 이루어진 TCP 연결 수립 과정
  • 처음 연결을 시작하는 호스트의 연결 수립 과정을 액티브 오픈(active open)
    • 주로 서버-클라이언트 관계에서 클라이언트에 의해 수행
    • 호스트 A의 동작
  • 연결 요청을 받고 나서 요청에 따라 연결을 수립해주는 호스트의 연결 수립 과정을 패시브 오픈(passive open)
    • 주로 서버에 의해 수행
    • 호스트 B의 동작

연결 종료

  • TCP가 연결을 종료하는 과정은 송수신 호스트가 각자 한 번씩 FIN과 ACK를 주고받으며 이루어짐

  • 액티브 클로즈(active close)는 먼저 연결을 종료하려는 호스트에 의해 수행
    • FIN 세그먼트를 먼저 보낸 호스트 A가 액티브 클로즈를 수행할 셈
  • 패시브 클로즈(passive close)는 연결 종료 요청을 받아들이는 호스트에 의해 수행
    • 호스트 B의 동작



TCP 상태

  • 상태(state)는 현재 어떤 통신 과정에 있는지를 나타내는 정보
  • TCP는 상태를 유지하고 활용한다는 점에서 스테이트풀(stateful) 프로토콜 이라고도 부름

연결이 수립되지 않은 상태

  • CLOSED
    • 아무런 연결이 없는 상태
  • LISTEN
    • 일종의 연결 대기 상태
    • 일반적으로 서버로서 동작하는 패시브 오픈 호스트는 LISTEN 상태를 유지
    • 액티브 오픈 호스트의 연결 요청인 SYN 세그먼트를 기다리는 상태
    • 액티브 오픈 호스트가 LISTEN 상채인 호스트에게 SYN 세그먼트를 보내면 쓰리 웨이 핸드셰이크 시작


연결 수립 과정에서 주로 볼 수 있는 상태

  • SYN-SENT
    • 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤 그에 대한 응답인 SYN + ACK 세그먼트를 기다리는 상태
    • 연결 요청을 보낸 뒤 대기하는 상태

  • SYN-RECEIVED
    • 패시브 오픈 호스트가 SYN + ACK 세그먼트를 보낸 뒤 그에 대한 ACK 세그먼트를 기다리는 상태

  • ESTABLISHED
    • 연결이 확립되었음을 나타내는 상태
    • 데이터를 송수신할 수 있는 상태를 의미
    • 쓰리 웨이 핸드셰이크 과정에서 두 호스트가 마지막 ACK 세그먼트를 주고받으면 ESTABLISHED 상태로 접어듦

연결 종료 과정에서 주로 볼 수 있는 상태

  • FIN-WAIT-1
    • 연결 종료의 첫 단계
    • FIN 세그먼트로서 연결 종료 요청을 보낸 액티브 클로즈 호스트는 FIN-WAIT-1 상태로 접어들게 됨

  • CLOSE-WAIT
    • 종료 요청인 FIN 세그먼트를 받은 패시브 클로즈 호스트가 그에 대한 응답으로 ACK 세그먼트를 보낸 후 대기하는 상태

  • FIN-WAIT-2
    • FIN-WAIT-1 상태에서 ACK 세그먼트를 받게 되면 FIN-WAIT-2 상태가 됨
    • 상대 호스트의 FIN 세그먼트를 기다리는 상태

  • LAST-ACK
    • CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤 이에 대한 ACK 세그먼트를 기다리는 상태

  • TIME-WAIT
    • 액티브 클로즈 호스트가 FIN 세그먼트를 수신한 뒤, 이에 대한 ACK 세그먼트를 전송한 뒤 접어드는 상태
    • 패시브 클로즈 호스트가 마지막 ACK를 수신하면 CLOSED 상태로 전이하는 반면, TIME-WAIT 상태에 접어든 액티브 클로즈 호스트는 일정 시간을 기다린 뒤 CLOSED 상태로 전이
    • 상대 호스트가 받았어야 할 마지막 ACK 세그먼트가 올바르게 전송되지 않았을 수 있기 때문에 일정 시간을 기다렸다가 연결을 종료

  • CLOSING
    • 보통 동시에 연결을 종료하려 할 때 전이되는 상태
    • 서로가 FIN 세그먼트를 보내고 받은 뒤 그에 대한 ACK 세그먼트를 보냈지만, 아직 자신의 FIN 세그먼트에 대한 ACK 세그먼트를 받지 못했을 때 접어드는 상태
    • 양쪽 모두가 연결 종료를 요청하고, 서로의 종료 응답을 기다리는 경우 CLOSING 상태로 접어든 셈
    • ACK 세그먼트를 수신한다면 각자 TIME-WAIT 상태로 접어든 뒤 종료

정리




UDP 데이터그램 구조

  • UDP는 TCP와 달리 비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜
  • 연결 수립 및 해제, 재전송을 통한 오류 제어, 혼잡 제어, 흐름 제어 등을 수행하지 않음
  • 상태를 유지하지도 않음
  • 스테이트리스(stateless) 프로토콜의 일종

  • TCP에 비해 제공하는 기능이 적은 만큼 필드도 단순
  • 송신지 포트와 수신지 포트
  • 길이: 헤더를 포함한 UDP 데이터그램의 바이트가 담김
  • 체크섬: 데이터그램 전송 과정에서 오류가 발생했는지 검사하기 위한 필드
    • 수신지는 이 필드의 값을 토대로 데이터그램의 정보가 훼손되었는지를 판단하고, 문제가 있다고 판단한 데이터그램은 폐기
    • 데이터그램이 훼손되었는지를 나타내는 정보라는 점에서 이 필드는 수신지까지 잘 도달했는지를 나타내는 신뢰성/비신뢰성과는 관련이 없음

  • TCP에 비해 적은 오버헤드로 패킷을 빠르게 처리할 수 있음
  • 실시간 스트리밍 서비스, 인터넷 전화처럼 실시간성이 강조되는 상황에서 TCP보다 더 많이 쓰임
  • 수신지에 패킷들을 빠르게 마구 던지는 것과 같음
    • 이 과정에서 패킷이 손실되거나 패킷의 순서가 바뀔 수도 있다.
profile
Hello

0개의 댓글

관련 채용 정보