Home [Network] 4. 트랜스포트 계층
Post
Cancel

[Network] 4. 트랜스포트 계층

본문은 “그림으로 공부하는 TCP/IP 구조” 및 각종 자료를 읽고 재구성한 글임을 밝힙니다.


트랜스포트 계층은 다음의 동작을 통해 네트워크와 애플리케이션을 연결하는 역할을 한다.

  1. 포트 번호를 이용하여 애플리케이션 식별
  2. 요구에 맞는 전송 제어
    • 패킷 송수신량 제어
    • 손실된 패킷 재전송 등

트랜스포트 계층에서 사용되는 프로토콜은 UDP 또는 TCP 중 하나이다. 실시간성이 요구될 때는 UDP, 신뢰성이 요구될 때는 TCP를 사용한다.

항목UDPTCP
패킷 이름데이터그램 (datagram)세그먼트 (segment)
IP 헤더의 프로토콜 번호176
신뢰성⬇️⬆️
실시간성⬆️⬇️
타입커넥션리스 타입커넥션 타입



1. UDP (User Datagram Protocol)

  • 음성 통신, 이름 결정, DHCP, 시각 동기화 등 실시간성을 필요로하는 애플리케이션에서 사용한다.
  • 커넥션리스 타입이므로, 갑자기 UDP 커넥션이라는 통신로를 만들고 애플리케이션 데이터를 송신한다.
  • 실시간성을 위해 포맷을 간단하게 하거나 확인 응답을 생략한다.
  • 클라이언트는 UDP 데이터그램을 만들고 계속 보내기만 하며, 서버는 UDP 헤더에 포함된 UDP 데이터그램 길이체크섬을 이용해 데이터가 손상되었는지 여부를 체크하고 받아들인다.


1-1. UDP 데이터그램 헤더 (8바이트)

  • 송신지/수신지 포트 번호 (2바이트)
    • 포트 번호는 애플리케이션(프로세스) 식별에 사용된다.
    • 클라이언트는 OS가 정한 범위에서 무작위로 할당한 값을 송신지 포트 번호로, 애플리케이션별로 정의된 값을 수신지 포트 번호로 설정하고 서버에 전송한다.
    • 데이터그램을 받은 서버는 수신지 포트 번호를 보고, 어떤 애플리케이션의 데이터인지 판별해 애플리케이션에 전달한다.
  • UDP 데이터그램 길이 (2바이트)
    • UDP 헤더(8바이트) + UDP 페이로드(애플리케이션 데이터), 즉 데이터그램 전체 길이를 나타낸다.
    • 바이트 단위의 값이다.
    • 최솟값은 8(UDP 헤더로만 구성된 경우), 최댓값은 MTU에서 IP 헤더의 길이(20바이트)를 뺀 값이다.

      추가 자료

      • UDP 페이로드의 크기로 적당한 값은?: → 자료1
      • UDP의 MSS: → 자료2
      • → 자료3: IPv4 네트워크에서 모든 장비는 최소 576바이트의 데이터그램을 처리할 수 있으므로, 안전하게 IP/UDP 헤더를 고려하여 데이터를 512byte로 전송한다!
  • 체크섬 (2바이트)
    • 받아들인 UDP 데이터그램의 손상 여부 정합성 체크에 사용된다.
    • IP 헤더 체크섬과 마찬가지로 1의 보수 연산을 사용한다.
    • 데이터그램을 받은 단말은 정합성 검증에 성공하면 데이터그램을 받는다.


1-2. 포트 번호

IP 헤더만 있다면 전 세계 어떤 수신지에서도 IP 패킷을 도달시킬 수 있다. 하지만 IP 패킷을 받은 단말은 그 IP 패킷을 어떤 애플리케이션에서 처리하면 좋을지 알지 못한다. 따라서 트랜스포트 계층에서 애플리케이션을 식별하기 위해 포트 번호를 사용한다!

  • 애플리케이션 계층에서 동작하는 애플리케이션을 식별하는 2바이트 숫자로, 0 ~ 65535번까지 있다.
  • 포트 번호와 애플리케이션은 짝을 지어 묶여있다.
  • 송신지 포트 번호는 돌아올 패킷을 위해, 수신지 포트 번호는 서버 애플리케이션을 식별하기 위해 부여한다.
  • 세 종류로 분류된다.

    포트 번호 범위이름용도주요 사용처
    0 ~ 1023system ports일반적인 서버 애플리케이션
    (ex. DNS, HTTP, HTTPS, SSH 등)
    서버 애플리케이션
    (수신지)
    1024 ~ 49151user ports제조사의 고유 서버 애플리케이션
    (ex. MySQL, Tomcat, …)
    서버 애플리케이션
    (수신지)
    49152 ~ 53325dynamic(private) ports클라이언트 측에서 무작위로 할당클라이언트 애플리케이션
    (송신지) (무작위 할당)



