트랜스포트 계층

Stormi·2022년 7월 30일
0

네트워크

목록 보기
31/37

애플리케이션 계층과 네트워크 계층 사이에 존재하는 트랜스포트 계층은 계층으로 이루어진 네트워크 구조의 핵심이다. 트랜스포트 계층은 서로 다른 호스트에서 동작하는 애플리케이션 프로세스에게 직접 통신 서비스를 제공하는 중요한 기능을 갖는다.

트랜스포트 계층 서비스 및 개요

트랜스포트 계층 프로토콜은 서로다른 호스트에서 동작하는 애플리케이션 프로세스들 간의 논리적 통신을 제공한다. 논리적 통신은 애플리케이션 관점에서 보면 프로세스들이 동작하는 호스트들이 직접 연결된 것처럼 보인다는 것을 의미한다. 트랜스포트 계층 프로토콜은 네트워크 라우터가 아닌 종단 시스템에서 구현된다. 송신측의 트랜스포트 계층은 송신 애플리케이션 프로세스로 부터 수신한 메시지를 세그먼트로 변환한다.

  • 상위 계층에 제공하는 서비스를 하위계층은 이용할 수 없다.

트랜스포트 계층과 네트워크 계층사이의 관계

트랜스포트 계층은 프로토콜 스택에서 네트워크 계층 바로 상위에 존재한다.

트랜스포트 계층 프로토콜은 서로 다른 호스트에서 동작하는 프로세스들사이에 논리적 통신을 제공하지만, 네트워크 계층 프로토콜은 호스트들 사이의 논리적 통신을 제공한다.

종단 시스템 안에서, 트랜스포트 프로토콜은 애플리케이션 프로세스에서 네트워크 경계까지 메시지를 운반하며, 또한 반대방향으로 네트워크 계층에서 애플리케이션 프로세스로 메시지를 운반한다. 그러나 트랜스포트 프로토콜은 메시지가 네트워크 계층 내부에서 어떻게 이동하는지 언급하지 않는다.
컴퓨터 네트워크는 애플리케이션에게 서로 다른 서비스를 제공하도록 개별 프로토콜을 갖는 다양한 트랜스포트 프로토콜을 만들 수 있게 한다.

만약 네트워크 계층 프로토콜이 호스트 사이에서 전송되는 트랜스포트 계층 세그먼트에 대한 지연 보장이나 대역폭 보장을 제공할 수 없다면 트랜스포트 계층 프로토콜은 프로세스끼리 전송하는 메시지에 대한 지연 보장이나 대역폭 보장을 제공할 수 없다. 그럼에도 불구하고 하위 네트워크 프로토콜이 상응하는 서비스를 제공하지 못할 때에도, 특정 서비스는 트랜스포트 프로토콜에 의해서 제공될 수 있다. 예를들어, 트랜스포트 계층은 하위 네트워크 프로토콜이 비신뢰적일때, 즉, 네트워크 프로토콜이 패킷을 분실하거나 손상하거나 복사본을 만들때에도, 애플리케이션에게 신뢰적인 데이터 전송서비스를 제공할 수 있다. 트랜스포트 프로토콜은 네트워크 계층이 트랜스포트 계층 세그먼트의 기밀성을 보장할 수 없을 때도 침입자가 애플리케이션 메시지를 읽지 못하도록 암호화를 사용할 수 있다.

인터넷 트랜스포트 계층의 개요

인터넷, 좀 더 일반적으로 TCP/IP네트워크는 애플리케이션 계층에게 두가지 구별되는 트랜스포트 계층 프로토콜들을 제공한다. 하나는 애플리케이션에게 비신뢰적이고 비연결형인 서비스를 제공하는 UDP이고, 다른 하나는 애플리케이션에게 신뢰적이고 연결 지향형 서비스를 제공하는 TCP이다. 애플리케이션 개발자는 이 두가지 트랜스포트 프로토콜 중의 하나를 명시해야한다.

트랜스포트 계층 패킷을 세그먼트라고하고 네트워크 계층 패킷을 데이터 그램이라고한다.

인터넷의 네트워크 계층 프로토콜은 "인터넷프로토콜" , 즉, IP라고 부른다. 이는 호스트들간에 논리적인 통신을 제공하는 최선형 전달 서비스이다. 이것은 IP가 통신하는 호스트들간에 세그먼트를 전달하기 위해서 최대한 노력하지만, 어떤 보장도 하지 않는다는 것을 의미한다. 특히 ip는 세그먼트의 전달을 보장하지 않고 세그먼트가 순서대로 전달되는것을 보장하지 않는다. 또한 세그먼트 내부의 데이터 무결성을 보장하지 않는다. 따라서IP를 비신뢰적인 서비스라고 한다.

UDP와 TCP의 가장 기본적인 기능은 종단 시스템 사이의 IP 전달 서비스를 종단시스템에서 동작하는 두 프로세스 간의 전달 서비스로 확장하는 것이다. " 호스트-대-호스트 전달"을 "프로세스-대-프로세스 전달"로 확장하는 것을 트랜스포트 다중화와 역다중화라고한다.

