호우동의 개발일지

Today :

article thumbnail

트랜스포트 계층의 데이터 수신 및 전달


트랜스포트 계층의 의무

  • 목적지 호스트의 트랜스포트 계층은 바로 아래의 네트워크 계층으로부터 세그먼트를 수신
    → 목적지 호스트의 트랜스포트 계층은 호스트에서 동작하는 프로세스에게
    수신한 세그먼트를 전달할 의무를 지님

  • 예시
    • 4개의 네트워크 애플리케이션을 갖는다고 가정
    • 트랜스포트 계층이 하위 네트워크 계층으로부터 데이터를 수신
      4개의 프로세스 중 하나에게 데이터를 전달해야 함

 


트랜스포트 계층에서의 소켓

  • 프로세스는 네트워크 애플리케이션의 한 부분으로서 소켓을 가지고 있다.
    • 이를 통해 네트워크와 프로세스 간의 데이터를 교환하는 출입구 역할을 함

  • 수신 측 호스트의 트랜스포트 계층은 데이터를 직접 프로세스에 전달하지 않는다.
    → 대신 중간 매개자인 소켓에게 전달

  • 각각의 소켓은 하나의 유일한 식별자를 갖는다.
    ← 수신 측 호스트에 소켓이 여러 개가 존재할 수 있기 때문
    • 식별자의 포맷은 UDP 소켓인지 또는 TCP 소켓인지에 따라 다름

 


수신 세그먼트를 소켓으로 보내는 과정(원리)

  1. 수신 측의 트랜스포트 계층은 수신 소켓을 식별하기 위해 필드 집합을 검사
    • 각각의 트랜스포트 계층 세그먼트는 필드 집합을 가진다.

  2. 세그먼트를 해당 소켓으로 보낸다. → 역다중화(demultiplexing)
    • 역다중화 : 트랜스포트 계층 세그먼트의 데이터를 올바른 소켓으로 전달하는 작업
    • cf ) 다중화(multiplexing)
      • 출발지 호스트에서 소켓으로부터 데이터를 모으고, 각 데이터에 헤더 정보로 캡슐화
        → 세그먼트 생성

      • 생성된 세그먼트들을 네트워크 계층으로 전달하는 작업

 


중간 호스트의 트랜스포트 계층

트랜스포트계층 다중화와 역다중화

  • 해당 그림에서 중간 호스트의 트랜스포트 계층
    → 네트워크 계층 아래로부터 수신한 세그먼트를 프로세스 P1 또는 P2로 역다중화해야 함.

    • 도착한 세그먼트의 데이터가 상응하는 프로세스의 소켓에게 전달됨으로써 이루어짐
  • 중간 호스트의 트랜스포트 계층은 프로세스 소켓으로부터 외부로 나가는 데이터를 모아 세그먼트로 만듦
    → 생성한 세그먼트를 아래 네트워크 계층에 전달

 


트랜스포트 계층 다중화의 2가지 요구사항

  1. 소켓은 유일한 식별자를 가져야 한다.
  2. 각 세그먼트는 세그먼트가 전달될 적절한 소켓을 가리키는 특별한 필드를 갖는다.
    • 특별한 필드 = 출발지 포트 번호 필드 + 목적지 포트 번호 필드
      • 각각의 포트 번호는 0 ~ 65535(16비트 정수)
      • 새 애플리케이션을 개발할 때, 포트 번호를 반드시 할당해야 함
      • 잘 알려진 포트 번호(well known port number)의 사용을 엄격하게 제한한다.
        • 잘 알려진 포트 → 0 ~ 1023번까지의 포트번호
        • HTTP(80)와 FTP(21)처럼 잘 알려진 애플리케이션 프로토콜이 사용하도록 예약됨

 


포트 번호 관점에서의 세그먼트 수신 과정

  1. 호스트의 각 소켓은 포트 번호를 할당받는다.
  2. 세그먼트가 호스트에 도착하면, 트랜스포트 계층은 세그먼트 안의 목적지 포트 번호 검사
  3. 목적지 포트 번호와 상응하는 소켓으로 세그먼트를 전달
  4. 세그먼트의 데이터는 소켓을 통해 해당되는 프로세스로 전달됨

UDP의 기본적인 동작 방식

 

 


비연결형 다중화와 역다중화(UDP 소켓)

  • 애플리케이션의 서버 측은 특정 포트 번호를 할당
  • 애플리케이션의 클라이언트 측은 트랜스포트 계층이 포트 번호를 자동으로 할당

 