2. TCP (Transmission Control Protocol)

  • 메일, 파일 전송, 웹브라우저 등 데이터를 전송의 신뢰성을 요구하는 애플리케이션에서 사용한다.
  • 데이터를 송신하기 전에 TCP 커넥션을 만든다. 이는 송신 파이프와 수신 파이프라는 두 개의 논리적인 파이프로 구성된다.


2-1. TCP 세그먼트 헤더 (최소 20바이트)

신뢰성을 요하기 때문에 UDP보다 헤더가 복잡하다.

  • 송신지/수신지 포트 번호 (2바이트)
    • 클라이언트는 OS가 결정한 범위 내에서 무작위로 할당한 값을 송신지 포트 번호에, 애플리케이션 별로 정의된 값을 수신지 포트 번호에 설정한다.
    • 서버는 수신지 포트 번호를 보고 어떤 애플리케이션의 데이터인지 판단하고, 그 애플리케이션에 데이터를 전달한다.
  • 시퀀스 번호 (4바이트)
    • TCP 세그먼트를 올바른 순서로 정렬하기 위해 사용한다.
    • 송신 측 단말은 애플리케이션에서 받은 데이터의 각 바이트에 대해 초기 시퀀스 번호(ISN)에서 연번을 부여한다.
    • 수신 측 단말은 받은 TCP 세그먼트의 시퀀스 번호를 확인하고, 번호순으로 정렬해 애플리케이션에 전달한다.
    • 3-way handshake 시 무작위 값이 ISN으로 설정되어 TCP 세그먼트를 송신할 때마다 송신한 바이트 수만큼 더해진다.
    • 4바이트로 관리할 수 있는 데이터 양(2^32=4G바이트)을 넘으면 다시 0으로 돌아가 증가한다.
  • 확인 응답 번호 (ACK 번호) (4바이트)
    • 상대에게 ‘다음에 이 시퀀스 번호 이후의 데이터를 달라’고 전달하기 위한 필드이다.
    • 컨트롤 비트 ACK 플래그가 1이 되었을 때만 유효하다.
    • 받아들인 데이터의 가장 마지막 바이트의 시퀀스 번호 + 1, 즉 시퀀스 번호 + 애플리케이션 데이터의 길이가 설정된다.
    • TCP시퀀스 번호확인 응답 번호를 통해 신뢰성을 확보한다.
    • 시퀀스 번호 & 확인 응답 번호는 byte 단위로 붙인다!!
  • 데이터 오프셋 (4비트)
    • TCP 헤더의 길이를 4바이트 단위로 환산한 값이 들어있다.

      IP 헤더와 마찬가지이다. 따라서 가장 짧은 TCP 헤더의 길이는 20바이트이므로 5가 들어간다.

    • 단말은 이 값을 보고 어디까지 TCP 헤더인지 알 수 있다.

  • 컨트롤 비트 (flag) (8비트)
    • 커넥션의 상태를 제어하는 필드로, 각 비트를 0 또는 1로 설정함에 따라 현재 커넥션이 어떤 상태인지 전달한다.
    • ex) ACK, SYN, FIN
  • 윈도우 크기 (2바이트)
    • 받은 데이터 크기를 알리기 위한 필드이다. 즉, 확인 응답을 기다리지 않고 받을 수 있는 데이터 크기이다.
    • 최대 65535 바이트까지 알릴 수 있으며, 0이 더이상 받을 수 없음을 나타낸다.
    • 송신 측 단말은 윈도우 크기가 0인 패킷을 받으면 일단 송신을 멈춘다.
  • 체크섬 (2바이트)
    • 받은 TCP 세그먼트가 손상되지 않았는지 정합성을 체크하기 위해 사용한다.
    • 1의 보수 연산을 사용하며, 검증에 성공하면 세그먼트를 받는다.
  • 긴급 포인터 (2바이트)
    • 컨트롤 비트의 URG 플래그가 1로 설정되었을 때만 유효하다.
    • 긴급 데이터가 있을 때, 긴급 데이터를 나타내는 가장 마지막 바이트의 시퀀스 번호가 설정된다.
  • 옵션 (4바이트 단위가 되도록)

    TCP에 관련된 확장 기능을 알리기 위한 것으로, 몇 가지 옵션을 옵션 리스트로 나열하는 형태로 구성되어 있다.

    1. MSS (Maximum Segment Size)

      MTU vs. MSS

      • MTU (Maximum Transmission Unit): IP 패킷(= 이더넷 페이로드)의 최대 크기

        송신 매체에 따라 다르며, 인터넷의 경우(= 이더넷의 MTU 값)에는 기본값이 1,500 바이트이다.

      • MSS (Maximum Segment Size): TCP 페이로드(= 애플리케이션 데이터)의 최대 크기

      IP 패킷 = IP 헤더 + TCP 헤더 + TCP 페이로드이므로, MTU = IP 헤더 길이 + TCP 헤더 길이 + MSS

      • TCP 페이로드(= 애플리케이션 데이터)의 최대 크기이다.
      • 일반적인 IPv4 환경에서는 MSS = MTU - 40바이트(IP 헤더 + TCP 헤더) 이다.
      • 인터넷의 경우 이더넷(L2) + IPv4(L3) 환경이므로, MSS = 1500 - 40 = 1460바이트가 된다.
      • 트랜스포트 계층은 애플리케이션 데이터를 MSS로 구분하여 TCP로 캡슐화 한다.
      • TCP 단말은 3-way handshake 시, 지원하는 MSS 값을 서로 알려준다.
    2. SACK (Selective ACK)

      • SACK이란, 사라진 TCP 세그먼트만을 재전송하는 기능이다.
      • SACK을 사용하지 않으면, 애플리케이션 데이터를 어디까지 받아들였는지를 ACK 번호만으로 판단하기 때문에, 부분적으로 TCP 세그먼트가 사라지면 그 세그먼트 이후의 모든 세그먼트를 재전송해야 한다.
      • SACK를 지원하면 부분적으로 TCP 세그먼트가 사라진 경우, 어디부터 어디까지 받았는지를 옵션 필드로 알릴 수 있다. 따라서 사라진 TCP 세그먼트만 재전송함으로써 효율을 향상시킬 수 있다.


