[TIL]모두의 네트워크 6장
TIL
모두의 네트워크를 읽고 요약 및 정리한 글 입니다.
6장: 전송 계층 - 신뢰할 수 있는 데이터 전송하기
23 전송 계층의 역할
5장에서 네트워크 계층을 설명할 때 다른 네트워크로 데이터를 전송하려면 라우터가 필요하고, 라우터의 라우팅 기능을 사용하여 전송할 수 있다고 했다. 하지만 라우팅 기능을 사용한다고 하더라도 라우팅 정보가 잘못된 경우나 라우터를 경유하는 도중에 라우터에 문제가 생기거나 패킷이 손상되는 등의 문제가 발생하면 데이터를 목적지에 제대로 전송하지 못할 수도 있다. 전송 계층은 목적지에 신뢰할 수 있는 데이터를 전달하기 위해 필요하다.
전송 계층에는 오류를 점검하는 기능이 있다. 만일 오류가 발생할 경우 데이터의 재전송을 요청한다. 즉, 네트워크 계층은 목적지까지 데이터를 전달하는 역할을 하고, 전송 계층에서는 데이터가 제대로 도착했는지 확인한다. 또한 전송 계층에서는 전송된 데이터의 목적지가 어떤 애플리케이션인지 식별하는 기능도 있다.
전송 계층의 특징을 간단히 살펴보면 신뢰성/정확성과 효율성으로 구분할 수 있다. 신뢰성/정확성은 데이터를 목적지에 문제없이 전달하는 것이고, 효율성은 데이터를 빠르고 효율적으로 전달하는 것이다. 여기서 신뢰할 수 있고 정확한 데이터를 전달하는 통신을 연결형 통신이라고 하고, 효율적으로 데이터를 전달하는 통신을 비연결형 통신이라고 한다.
주로 신뢰할 수 있고 정확한 데이터 전송이 필요한 애플리케이션에는 연결형 통신이 사용되고, 효율적인 데이터 전송이 필요한 애플리케이션에는 비연결형 통신이 사용된다. 전송 계층의 연결형 통신 프로토콜에는 TCP가 사용되고, 비연결형 통신 프로토콜에는 UDP가 사용된다.
24 TCP의 구조
전송계층에서 TCP로 전송할 때 붙이는 헤더를 TCP 헤더라고 한다. 그리고 이 TCP 헤더가 붙은 데이터를 세그먼트(segment)라고 한다. TCP 헤더의 구조는 아래와 같다.
앞서 살펴보았듯이 TCP는 연결형 통신에 사용되는 프로토콜이다. 연결형 통신에서는 데이터를 보내기 전에 연결(connection)이라는 가상의 독점 통신로를 확보해야 한다. 이 연결을 확립한 후에 데이터를 전송할 수 있다. 위의 TCP 헤더에서 예약 옆에 코드 비트가 존재하고, 코드 비트에는 연결의 제어 정보가 기록된다.
코드 비트는 각 비트별로 역할이 있다. 초깃값은 0이고 비트가 활성화되면 1이 된다. 연결을 확립하려면 이 중 SYN과 ACK가 필요하다. SYN은 연결 요청, ACK는 확인 응답을 뜻한다.
연결(connection)은 아래와 같이 SYN과 ACK를 사용하여 확립할 수 있다. 신뢰할 수 있는 연결을 하려면 데이터를 전송하기 전에 패킷을 교환하는데, 총 세 번 확인한다. 이처럼 데이터를 보내기 전에 연결을 확립하기 위해 패킷 요청을 세 번 교환하는 것을 3-way 핸드셰이크(three-way handshake)라고 한다.
데이터를 전송한 후에는 연결을 끊기 위한 요청을 교환해야 한다. 연결을 끊을 때는 FIN과 ACK를 사용하는데, FIN은 연결 종료를 뜻한다. 연결 종료 과정에서는 패킷 요청을 네 번 교환하는 데 이를 4-way 핸드셰이크라고 한다.
25 일련번호와 확인 응답 번호의 구조
3-way 핸드셰이크가 끝나고 실제 데이터를 보내거나 상대방이 받을 때는 위에서 본 TCP 헤더의 일련번호(sequence number)와 확인 응답 번호(acknowledgement number)를 사용한다.
TCP에서는 데이터를 분할해서 보내는데 일련번호는 송신 측에서 수신 측에 ‘이 데이터가 몇 번째 데이터인지’알려주는 역할을 한다. 전송된 데이터에 일련번호를 부여하면 수신자는 원래 데이터의 몇 번째 데이터를 받았는지 알 수 있다. 확인 응답 번호는 수신 측이 몇 번째 데이터를 수신했는지 송신 측에 알려주는 역할을 한다. 그래서 이 번호는 다음 번호의 데이터를 요청하는데도 사용된다. 예를 들어 10번 데이터를 수신하면 11번 데이터를 송신 측에 요청하는 것이다. 이것을 확인 응답이라고 한다.
하지만 위와 같은 방식으로 세그먼트(데이터) 하나를 보낼 때마다 확인 응답을 한 번 반환하는 것은 효율이 낮다. 반대로 매번 확인 응답을 기다리지 않고 세그먼트를 연속해서 보내고 난 다음에 확인 응답을 반환하면 효율이 높아진다. 받은 세그먼트를 일시적으로 보관하는 장소를 버퍼(buffer)라고 부른다.
하지만 수신측에서 세그먼트를 대량으로 받아서 처리하지 못하는 경우 오버플로(overflow)가 발생한다. 따라서 오버플로가 발생하지 않게 버퍼의 한계 크기를 알고 있어야 한다. 그것이 TCP 헤더의 윈도우 크기(window size) 값에 해당한다. 윈도우 크기는 얼마나 많은 용량의 데이터를 저장해 둘 수 있는지를 나타내는 값이다. 이 윈도우 크기의 초깃값은 3-way 핸드셰이크를 할 때 판단한다.
26 포트 번호의 구조
전송 계층에서 연결 확립, 재전송 제어, 윈도우 제어 기능이 수행되었다. 이러한 기능들에 의해 TCP는 데이터를 정확하게 전달할 수 있다. 하지만 전송 계층에는 이외에도 전송된 데이터의 목적지가 어떤 애플리케이션인지 구분하는 역할이 있다. 이런 기능을 수행하기 위해 TCP 헤더에는 출발지 포트 번호(source port number)와 목적지 포트 번호(destination port number)가 필요하다. 이 TCP 헤더에 포트 번호가 있기 때문에 애플리케이션을 구분할 수 있다.
웹 브라우저로 접속할 때 웹 브라우저에는 임의의 포트가 자동으로 할당된다. 그래서 서버 측에서는 포트 번호를 정해 둬야 하지만 클라이언트 측은 정하지 않아도 괜찮다.
27 UDP의 구조
앞서 살펴본 TCP는 3-way 핸드셰이크로 연결이 확립된 후에 데이터를 전송하고 그때 확인 응답을 한다. 데이터 전송 도중에 오류가 발생하면 재전송하거나 포트 번호로 애플리케이션을 구분하여 데이터를 정확하게 전달하기 위한 기능도 있다. 반대로 UDP는 비연결형 통신이라서 데이터를 전송할 때 TCP처럼 시간이 걸리는 확인 작업을 일일이 하지 않는다.
UDP는 TCP와 달리 효율성을 중요하게 여기는 프로토콜이다. 따라서 데이터를 효율적으로 빠르게 보낼 수 있다는 장점을 가지고 있다. 이 때문에 스트리밍 방식으로 전송하는 동영상 서비스와 같은 곳에서 사용된다.
UDP에서는 아래와 같이 UDP 헤더가 붙은 데이터를 UDP 데이터그램이라고 한다. UDP는 신뢰성과 정확성이 필요하지 않아서 TCP 헤더에 비해 간결하다.
또한 UDP를 사용하면 랜에 있는 컴퓨터나 네트워크 장비에 데이터를 일괄로 보낼 수 있다. 이것을 브로드캐스트(broadcast)라고 한다.
용어 정리
- 전송 계층(transport layer, 트랜스포트 계층): 신뢰할 수 있는 데이터를 순차적으로 전달하는 역할을 하므로 상위 계층들이 데이터 전달의 유효성이나 효율성을 신경 쓰지 않도록 한다. 데이터가 중복되거나 누락되지 않고 오류 없이 순서에 맞게 전송되도록 관리한다.
- 연결형(connection-oriented): 데이터를 교환하기 전에 연결을 맺고 데이터를 교환하는 동안 계속 연결을 관리하는 프로토콜의 한 형태이다.
- 비연결형(connectionless): 연결(connection)에 대한 초기화 과정이 없는 통신이다.
- TCP(Transmission Control Protocol, 전송 제어 프로토콜): 전송 계층의 프로토콜은 연결형(connection-oriented) 통신 방식이며 신뢰할 수 있는 데이터 전송을 보장한다.
- 대역폭(bandwidth): 정해진 시간 동안 전송될 수 있는 데이터의 양(주로 속도를 의미한다)을 말한다. 대역폭은 제한적이다.
- UDP(User Datagram Protocol): 정보를 서로 주고받을 때 보내는 쪽에서 일방적으로 데이터를 전달하는 통신 프로토콜이다. 연결을 맺을 필요가 없고 정보를 보내거나 받는다는 신호도 필요하지 않다.
- 3-way 핸드셰이크(three-way handshake): TCP 통신에서 사용하는 신뢰성을 제공하기 위한 통신 방식이다. 컴퓨터 간에 연결을 맺기 위한 초기화 과정으로 세 단계로 되어 있어서 three-way라고 부른다.
- 잘 알려진 포트(well-known ports): 특정 애플리케이션이 사용할 수 있도록 예약되어 있는 포트로 1~1023번 포트를 말한다.
- 브로드캐스트(broadcast): 네트워크의 모든 컴퓨터와 장비에 같은 패킷을 일괄전송하는 방식이다.
- 일련번호(sequence number): TCP에서는 데이터를 보낼 때마다 각 데이터에 고유한 번호를 붙여서 전송을 시도한다. 이 번호를 이용하여 TCP 패킷의 순서를 제어할 수 있다.
- 포트 번호(port number): 컴퓨터가 데이터 통신을 할 때 통신하고자 하는 네트워크 서비스나 특정 프로세스를 식별하는 논리 단위다. 포트 번호는 0 ~ 65535번을 사용할 수 있다. 0 ~ 1023번은 잘 알려진 포트로 특정 애플리케이션이 사용할 수 있도록 예약된 번호다.
Leave a comment