CS/기타

(CS) 네트워크 - 전송 계층, TCP & UDP

흰색텀블러 2025. 3. 25. 08:57

TCP와 UDP의 목적과 특징

포트를 통한 프로세스 식별

  • 패킷의 최종 송수신 대상 : 호스트가 실행하는 프로세스
    • ex) 하나의 호스트는 여러 프로세스(인터넷, 게임, 채팅 등) 동시 실행 → 네트워크를 통해 주고받는 패킷 → 프로세스에 전달되어야함
  • port를 통해, 특정 호스트가 실행하는 특정 프로세스를 식별할 수 있음
  • 형식 → IP 주소 : 포트번호 (ex. 192.168.0.1:8000)
  • TCP와 UDP 헤더에는 모두 포트 번호 필드인 송신지 포트번호와 수신지 포트 번호를 포함하고 있음.
  • 16비트로 표한할 수 있는 포트 번호의 총 개수는 2^16 == 65536개 ( 0 ~ 65535 )
  • 잘 알려진 포트 (well known port) : 0 ~ 1023 번
    • 20, 21 : FTP
    • 22 : SSH
    • 23 : TELNET
    • 53 : DNS
    • 67, 68 : DHCP
    • 80 : HTTP
    • 443 : HTTPS
  • 등록된 포트 (registered port) : 1024 ~ 49151 번
    • 1194 : OpenVPN
    • 1433 : Microsoft SQL Server DB
    • 3306 : MySQL DB
    • 6379 : Redis
    • 8080 : HTTP 대체
  • 사설 포트(임시 포드) : 49152 ~ 65535

NAT, NAPT : 공인 IP 와 사설 IP 교환 시키는 기

 

 

(비) 신뢰성과 (비) 연결형 보장

TCP UDP

순서 번호 필드 : ACK 플래그
확인 응답 번호 필드 : SYN 플래그
일부 제어 비트 : FIN 플래그

송신지 포트 : 송신 프로세스가 할당된 포트 번호
수신지 포트 : 수신 프로세스가 할당된 포트 번호
길이 : 헤더를 포함한 UDP 패킷의 바이트 크기 명시
체크섬 : 송수신 과정에서의 데이터그램 훼손 여부 정보 명시
신뢰할 수 있는 연결형 송수신 가능 신뢰할 수 없는 연결형 송수신 가능
신뢰할 수 있는 프로토콜 & 연결형 프로토콜 신뢰할 수 없는 프로토콜 & 비연결형 프로토콜
패킷을 주고받기 전 연결 수립 과정 → 패킷을 주고받을 때 신뢰성 보장을 위해 상태 관리, 흐름 제어, 오류 제어, 혼잡 제어 등의 기능 제공 → 송수신 끝나면 연결 종료 그런거 없음
송수신 속도가 느림 송수신 속도가 빠름
패킷의 유실 없는 송수신에 적합 빠른 송수인에 적합
  • 순서 번호 
    • TCP 패킷의 올바른 순서를 보장하기 위해 첫 바이트에 매겨진 번호 → 송수신하고자 하는 데이터의 몇번째 바이트에 해당하는지 알 수 있음
  • 확인 응답 번호
    • 상대 호스트가 보낸 세그먼트에 대한 응답으로, 수신하길 기대하는 순서 번호 (일반적으로 순서 번호 +1 )
  • 제어 비트
    • 현재 세그먼트에 대한 부가 정보를 나타내는 정보로, 플래그 비트라고도 부름
    • 기본적으로 8비트
      • ACK : 세그먼트의 승인을 나타내기 위한 비트
      • SYN : 연결을 수립하기 위한 비트
      • FIN : 연결을 종료하기 위한 비트
  • 순서 번호, 확인 응답 번호 예
    • 호스트 B는 A에게 다음으로 101번 세그먼트를 받기 희망 : 확인 응답 필드에 101번
    • 이때, 확인 응답 번호를 포함하고 있음을 알리기 위해 ACK 플래그를 1로 설정해야함 

 

 