2-2. [접속 시작 단계] 3-Way Handshake

커넥션을 확립한다.

커넥션 오픈은 반드시 클라이언트의 SYN으로부터 시작한다.

  1. 클라이언트CLOSED, 서버LISTEN 상태이다.
  2. 클라이언트SYN 패킷을 송신하고, SYN-SENT 상태로 이동한다. 그리고 SYN/ACK 패킷을 기다린다.

    SYN 플래그ACK 플래그SEQ 번호ACK 번호
    10x (무작위 값)0
  3. 서버는 SYN 패킷을 받은 후 SYN/ACK 패킷을 반환하고, SYN-RECEIVED 상태로 이동한다.

    SYN 플래그ACK 플래그SEQ 번호ACK 번호
    11y (무작위 값)x + 1
  4. 클라이언트는 SYN/ACK 패킷을 받은 후 ACK 패킷을 반환하고, ESTABLISHED 상태로 이동한다.

    ESTABLISHED 상태가 되면 커넥션이 완료되어 애플리케이션 데이터를 송수신할 수 있다.

    SYN 플래그ACK 플래그SEQ 번호ACK 번호
    01x + 1y + 1
  5. 서버는 ACK 패킷을 받은 후 ESTABLISHED 상태로 이동한다. 이제까지의 SEQ 번호와 ACK 번호에 따라 애플리케이션 데이터의 최초에 부여할 시퀀스 번호를 확정한다.

    ESTABLISHED 상태가 되면 커넥션이 완료되어 애플리케이션 데이터를 송수신할 수 있다.