데이터 전송 과정

  • 가정
    • 호스트 A → UDP 소켓 19157을 가짐
    • 호스트 B → UDP 소켓 46428을 가짐
    • A의 UDP 소켓 프로세스가 B의 UDP 소켓 프로세스에게 애플리케이션 데이터 전송

  • 전달 과정
    1. A의 트랜스포트 계층은 전달에 필요한 것들을 포함해 트랜스포트 계층 세그먼트를 생성
      • 애플리케이션 데이터, 출발지 포트 번호(19157), 목적지 포트 번호(46428), 기타 2개의 값

    2. 생성된 세그먼트를 네트워크 계층으로 전달
    3. 네트워크 계층은 세그먼트를 IP 데이터그램으로 캡슐화하고 세그먼트를 수신 호스트로 전달
      • 세그먼트를 전달할 때 최선형 전달 서비스로 전달한다.

    4. 세그먼트가 수신 호스트 B에 도착
    5. B는 세그먼트 안의 목적지 포트 번호 검사(46428)
      → 세그먼트를 포트 46428로 식별되는 소켓에 전달(역다중화)
      • 호스트 B의 프로세스들은 UDP 소켓과 그와 연관된 포트 번호를 갖는다.

 


UDP 소켓의 식별

  • UDP 소켓은 목적지 IP 주소목적지 포트 번호로 구성된 두 요소로 된 집합에 의해 식별됨
    → 목적지 IP 주소와 목적지 포트 번호만 같으면 됨

  • 2개의 UDP가 목적지 IP 주소와 목적지 포트 번호만 같고,
    출발지 IP 주소와 출발지 포트 번호는 다른 경우
    → 같은 목적지 소켓을 통해 같은 프로세스로 간다.

 


출발지 포트 번호의 역할

출발지와 목적지 포트의 번호 교환
출발지와 목적지 포트의 번호 교환

  • 출발지 포트 번호는 ‘회신 주소’의 한 부분으로 사용된다.
  • A → B로 세그먼트가 전달되고, 다시 B→A로 세그먼트를 보낼 때 사용됨
    → 세그먼트의 목적지 포트 번호는 세그먼트의 출발지 포트 번호로부터 가져온다.

 

 


연결지향형 다중화와 역다중화(TCP 소켓)

 


TCP 소켓의 식별

  • 네트워크로부터 호스트에 TCP 세그먼트가 도착하면, 역다중화를 위해 4개의 값을 모두 사용
  • 출발지 IP 주소 + 출발지 포트 번호 + 목적지 IP 주소 + 목적지 포트 번호에 의해 식별됨
    • 이를 4개 요소의 집합(four-tuple)이라고 함.

  • 2개의 TCP 세그먼트가 출발지 주소 또는 출발지 포트번호가 다르다면 서로 다른 소켓으로 감
    • 초기 연결 설정 요청을 전달하는 TCP는 예외

 


데이터 전송 과정

  1. TCP 서버 애플리케이션은 환경 소켓을 가진다.
    • 이 소켓은 포트 번호 12000을 가진 TCP 클라이언트로부터 연결 설정 요청을 기다림

  2. TCP 클라이언트는 소켓을 생성하고 연결 설정 요청 세그먼트를 보낸다.
    • 연결 설정 요청 세그먼트 구성
      • 목적지 포트 번호 12000 + (TCP 헤더에 설정된 특별한 연결 설정 비트)
      • 출발지 포트 번호를 포함 ← 클라이언트가 선택한 번호

  3. 서버 프로세스가 호스트 운영체제가 포트 12000을 포함하는 연결 요청 세그먼트를 수신
  4. 해당 세그먼트를 포트 번호 12000으로 연결 수락을 기다리는 서버 프로세스로 보냄
  5. 서버 프로세스는 새로운 연결 소켓을 생성
    • 생성된 연결 소켓은 해당 세그먼트의 4개 요소의 집합의 값에 의해 식별됨

  6. 이후부터 도착하는 모든 세그먼트의 4가지 요소가 연결 소켓과 일치하면 해당 소켓으로 역다중화
    → 적절한 TCP 연결과 함께 클라이언트의 서버와 데이터를 주고받을 수 있다.

 


서버 호스트의 다중 TCP 소켓 지원

  • 서버 호스트는 동시에 존재하는 많은 TCP 소켓을 지원할 수 있다.
  • 같은 클라이언트 호스트에서 출발하더라도, 출발지 포트 번호가 다르다면 독립적임

 

 


웹 서버와 TCP

  • 아파치 웹 서버같이 포트 번호 80상에 동작하는 호스트
  • 클라이언트(브라우저)가 서버로 세그먼트를 전달
    모든 세그먼트는 목적지 포트 번호 80을 가짐
    • 서버는 세그먼트를 출발지 IP주소와 출발지 포트 번호로 구별

 


스레드의 사용

  • 연결 소켓과 프로세스 사이에 항상 일대응 대응이 이루어지진 않음
    → 실제로 오늘날, 많은 고성능 웹 서버는 하나의 프로세스만 사용
  • 각각의 새로운 클라이언트 연결을 위해 새로운 연결 소켓과 함께 새로운 스레드를 생성한다.

 


지속적인 HTTP vs 비지속적인 HTTP

  • 비지속적인 HTTP를 사용할 경우
    • 빈번하게 발생하는 소켓 생성과 종료는 웹 서버 성능에 심한 부담을 준다.
    • ← 모든 응답/요청마다 매번 새로운 소켓이 생성되고 종료되기 때문