TCP의 연결부터 종료까지

TCP의 연결 수립

  • 쓰리 웨이 핸드셰이크 (three-way handshake)를 통해 연결 수립이 이루어짐
    • 1. 송수신 방향 (A → B) SYN 세그먼트 전송
      • 호스트 A가 SYN 비트가 1로 설정된 세그먼트를 호스트 B에게 전송 
      • 세그먼트의 순서 번호에는 호스트 A의 순서 번호가 포함
    • 2. 송수신 방향 (B → A) SYN + ACK 세그먼트 전송
      • 1.에 대한 호스트 B의 응답
      • ACK 비트와 SYN비트가 1로 설정된 세그먼트를 호스트 A에게 전송
      • 세그먼트 순서 번호에, 호스트 B의 순서 번호1.에서 보낸 세그먼트에 대한 확인 응답번호 포함
    • 3. 송수신 방향 ( A → B ) ACK 세그먼트 전송
      • 호스트 A는 ACK 비트가 1로 설정된 세그먼트를 호스트 B에게 전송
      • 세그먼트의 순서 번호에는 호스트 A의 순서번호2. 에서 보낸 세그먼트에 대한 확인 응답 번호 포함
    • 호스트 A와 같이 처음 연결을 시작하는 과정 → 액티브 오픈 (Active open)
    • 호스트 B와 같이 연결 요청을 수신한뒤, 그에 대한 연결을 수립하는 과정 → 패시브 오픈(passive open)

three-way handshake 예시

 

 

TCP의 오류, 흐름, 혼잡 제어

  • 1. 재전송을 통한 오류 제어
    • TCP 가 잘못 전송된 세그먼트가 있음을 인지 하는 타이밍
      • 중복된 ACK 세그먼트가 도착했을때
      • 타임아웃이 발생했을 때 == 재전송 타이머의 카운트 다운이 끝난 상황
      • 파이프라이닝
  • 2. 흐름 제어
    • 주체 : 수신 호스트
    • 수신 호스트가 한번에 받아 처리할 수 있을 만큼만 전송하는 것
    • 즉, 송신 호스트가 수신 호스트의 처리 속도를 고려하며 송수신 속도를 균일하게 맞추는 기능
    • TCP 헤더에 window 라는 필드에 수신 호스트가 처리할 수 있는 수신 윈도우 크기가 명시됨!!
  • 3. 혼잡 제어
    • 혼잡(congestion) : 많은 트래픽으로 인해 패킷의 처리 속도가 느려지거나 유실될 수 있는 상황
    • 주체 : 송신 호스트
    • 중복 ACK 세그먼트가 도착했을때, 타임아웃이 발생했을때 → 혼잡하다 판단함
    • 혼잡 없이 전송할 수 있는 세그먼트의 양 : 혼잡 윈도우 → 클수록 한번에 전송할 수 있는 세그먼트의 수가 많다
    • 혼잡 윈도우는 계산하는 과정이 필요함 → 해당의 과정을 혼잡 제어 알고리즘이라 함
    • 혼잡 제어 알고리즘
      • AIMD(Additive increase/Mutiplicative Decrease) : 합으로 증가, 곱으로 감소라는 의미
        • 세그먼트를 보냄 → 응답이 오기까지 혼잡 감지 X → 혼잡 윈도우를 1씩 선형적 증가
        • 세그먼트를 보냄 → 응답이 올때 혼잡 감지 O → 혼잡 윈도우를 절반으로 떨어뜨림 
        • 반복 반복 반복 (아래는 사진)
      • RTT(Round Trip Time) : 패킷을 보내고 그에 대한 응답이 수신되기 까지의 시간
      • 즉, AIMD는 혼잡이 감지X → RTT마다 1씩 선형적 증가, 혼잡 감지O →  혼잡 윈도우 반토막 