ref: TCP and TLS handshake: What happens from typing in a URL to displaying a website? (Part 2)


2-3. [접속 확립 단계] 신뢰성 확보: 오류 제어, 흐름 제어, 혼잡 제어

실제 애플리케이션 데이터의 교환을 수행한다.

[1] 흐름 제어(Flow Control)

송신측과 수신측의 데이터 처리 속도 차이를 해결하기 위한 기법 (수신 버퍼, 송신 버퍼)

수신 측 단말이 수행

  • Stop-and-Wait

    본래, 상대방에게 데이터를 보낸 후 잘 받았다는 응답이 올 때까지 기다리는 모든 방식을 통칭하는 명칭이다.

    • 송신 측에서 매번 전송한 패킷에 대해 수신측의 확인 응답을 받아야만 그 다음 패킷을 전송하는 방식이다.
    • 구조가 간단하지만 비효율적이다.
  • Sliding Window

    • Stop-and-Wait의 비효율성을 개선했다.
    • 수신 측 단말은 윈도우 크기 필드를 통해 자신이 받을 수 있는 데이터 양(= 수신 버퍼의 빈 영역의 크기)을 알린다.
      • 수신 버퍼(윈도우)가 가득 찼다면 윈도우 크기로 0을 보낸다.
      • 수신 버퍼가 가득 찼을 때, 애플리케이션에서 데이터를 가져가면 공간이 생긴다. 이 때, 윈도우 크기로 송신 측에 알린다.
    • 송신 측 단말은 윈도우 크기 내에서는 ACK를 기다리지 않고 연속해서 TCP 세그먼트를 보낸다.
      • 윈도우 크기 0을 받으면 송신을 중지한다. 그랬다가 윈도우 크기가 늘어나면 송신을 재개한다.

      예시

      • 송신측에서 0 1 2 3 4 5 6을 보낼 수 있는 프레임을 가지고 있고, 데이터 0 1을 전송했다면, 윈도우는 2 3 4 5 6이 된다.
      • 만약 수신측으로부터 0 1에 대한 ACK를 받으면, 송신측의 윈도우가 우측으로 확장되어 2 3 4 5 6 x x가 된다.

[2] 오류 제어(Error Control)

패킷 유실이 발생했을 때 수행하는 패킷 재전송 기능

TCP는 ACK 패킷을 통해 패킷 유실을 감지하고 패킷을 재전송한다. 이때, 기본적으로 ARQ(Automatic Repeat Request)라는 재전송 기반 오류 제어를 사용한다.

  • Stop-and-Wait ARQ
    • 흐름 제어의 Stop-and-Wait와 연결된다.
    • 송신 측에서 패킷을 하나 보내고, 수신측에서 수신된 패킷의 에러 유무에 따라 ACK 혹은 NACK을 보내는 방식이다.
    • 송신측이 (1) NACK을 받거나, (2) 일정 시간(= 재전송 타이머, RTO, Retransmission Timeout) 동안 수신측으로부터 응답을 받지 못하면 패킷을 재전송한다.

      • RTO(Retransmission Timeout)는 RTT 기반 계산식으로 계산된다.

      • RTT(Round Trip Time)란 네트워크 통신을 하는 두 노드 간 패킷이 왕복하는 데에 소요된 시간이다.

      ref: https://brunch.co.kr/@alden/15

  • Go-Back-N ARQ
    • 흐름 제어의 Sliding Window와 연결된다.
    • 송신측이 1 2 3 4 5 6 7 ...을 보내는데, 수신측으로부터 ACK(4)까지만 받고 (1) 타임아웃이 발생하거나 (2) NACK을 받았다면 4번 패킷부터 전부 재전송 한다.
    • 송신측에서는 전송했으나 아직 정상 수신 여부가 확인되지 않은 패킷의 복사본을 가지고 있어야 한다.
    • 재전송 해야하는 경우
      1. 패킷에 오류가 있을 경우:
        • 2번 패킷에 오류가 있다면 수신측에서는 NACK(2)를 보낸다.
        • 송신측에서는 2번 패킷부터 다시 보낸다.
      2. 순서가 바뀌었을 경우:
        • 수신측에서는 1번 패킷 후 3번 패킷이 오면 2번 패킷을 잃어버렸다고 판단하여 NACK(2)를 보내고, 2번 패킷 이후의 모든 패킷을 폐기한다.
        • 비효율적이므로 Selective Repeat ARQ가 고안되었다.
      3. 패킷이 분실되어 수신측에 도달하지 못하는 경우:
        • 송신측에서는 보낸 패킷에 대해 시간이 지나도 ACKNACK를 받지 못한다.
        • 타임아웃이 발생하여 마지막으로 ACK 받은 데이터부터 다시 송신한다.

          최근에 ACK(2)를 받았으면, 2번 패킷부터 다시 보낸다.

  • Selective Repeat ARQ
    • 문제가 발생한 패킷만 재전송함으로써, Go-Back-N ARQ에서 확인된 마지막 패킷 이후의 모든 패킷을 재전송하는 비효율성을 개선한다.
    • 수신측은 패킷을 새로 재정렬해야 하므로 별도의 버퍼를 필요로 한다.