UDP, TCP는 헤더에 오류검출 필드를 포함함으로써 무결성 검사를 제공한다.

TCP는 추가적으로 신뢰적인 데이터 전달을 제공하고 혼잡제어를 사용한다.

TCP는 이러한 기능으로 IP의 비신뢰적인 서비스를 프로세스 사이의 신뢰적인 데이터 전송 서비스로 만들어주고 TCP연결이 링크의 대역폭을 공평하게 공유하여 통과하게해주는 혼잡제어를 한다.

  • TCP 연결간에는 공평하지만 , UDP한테는 밀림

다중화와 역다중화

목적지 호스트에서의 트랜스포트 계층은 네트워크 계층으로부터 세그먼트를 수신한다. 트랜스포트 계층은 호스트에서 동작하는 해당 애플리케이션 프로세스에게 이 세그먼트의 데이터를 전달하는 의무를 가진다. 네트워크 애플리케이션의 한 부분으로서 프로세스가 소켓을 가지고 있다. 이를 통해 네트워크에서 프로세스로 데이터를 전달하며 또한 프로세스로 부터 네트워크로 데이터를 전달하는 출입구 역할을한다.

어떤 주어진 시간에 수신측 호스트에 하나 이상의 소켓이 있을 수 있으므로, 각각의 소켓은 어떤 하나의 유일한 식별자를 가진다. 이 식별자의 포맷은 소켓이 UDP소켓인지 TCP 소켓인지에 따라서 달라진다.

트랜스포트 계층세그먼트의 데이터를 올바른 소켓으로 전달하는 작업을 역다중화라고한다. 출발지 호스트에서 소켓으로부터 데이터를 모으고 이에대한 세그먼트를 생성하기 위해 데이터에 헤더를 붙여 캡슐화하고 이 세그먼트를 네트워크 계층으로 보내는 것을 다중화라고한다.

중간 호스트인 트랜스포트 곛응은 프로세스의 소켓으로부터 바깥으로 나가는 데이터를 모으고, 다음엔 트랜스포트 계층 세그먼트를 만들고 이 세그먼트를 네트워크 계층으로 전달한다.