TCP의 종료

포 웨이 핸드셰이크

  • 1. 송수신 방향 ( A → B ) FIN 세그먼트
    • 호스트 A는 FIN 비트가 1로 설정된 FIN 세그먼트를 호스트 B에게 전송
  • 2. 송수신 방향 ( B → A ) ACK 세그먼트
    • 1.에 대한 호스트 B의 응답으로, 호스트 B는 ACK 세그먼트를 호스트 A에게 전송
  • 3. 송수신 방향 ( B → A ) FIn 세그먼트
    • 호스트 B는 FIN 세그먼트를 호스트 A에게 전송
  • 4.  송수신 방향 ( A → B ) ACK 세그먼트
    • 3.에 대한 호스트 A의 응답으로, 호스트 A는 ACK 세그먼트를 호스트 B에게 전송함
  • 호스트 A와 같이 먼저 연결을 종료하려는 호스트에 의해 수행되는 동작 : 액티브 클로즈(active close) 
  • 호스트 B와 같이 연결 종료 요청을 받아들이는 호스트에 의해 수행되는 동작 : 패시브 클로즈(passive close)

 

TCP의 상태 관리

  • 상태 관리 프로토콜이라는 점에서 스테이트풀 프로토콜이라고도 함.
  • 상태 : 현재 어떤 통신 과정에 있는지 나타내는 정보
  • 상태 정보 → 현재 TCP 송수신 현황 판단 및 디버깅의 힌트로 활용될 수 있음
  • TCP를 통해 여러 상태가 오가게 됨. 아래 사진은 그것.

 

  • TCP 상태의 항목화
    • 1. 연결이 수립되지 않았을때 주로 활용되는 상태
      • CLOSED
        • 아무런 연결이 없는 상태
      • LISTEN
        • 연결 대기상태 (SYN 세그먼트를 대기하는 상태)
    • 2. 연결 수립 과정에서 주로 활용되는 상태
      • SYN-SENT
        • 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤, 그에 대한 응답인 SYN + ACK 세그먼트를 기다리는 상태 (연결 요청 전송)
      • SYN-RECEIVED
        • 패시브 오픈 호스트가 SYN + ACK 세그먼트를 보낸 뒤, 그에 대한 ACK 세그먼트를 기다리는 상태 (연결 요청 수신)
      • ESTABLISHED
        • 쓰리 웨이 핸드셰이크가 끝난 뒤 데이터를 송수신할 수 있는 상태 (연결 수립)
    • 3. 연결 종료 과정에서 주로 활용되는 상태
      • FIN-WAIT-1
        • 액티브 클로즈 호스트가 FIN 세그먼트로 연결 종료 요청을 보낸 상태 (연결 종료 요청 전송)
      • CLOSE-WAIT
        • FIN 세그먼트를 받은 패시브 클로스 호스트가 그에 대한 응답으로 ACK 세그먼트를 보낸 후, 대기하는 상태 (연결 종료 요층 승인)
      • FIN-WAIT-2
        • FIN-WAIT-1 상태에서 ACK 세그먼트를 받은 상태
      • LAST-ACK
        • CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤 대기하는 상태
      • TIME-WAIT
        • 액티브 클로즈 호스트가 마지막 ACK 세그먼트를 전송한 뒤 접어드는 상태
1. 2 수립 전 및 수립  3. 연결 종료 과정
  • 유의할 점
    • 패시브 클로즈 호스트가 마지막 ACK 세그먼트 수신시, CLOSE 상태가 바로 됨
    • TIME-WAIT 상태에 접어든 액티브 클로즈 호스트는 일정 시간을 기다린 뒤, CLOSED 상태가 됨!!!
      • 마지막 ACK T세그먼트가 올바르게 전송되지 않았을 경우, 재전송이 필요하기 때문에!!
  • CLOSING 상태