[3] 혼잡 제어(Congestion Control)

송신측의 데이터 전송과 네트워크 처리 속도 차이로 인한 네트워크 혼잡을 해결하기 위한 기법

송신 측 단말이 수행

  • 네트워크가 혼잡해지면 패킷 유실이나 전송 지연이 발생한다.
  • 패킷 송신 수를 제어함으로써 네트워크가 혼잡해지지 않도록 하며, 이 패킷 송신 수혼잡 윈도우(cwnd)라고 한다.

    혼잡하면 혼잡 윈도우를 줄이고, 혼잡하지 않으면 늘린다.

  • AIMD (Additive Increase Multicative Decrease)
    • 합 증가 / 곱 감소 알고리즘
    • 처음에 패킷 하나를 보내고, 문제 없이 도착한다면 cwnd를 1씩 증가시키며 전송한다. 만약 패킷 전송에 실패(NACK)하거나 타임아웃이 발생하면 cwnd를 절반으로 감소한다.
    • 장점: 여러 송신측이 있는 상황에서 송신측이 하나 추가될 때, 처음에는 cwnd가 작아 불리하지만 나중에는 평형을 이루게 되어 공평해진다.
    • 단점: 초기에 높은 대역폭을 사용하지 못하고, 네트워크가 혼잡해지는 상황을 미리 감지하지 못하여 혼잡해지고 나서야 대역폭을 줄이는 형태이다.

      대역폭

      어떤 매체나 기기를 경유하여 정보를 전송할 때의 전송량

  • Slow Start
    • 초기에 전송 속도를 올리는 데에 시간이 소요되는 AIMD를 보완한다.
    • cwnd를 2배씩 늘리고, 혼잡 현상이 발생하면 1로 줄인다.
    • 처음에는 네트워크 수용량을 예측할 수 있는 정보가 없지만, 시간이 지나면서 혼잡 현상이 발생했던 cwnd 크기를 알 수 있다. 해당 크기의 절반(= 임계값)까지는 이전처럼 2배씩 cwnd를 증가시키고, 이후부터는 1씩 증가시키는 방식이다.
    • 사용 가능한 정책
      1. 혼잡 회피 (congestion avoidance)
        • cwnd를 2배씩 늘리다가, 임계 지점부터는 1씩 증가시킨다.
        • 패킷이 일정 시간동안 ACK, NACK을 받지 못하는 경우, 혼잡 상황이라고 간주한다.
        • 혼잡이 발생하면 cwnd를 1로 줄이고, 임계값을 절반으로 줄인다.
      2. 빠른 회복 (fast recovery)
        • 혼잡 발생 시 cwnd를 1이 아닌 절반으로 줄이고, 1씩 증가시킨다.
        • 한 번 혼잡이 발생한 후에는 AIMD로 작동한다.
      3. 빠른 재전송 (fast retransmit)
        • 수신측에서 순서 상 먼저 도착해야 할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보낸다. 이때, 순서대로 잘 도착한 마지막 패킷의 순번ACK 패킷에 실어서 보낸다. 따라서 중간에 패킷 하나가 손실되면, 송신측에서는 순번이 중복된 ACK 패킷을 받게 된다.

          ex) 수신측에서 1 2 3 6 4 5 순서로 수신한다면, 송신측에 ACK(4), ACK(4), ACK(4)를 보내게 된다.

        • 이처럼 중복된 순번의 ACK 패킷을 3개 받으면 재전송한다. 또한, 이러한 상황을 약간의 혼잡이 발생한 것으로 간주하여 cwnd의 크기를 절반으로 줄인다.


