트랜스포트 계층의 데이터 수신 및 전달
트랜스포트 계층의 의무
- 목적지 호스트의 트랜스포트 계층은 바로 아래의 네트워크 계층으로부터 세그먼트를 수신
→ 목적지 호스트의 트랜스포트 계층은 호스트에서 동작하는 프로세스에게
수신한 세그먼트를 전달할 의무를 지님 - 예시
- 4개의 네트워크 애플리케이션을 갖는다고 가정
- 트랜스포트 계층이 하위 네트워크 계층으로부터 데이터를 수신
→ 4개의 프로세스 중 하나에게 데이터를 전달해야 함
트랜스포트 계층에서의 소켓
- 프로세스는 네트워크 애플리케이션의 한 부분으로서 소켓을 가지고 있다.
- 이를 통해 네트워크와 프로세스 간의 데이터를 교환하는 출입구 역할을 함
- 이를 통해 네트워크와 프로세스 간의 데이터를 교환하는 출입구 역할을 함
- 수신 측 호스트의 트랜스포트 계층은 데이터를 직접 프로세스에 전달하지 않는다.
→ 대신 중간 매개자인 소켓에게 전달 - 각각의 소켓은 하나의 유일한 식별자를 갖는다.
← 수신 측 호스트에 소켓이 여러 개가 존재할 수 있기 때문- 식별자의 포맷은 UDP 소켓인지 또는 TCP 소켓인지에 따라 다름
수신 세그먼트를 소켓으로 보내는 과정(원리)
- 수신 측의 트랜스포트 계층은 수신 소켓을 식별하기 위해
필드 집합
을 검사- 각각의 트랜스포트 계층 세그먼트는
필드 집합
을 가진다.
- 각각의 트랜스포트 계층 세그먼트는
- 세그먼트를 해당 소켓으로 보낸다. →
역다중화(demultiplexing)
역다중화
: 트랜스포트 계층 세그먼트의 데이터를 올바른 소켓으로 전달하는 작업- cf )
다중화(multiplexing)
- 출발지 호스트에서 소켓으로부터 데이터를 모으고, 각 데이터에 헤더 정보로 캡슐화
→ 세그먼트 생성 - 생성된 세그먼트들을 네트워크 계층으로 전달하는 작업
- 출발지 호스트에서 소켓으로부터 데이터를 모으고, 각 데이터에 헤더 정보로 캡슐화
중간 호스트의 트랜스포트 계층
- 해당 그림에서 중간 호스트의 트랜스포트 계층
→ 네트워크 계층 아래로부터 수신한 세그먼트를 프로세스 P1 또는 P2로 역다중화해야 함.
- 도착한 세그먼트의 데이터가 상응하는 프로세스의 소켓에게 전달됨으로써 이루어짐
- 중간 호스트의 트랜스포트 계층은 프로세스 소켓으로부터 외부로 나가는 데이터를 모아 세그먼트로 만듦
→ 생성한 세그먼트를 아래 네트워크 계층에 전달
트랜스포트 계층 다중화의 2가지 요구사항
- 소켓은 유일한 식별자를 가져야 한다.
- 각 세그먼트는 세그먼트가 전달될 적절한 소켓을 가리키는 특별한 필드를 갖는다.
- 특별한 필드 =
출발지 포트 번호 필드
+목적지 포트 번호 필드
- 각각의 포트 번호는 0 ~ 65535(16비트 정수)
- 새 애플리케이션을 개발할 때, 포트 번호를 반드시 할당해야 함
잘 알려진 포트 번호(well known port number)
의 사용을 엄격하게 제한한다.- 잘 알려진 포트 → 0 ~ 1023번까지의 포트번호
- HTTP(80)와 FTP(21)처럼 잘 알려진 애플리케이션 프로토콜이 사용하도록 예약됨
- 특별한 필드 =
포트 번호 관점에서의 세그먼트 수신 과정
- 호스트의 각 소켓은 포트 번호를 할당받는다.
- 세그먼트가 호스트에 도착하면, 트랜스포트 계층은 세그먼트 안의 목적지 포트 번호 검사
- 목적지 포트 번호와 상응하는 소켓으로 세그먼트를 전달
- 세그먼트의 데이터는 소켓을 통해 해당되는 프로세스로 전달됨
→ UDP의 기본적인 동작 방식
비연결형 다중화와 역다중화(UDP 소켓)
- 애플리케이션의 서버 측은 특정 포트 번호를 할당
- 애플리케이션의 클라이언트 측은 트랜스포트 계층이 포트 번호를 자동으로 할당
데이터 전송 과정
- 가정
- 호스트 A → UDP 소켓 19157을 가짐
- 호스트 B → UDP 소켓 46428을 가짐
- A의 UDP 소켓 프로세스가 B의 UDP 소켓 프로세스에게 애플리케이션 데이터 전송
- 전달 과정
- A의 트랜스포트 계층은 전달에 필요한 것들을 포함해 트랜스포트 계층 세그먼트를 생성
- 애플리케이션 데이터, 출발지 포트 번호(19157), 목적지 포트 번호(46428), 기타 2개의 값
- 애플리케이션 데이터, 출발지 포트 번호(19157), 목적지 포트 번호(46428), 기타 2개의 값
- 생성된 세그먼트를 네트워크 계층으로 전달
- 네트워크 계층은 세그먼트를 IP 데이터그램으로 캡슐화하고 세그먼트를 수신 호스트로 전달
- 세그먼트를 전달할 때 최선형 전달 서비스로 전달한다.
- 세그먼트를 전달할 때 최선형 전달 서비스로 전달한다.
- 세그먼트가 수신 호스트 B에 도착
- B는 세그먼트 안의 목적지 포트 번호 검사(46428)
→ 세그먼트를 포트 46428로 식별되는 소켓에 전달(역다중화)
- 호스트 B의 프로세스들은 UDP 소켓과 그와 연관된 포트 번호를 갖는다.
- A의 트랜스포트 계층은 전달에 필요한 것들을 포함해 트랜스포트 계층 세그먼트를 생성
UDP 소켓의 식별
- UDP 소켓은 목적지 IP 주소와 목적지 포트 번호로 구성된 두 요소로 된 집합에 의해 식별됨
→ 목적지 IP 주소와 목적지 포트 번호만 같으면 됨 - 2개의 UDP가 목적지 IP 주소와 목적지 포트 번호만 같고,
출발지 IP 주소와 출발지 포트 번호는 다른 경우
→ 같은 목적지 소켓을 통해 같은 프로세스로 간다.
출발지 포트 번호의 역할
- 출발지 포트 번호는 ‘회신 주소’의 한 부분으로 사용된다.
- A → B로 세그먼트가 전달되고, 다시 B→A로 세그먼트를 보낼 때 사용됨
→ 세그먼트의 목적지 포트 번호는 세그먼트의 출발지 포트 번호로부터 가져온다.
연결지향형 다중화와 역다중화(TCP 소켓)
TCP 소켓의 식별
- 네트워크로부터 호스트에 TCP 세그먼트가 도착하면, 역다중화를 위해 4개의 값을 모두 사용
- 출발지 IP 주소 + 출발지 포트 번호 + 목적지 IP 주소 + 목적지 포트 번호에 의해 식별됨
- 이를 4개 요소의 집합(four-tuple)이라고 함.
- 이를 4개 요소의 집합(four-tuple)이라고 함.
- 2개의 TCP 세그먼트가 출발지 주소 또는 출발지 포트번호가 다르다면 서로 다른 소켓으로 감
- 초기 연결 설정 요청을 전달하는 TCP는 예외
데이터 전송 과정
- TCP 서버 애플리케이션은 환경 소켓을 가진다.
- 이 소켓은 포트 번호 12000을 가진 TCP 클라이언트로부터 연결 설정 요청을 기다림
- 이 소켓은 포트 번호 12000을 가진 TCP 클라이언트로부터 연결 설정 요청을 기다림
- TCP 클라이언트는 소켓을 생성하고 연결 설정 요청 세그먼트를 보낸다.
- 연결 설정 요청 세그먼트 구성
- 목적지 포트 번호 12000 + (TCP 헤더에 설정된 특별한 연결 설정 비트)
- 출발지 포트 번호를 포함 ← 클라이언트가 선택한 번호
- 연결 설정 요청 세그먼트 구성
- 서버 프로세스가 호스트 운영체제가 포트 12000을 포함하는 연결 요청 세그먼트를 수신
- 해당 세그먼트를 포트 번호 12000으로 연결 수락을 기다리는 서버 프로세스로 보냄
- 서버 프로세스는 새로운 연결 소켓을 생성
- 생성된 연결 소켓은 해당 세그먼트의 4개 요소의 집합의 값에 의해 식별됨
- 생성된 연결 소켓은 해당 세그먼트의 4개 요소의 집합의 값에 의해 식별됨
- 이후부터 도착하는 모든 세그먼트의 4가지 요소가 연결 소켓과 일치하면 해당 소켓으로 역다중화
→ 적절한 TCP 연결과 함께 클라이언트의 서버와 데이터를 주고받을 수 있다.
서버 호스트의 다중 TCP 소켓 지원
- 서버 호스트는 동시에 존재하는 많은 TCP 소켓을 지원할 수 있다.
- 같은 클라이언트 호스트에서 출발하더라도, 출발지 포트 번호가 다르다면 독립적임
웹 서버와 TCP
- 아파치 웹 서버같이 포트 번호 80상에 동작하는 호스트
- 클라이언트(브라우저)가 서버로 세그먼트를 전달
→ 모든 세그먼트는 목적지 포트 번호 80을 가짐- 서버는 세그먼트를 출발지 IP주소와 출발지 포트 번호로 구별
스레드의 사용
- 연결 소켓과 프로세스 사이에 항상 일대응 대응이 이루어지진 않음
→ 실제로 오늘날, 많은 고성능 웹 서버는 하나의 프로세스만 사용 - 각각의 새로운 클라이언트 연결을 위해 새로운 연결 소켓과 함께 새로운 스레드를 생성한다.
지속적인 HTTP vs 비지속적인 HTTP
- 비지속적인 HTTP를 사용할 경우
- 빈번하게 발생하는 소켓 생성과 종료는 웹 서버 성능에 심한 부담을 준다.
- ← 모든 응답/요청마다 매번 새로운 소켓이 생성되고 종료되기 때문