트랜스포트 계층의 다중화는 두가지 요구사항을 가지고 있다.

  • 소켓은 유일한 식별자를 가진다.

  • 각 세그먼트는 세그먼트가 전달될 적절한 소켓을 가리키는 특별한 필드를 가진다.
    -> 특별한 필드? 출발지 포트번호필드, 목적지 포트번호필드

    UDP, TCP 세그먼트는 다른 필드들도 가진다.

    HTTP -> 80
    FTP -> 21
    DNS -> 53
    SSH- > 22
    SMTP -> 25
    HTTPS -> 443

    새 애플리케이션을 개발할때 애플리케이션 포트번호를 반드시 할당해야한다.
    트랜스포트 계층이 어떻게 역다중화 서비스를 구현할 수 있는지 알았다. ->
    호스트의 각 소켓은 포트 번호를 할당 받는다
    세그먼트가 호스트에 도착하면 트랜스포트 계층은 세그먼트 안의 목적지 포트 번호를 검사하고 상응하는 소켓으로 세그먼트를 보내게 된다.
    세그먼트의 데이터는 소켓을 통해 해당되는 프로세스로 전달된다.

    -> 이것이 UDP의 기본 동작 방식이다.

    비연결형 다중화와 역다중화

    UDP소켓이 생성될 때, 트랜스포트 계층은 포트번호를 소켓에게 자동으로 할당한다. 특히 트랜스포트 계층은 현재 호스트에서 UDP포트로 사용하지 않는 1024~65535사이의 포트번호를 할당한다. 반면 우리는 소켓을 생성한뒤에 socket bind() 방식을 사용하여 특정 포트번호를 UDP 소켓에 할당한다.

    일반적으로 애플리케이션 서버측이 특정 포트번호를 할당하는 것에 반하여 애플리케이션 클라이언트 측은 트랜스포트 계층이 포트 번호를 자동으로 할당한다.

    UDP 소켓에 19157을 가진 호스트 A의 프로세스가 호스트 B의 UDP소켓 46428을 가진 프로세스에게 애플리케이션 데이터 전송을 원한다고 가정하자. 호스트 A의 트랜스포트 계층은 애플리케이션 데이터, 출발지 포트번호, 목적지 포트번호 2개의 다른 값을 포함하는 트랜스포트 계층 세그먼트를 생성한다.

    트랜스포트 계층은 만들어진 세그먼트를 네트워크 계층으로 전달한다. 네트워크 계층은 세그먼트를 IP데이터그램으로 캡슐화하고 최선형 전달 서비스로 세그먼트를 수신 호스트로 전달한다. 이제 이 세그먼트가 수신 호스트 B에 도착하면, 수신 호스트는 세그먼트 안의 목적지 포트 번호를 검사하고 그 세그먼트를 포트 46428로 식별되는 소켓에 전달된다. 호스트 B에 여러 프로세스가 수행될 것을 유의하라 프로세스들은 각각 UDP 소켓과 그 연관된 포트번호를 갖는다. 네트워크로부터 UDP 세그먼트들이 도착하면 호스트 B는 세그먼트의 목적지 포트를 검사하여 세그먼트를 적절한 소켓으로 보낸다. UDP 소켓이 목적지 IP주소와 목적지 포트번호로 구성된 집합에 의해서 식별된다.

    출발지 포트 번호는 무슨 목적으로 사용되는가? A에서 B로 가는 세그먼트에서 출발지 포트번호는 복귀주소의 한 부분으로 사용된다. B가 세그먼트를 다시 A에게 보내길 원할 때, 그 포트번호로부터 안다.서버거 클라이언트로부터 수신한 세그먼트로부터 클라이언트 포트번호를 추출하기위해 python에서 recvfrom()함수를 사용했다. 그러면 서버는 추출된 포트번호를 새로운 세그먼트 목적지 포트 번호로 사용하여 이 새로운 세그먼트를 클라이언트에게 전송한다.

    연결지향형 다중화와 역다중화

    TCP 역다중화를 수행하기 위해서는 TCP 소켓과 TCP 연결 설정을 살펴봐야한다. UDP와 다른 점은 TCP 소켓은 4개 요소들의 집합, 즉, 출발지 IP주소, 출발지 포트번호, 목적지 IP주소, 목적지 포트번호에 의해서 식별된다.

    네트워크로부터 호스트에 TCP 세그먼트가 도착하면, 호스트는 해당되는 소켓으로 세그먼트를 전달하기 위해서 4개 값을 모두 사용한다. udp와는 다르게 다른 출발지 주소 또는 다른 출발지 포트 번호를 가지고 도착하는 2개의 tcp세그먼트는 2개의 다른 소켓으로 향하게 된다.

  • tcp 서버 애플리케이션은 웰컴소켓을 가지고있다.

  • 서버 프로세스로 동작하는 컴퓨터의 호스트 운영체제가 목적지 포트 12000을 포함하는 연결 요청 세그먼트를 수신하면 포트번호목적지에서 연결을 기다리고 있는 서버 프로세스를 찾고 새로운 소켓을 생성한다. 또한 서버는 연결요청 세그먼트의 다음과 같은 네가지 값을 주목한다. 세그먼트 안의 출발지 포트번호, 출발지 호스트의 IP주소, 세그먼트 안의 목적지 포트, 목적지 IP주소

    이렇게 값이 일치하면 세그먼트는 이 소켓으로 역다중화될것이다.

    서버 호스트는 동신에 존재하는 많은 tcp소켓을 지원할 수 있다. 이 각각의 소켓은 프로세스에 접속되어 있으며, 이들 소켓은 4개 요소들의 집합에 의해서 식별된다. tcp 세그먼트가 호스트에 도착하면 이 네가지 필드는 해당되는 소켓으로 세그먼트를 전달하기 위해서 사용된다.

    웹서버와 TCP

    웹 서버와 이 웹 서버가 어떻게 포트 번호를 사용하는 지에 대해 몇가지 유익한 사항을 보면 아파치 웹서버와 같은 웹서버가 포트번호 80상에서 동작하는 호스트를 생각해보자 클라이언트가 서버로 세그먼트를 보내면 모든 세그먼트는 목적지포트 80번을 가지고 있을 것이다. 특히 초기 연기 설정 세그먼트들과 http요청메시지를 전달하는 모든 세그먼트들은 목적지 포트 번호 80을 가질 것이다. 서버는 각기 다른 클라이언트가 보낸 세그먼트 출발지 Ip주소와 출발지 포트번호로 구별한다. 웹 서버가 각각의 연결에 따라서 새로운 프로세슬ㄹ 만드는 것을 보여준다. 이들 프로세스는 각자 연결 소켓을 가지며, 이 연결 소켓을 통해서 http 요청을 수신하고 http응답을 전송한다. 일대일 대응을 항상하는 것은 아니다. 고성능 웹 서버들은 하나의 프로세스만 사용한다. 그러면서 각각의 새로운 클라이언트 연결을 위해 새로운 연결 소켓과 함께 새로운 스레드를 생성한다.

    만약 클라이언트가 지속적인 http를 사용한다면, 지속적인 연결의 존속기간 동안에 클라이언트와 서버는 동일한 서버 소켓을 통해서 http 메시지를 교환할 것이다. 그러나 만약 클라이언트와 서버가 비지속 연결을 한다면 서로다른 tcp연결이 계속 생기니까 서로다른 소켓으로 소통하게 될것이다 . 소켓의 생성과 종료의 빈번함은 웹 서버 성능에 심한 부담을 준다.

0개의 댓글