2-4. [접속 종료 단계] 4-Way Handshake

커넥션 종료 처리를 수행한다. 종료 처리에 실패하면 불필요한 커넥션이 단말에 남으므로 오픈 처리보다 더 신중하게 진행한다.

커넥션 클로즈는 클라이언트, 서버 어느 쪽에서든 FIN을 보내면서 시작한다. 여기에서는 클라이언트 측에서 FIN을 보내는 상황을 다룬다.

  1. 클라이언트는 애플리케이션으로부터 클로즈 처리 요구가 들어오면, FIN/ACK 패킷을 송신하고, FIN-WAIT1 상태로 이동한다.

    FIN 플래그ACK 플래그SEQ 번호ACK 번호
    11xy
  2. 서버는 FIN/ACK 패킷을 받은 후 ACK 패킷을 송신하고 애플리케이션에 대해 클로즈 처리를 의뢰하며, CLOSE-WAIT 상태로 이동한다.

    FIN 플래그ACK 플래그SEQ 번호ACK 번호
    01yx + 1
  3. 클라이언트는 ACK 패킷을 받고 FIN-WAIT2 상태로 이동한다.
  4. 서버애플리케이션으로부터 클로즈 처리 요청이 있으면 FIN/ACK 패킷을 송신하고, LAST-ACK 단계로 이동한다.

    FIN 플래그ACK 플래그SEQ 번호ACK 번호
    11yx + 1
  5. 클라이언트는 FIN/ACK 패킷을 받은 후 ACK 패킷을 반송하고, TIME_WAIT 상태로 이동한다.

    TIME_WAIT 상태: 혹시라도 늦게 도착할지 모를 ACK 패킷을 기다린다.

    FIN 플래그ACK 플래그SEQ 번호ACK 번호
    01x + 1y + 1
  6. 서버는 ACK 패킷을 받고 CLOSED 상태로 이동하고, 커넥션 삭제 및 자원을 해제한다.

    패시브 클로즈 종료

  7. 클라이언트는 타임아웃이 끝나면 CLOSED 상태로 이동하고, 커넥션 삭제 및 자원을 해제한다.

    액티브 클로즈 종료

ref: TCP 4-Way Termination Handshake



3. 방화벽

3-1. 개요

  • 트랜스포트 계층에서 동작하는 기기로, 5 tuple(송신지/수신지 IP 주소, 트랜스포트 계층 프로토콜, 송신지/수신지 포트 번호)로 커넥션을 식별하고 송신을 제어한다.
  • 미리 설정한 규칙에 따라 통신의 허용 여부를 식별하고 시스템을 보호한다.
  • 이러한 통신 제어 기능을 스테이트풀 인스펙션이라 하며, 다음을 통해 통신을 제어한다.
    • 필터링 규칙: 허가할 통신과 거부할 통신의 형태를 정의한다.

      ex) 192.168.1.0/24라는 사내 LAN에 있는 단말에서 인터넷으로의 웹 접근을 허가하는 경우

      단순히 HTTP 뿐만 아니라, HTTP를 SSL/TLS로 암호화하는 HTTPS, 도메인 이름을 IP 주소로 변환할 때 사용하는 DNS도 함께 염두해두어야 한다.

    • 커넥션 테이블: 방화벽이 자신을 경유하는 커넥션 정보를 관리하는 테이블이다.

      • 송신지/수신지 IP 주소, 프로토콜, 송신지/수신지 포트 번호, 커넥션 상태, 아이들 타임아웃 등 각종 요소로 만들어지는 복수의 커넥션 엔트리로 구성된다.


3-2. 방화벽이 UDP 데이터그램을 처리하는 방법

  1. 방화벽은 클라이언트 측에 있는 인터페이스에서 UDP 데이터그램을 받아들여, 필터링 규칙과 조합한다.
  2. 들어온 UDP 데이터그램의 액션이
    • “허가”인 엔트리인 경우
      1. 커넥션 테이블에 커넥션 엔트리를 추가한다.
      2. 커넥션 엔트리에 대응하는 반환 통신을 허가하는 필터링 규칙을 추가한다.

        반환 통신 = 커넥션 엔트리의 송신지 ↔ 수신지 반전

      3. 서버에 UDP 데이터그램을 전송한다.
    • “거부”인 엔트리인 경우
      1. 커넥션 테이블에 커넥션 엔트리를 추가하지 않는다.
      2. 클라이언트에 ICMP 패킷(Destination Unreachable)을 반환한다.
    • “드롭”인 엔트리인 경우 아무것도 하지 않는다. (보안 관점에서 바람직) (Silently Discard)
  3. 액션이 “허가”인 엔트리인 경우, 서버로부터 반환 통신(송신지 ↔ 수신지 반전)이 발생한다. 방화벽은 서버 측에 있는 인터페이스에서 반환 통신을 받아들이면
    1. 이전에 추가한 필터링 규칙을 사용해 허가 제어를 실행한다.
    2. 클라이언트에 전송한다.
    3. 커넥션 테이블 엔트리의 아이들 타임0초로 초기화한다.
  4. 통신이 끝나면 방화벽커넥션 테이블 엔트리의 아이들 타임을 증가시킨다. 아이들 타임아웃이 경과하면 커넥션 엔트리와 관련된 필터링 규칙을 모두 삭제한다.


3-3. 방화벽이 TCP 세그먼트를 처리하는 방법

UDP에서와 마찬가지로 필터링 규칙커넥션 테이블을 이용한다. 단, 커넥션 테이블커넥션 정보를 나타내는 열이 추가되고, 그 정보를 기반으로 커넥션 엔트리를 관리한다.

  1. 방화벽은 클라이언트 측에 있는 인터페이스로 SYN 패킷을 받아 필터링 규칙과 조합한다.
  2. 들어온 TCP 세그먼트의 액션이
    • “허가”인 엔트리인 경우
      1. 커넥션 테이블에 커넥션 엔트리를 추가한다.
      2. 커넥션 엔트리에 대응한 반환 통신을 허가하는 필터링 규칙을 동적으로 추가한다.
      3. 서버에 TCP 세그먼트를 전송한다.
    • “거부”인 엔트리인 경우
      1. 커넥션 테이블에 커넥션 엔트리를 추가하지 않는다.
      2. 클라이언트에 RST 패킷을 반환한다.
    • “드롭”인 엔트리인 경우 아무것도 하지 않는다. (보안 관점에서 바람직) (Silently Discard)

      클라이언트는 SYN/ACK 패킷이 돌아오지 않으면 OS나 그 버전별로 정해진 간격으로, 정해진 횟수만큼 SYN을 계속 재전송한다.

  3. 액션이 “허가”인 엔트리인 경우, 서버로부터 SYN/ACK 패킷반환 통신한다. 방화벽은 서버 측에 있는 인터페이스에서 반환 통신을 받아들이면
    1. 이전에 추가한 필터링 규칙을 사용해 허가 제어를 실행한다.
    2. 클라이언트에 전송한다.
    3. 커넥션 테이블 엔트리의 커넥션 엔트리 상태SYN-SENTESTABLISHED로 업데이트하고, 아이들 타임0초로 초기화한다.
  4. 애플리케이션 데이터 전송이 끝나면 4-way hanshake에 의한 클로즈 처리가 실행된다.
    • 방화벽은 클라이언트-웹서버 사이에서 교환되는 FIN/ACKACKFIN/ACKACK라는 패킷의 흐름을 보고 커넥션 엔트리를 삭제하고, 반환 통신용 필터링 규칙도 삭제한다.
    • 또한, 만약 커넥션이 정상적으로 클로즈될 수 없는 경우일 때를 대비하여 아이들 타임이 타임아웃되면 커넥션 엔트리와 반환 통신용 필터링 규칙을 삭제한다.



References

This post is licensed under CC BY 4.0 by the author.

[Python] 이터러블(Iterable), 이터레이터(Iterator), 제너레이터(Generator)

[Python] 컨텍스트 매니저 프로토콜(Context Manager Protocol)과 with 문