[TCP/IP] 4. 트랜스포트층 (TCP/IP 5계층)

Lemon·2022년 10월 18일

TCP/IP

목록 보기
5/9
post-thumbnail

💡 TCP/IP가 보이는 그림책을 정리한 내용입니다.

TL;DR

애플리케이션층의 역할이 서비스를 실현하는 것인데 비해, 애플리케이션층 바로 아래에 위치한 트랜스포트층의 역할은 통신을 실현하는 것이다.

transport에는 수송하다, 운반하다의 뜻이 있다. 이것으로 상상할 수 있듯이 트랜스포트층의 역할은 데이터를 상대에게 전달하는 것이다. 하지만 단지 상대 컴퓨터에 전달하면 그것으로 OK는 아니다. 상대 애플리케이션층에 있는 어떤 프로토콜에게 전달할지까지 책임지고 전달해야된다.

애플리케이션층서비스의 수만큼 프로토콜이 존재한다. 그 중에서 목적한 프로토콜을 지정하기 위해 포트(port)라는 장치를 사용한다. 포트란 애플리케이션층에 설치된 출입구를 말하는 것으로, 각각을 개별 프로토콜로 가는 현관문이라고 생각하면 된다. 포트에는 포트 번호라는 고유의 숫자가 할당되어 있으므로, 이것을 사용해 어떤 프로토콜에게 전달할지를 지정하는 것이다. 포트가 여러 개 있는 이유프로토콜을 식별할 수 있다는 점 외에도 다른 통신 서비스를 동시에 사용할 수 있다는 장점도 있다.

그런데 상대에게 전달한다는 목적을 달성하기 위해 트랜스포트층에는 성질이 다른 두 개의 프로토콜이 있다.

그 중 하나가 TCP(Transmission Control Protocol)이다. TCP는 데이터를 안전하고 확실하게 전달할 것을 모토로 한 프로토콜로, 데이터가 도중에 파손되거나 사정이 있어 상대에게 전달되지 못했을 때 재전송하는 기능이 있다. 때문에 데이터의 정확성이 요구되는 전자메일 서비스나 WWW 서비스 등에 사용되고 있다.

또 다른 하나는 UDP(User Datagram Protocol)이다. UDP는 데이터를 빨리 전달할 것을 모토로 하고 있기 대문에 상대에게 데이터를 보내기만 할뿐 이 후 어떤 지원도 하지 않는다. 그렇다면 데이터가 안전하게 전해졌다는 보장이 없는데 UDP는 왜 있는거지라는 의문을 가지는 사람도 있을 것이다. UDP가 중요시 되는 경우는 실시간성이 요구되는 IP 전화나 스트리밍 송출 등이다. 이런 서비스에서는 도중에 음이나 영상이 조금 흐트러졌다고 해서 재송신을 기다릴 수 없다. 프로바이더(provider)의 등장으로 인해 음악이나 영상 라이브 송출, TV 전화 등이 성행하고 있는데, 이러한 서비스는 모두 UDP 상에서 이루어지고 있다.


용어 설명

포트 (port)
일반적으로 컴퓨터나 통신 장비에서 다른 장치와 물리적으로 접속되는 부분을 말하며, 특히 TCP/IP에서는 클라이언트 프로그램이 네트워크 상의 특정 서버 프로그램을 지정하는 방법으로 사용된다.

TCP & UDP
TCP/IP 5계층 중 트랜스포트층에서 사용되는 프로토콜로 TCP는 데이터 전송의 정확성을 UDP는 데이터 전송의 속도를 강조한 프로토콜이다.

IP 전화
정확히 말하면 VoIP(Voice over Internet Protocol) 기술을 말하며, IP 망에서 음성 데이터를 실어서 전송하는 것이다. IP망은 기존의 전화선과는 달리 여러 데이터의 전송이 가능하며 비용이 저렴하고 확장성이 뛰어나다.

스트리밍(streaming)
stream은 ‘물이 흐른다’는 뜻으로, 멀티미디어 파일을 다운로드와 동시에 재생이 가능하도록하는 서비스를 말한다.

프로바이더(provider)
일반적으로 ISP(Internet Service Provider)를 말하며, 개인이나 기업체에게 인터넷 접속 서비스, 웹사이트 구축 및 웹 호스팅 서비스 등을 제공하는 회사를 말한다.


1. 트랜스포트층의 역할

트랜스포트층은 애플리케이션층과 네트워크층의 중계 역할을 한다.

데이터가 항상 확실히 전달된다고 할 수 없으므로 문제가 발생한 경우에는 대처 방안이 필요하다. 이 때 통신 서비스에 맞는 방법으로 그것을 처리하는 것이 트랜스포트층의 역할이다.

트랜스포트층에는 TCP(Transmission Control Protocol)UDP(User Datagram Protocol)라는 두 개의 프로토콜이 있다. TCP는 신뢰성을, UDP는 속도를 중시하는 프로토콜이다.

TCP는 송신하는 데이터를 확실히 상대에게 전달하고 싶을 때 사용한다. WWW, 전자메일 등에서 TCP를 이용한다.

UDP는 송신하는 패킷이 작을 때나 데이터 재전송할 필요가 없을 때 사용한다. IP 전화나 스트리밍 등에서 이용한다.


2. 애플리케이션의 현관

💡 목적하는 애플리케이션 프로토콜에 데이터를 확실히 넘겨줄 수 있도록 각각 개별 현관문을 준비하고 있다.

애플리케이션층에는 애플리케이션 프로토콜마다 데이터 출입구가 마련되어 있다. 이 출입구를 포트(port)라고 하며, 각 포트에는 포트 번호가 붙어있다. 통신을 수행할 때는 포트 번호를 사용하여 보낼 곳을 지정한다. 수신측에서는 TCP 헤더에 적혀있는 포트 번호를 보고, 받아서 건네줄 애플리케이션 프로토콜을 판단한다.

포트 번호는 0~65535번까지 있다. 그중 0~1023번까지는 통신 서비스마다 미리 예약되어 있다. 잘 알려진 포트 번호(well-known port number)라고 한다.

서비스애플리케이션층 프로토콜포트 번호트랜스포트층 프로토콜
WWWHTTP80TCP/UDP
WWW(보안 추가)HTTPS443TCP/UDP
전자메일(송신)SMTP25TCP/UDP
전자메일(수신)POP3110TCP/UDP
파일 전송FTP20, 21TCP/UDP
원격 로그인TELNET23TCP/UDP
원격 로그인(보안)SSH22TCP/UDP
넷뉴스NNTP119TCP/UDP
네트워크 관리 DNSDNS53TCP/UDP
네트워크 관리 DHCPDHCP546, 574UDP
네트워크 관리 SNMPSNMP161, 162UDP

그 외 포트 번호는 사용자가 임의로 설정할 수 있다. 하지만 이때 통신하는 컴퓨터 간에 어떤 포트 번호를 사용할 지에 대한 인식이 통일되어 있어야 한다.


3. TCP 프로토콜

💡 TCP는 데이터 전달의 신뢰성을 중시한 프로토콜이다.

일대일 통신

TCP는 데이터를 확실히 전달하기 위해 수신측과 일대일로 통신한다. 이런 통신을 넥션형 통신이라고 하며, 대강 3단계로 이루어져있다.

  1. 수신측이 데이터를 받을 수 있는 상태인지 확인 후 통신을 개신한다. 이것을 통신을 연결한다고 한다.
  2. 데이터를 정해진 크기로 분할하고, TCP 헤더를 붙여서 순서대로 송신한다.
    트랜스포트층에서 취급하는 데이터의 단위세그먼트(segment)라고 한다.
    수신층은 전달된 데이터를 확인한다.
  3. 데이터를 다 보냈으면 통신을 종료한다.

수신측과의 연락을 긴밀하게 취함으로써 데이터 송신의 확실성을 높일 수 있다.

애플리케이션층에 전달

수신측에서 전해받은 데이터를 원래 형태로 다시 맞춘 후 애플리케이션 층에 전달

  1. TCP 헤더의 정보를 보고 데이터를 순서대로 맞춘다.
    데이터의 순서를 가리키는 번호 외에 포트 번호나 데이터가 무사한지를 확인하기 위한 값 등이 적혀있다.
  2. TCP 헤더를 가지고 데이터를 다시 맞춘다.
  3. 애플리케이션층의 프로토콜에 전달한다.
    어떤 프로토콜에 전달할지는 포트 번호를 보고 판단한다.

4. 확실히 전달하기 위해(1)

💡 TCP에서는 확실한 주고받기를 하기 위해 통신 상태에 대해 연락을 취한다.

통신 상대에게 통신 상태를 전하는 수단으로 사용되는 것이 TCP 헤더에 있는 6비트의 컨트롤 플래그(Control flag)이다. 상대에게 전하고 싶은 항목은 ‘1’로 만든다. (그 외는 0으로 만든다.)
1이 들어간 상태를 플래그가 설정되었다고 한다.

URG (Urgent) : 1이면 세그먼트가 긴급한 데이터를 가지고 있다.
ACK (Acknowledgment) : 1이면 통신 확인에 대해 알겠다고 응답한 것이다(확인 응답)
PSH (Push) : 1이면 세그먼트를 바로 애플리케이션층에 전달한다.
RST (Reset) : 1이면 통신을 강제적으로 해제한다.
SYN (Synchronize) : 1이면 통신 개시를 요청한다.
FIN (Fin) : 1이면 통신 종료를 요청한다.

통신 세계에서는 일반적으로 상대와 서로 확인해가면서 주고받는 것을 핸드쉐이크(handshake)라고 한다. TCP에서는 통신을 개시할 때 다음과 같이 주고받는 데, 이것을 3-way 핸드쉐이크라고 한다.

💻 → 통신을 시작합시다 → 💻
💻 ← 알겠어요, 통신을 시작하죠 ← 💻
💻 → 알겠어요 → 💻

데이터양의 확인

실제로 통신을 시작하기 전에 양쪽 모두 다룰 수 있는 데이터양을 확인한다.
이 크기를 세그먼트 사이즈라고 한다. 한번에 받을 수 있는 양을 윈도우 사이즈라고 한다.

💻 A
세그먼트 사이즈 150byte
윈도우 사이즈 32KB

💻 B
세그먼트 사이즈128byte
윈도우 사이즈 64KB

💻 A, 💻 B에서 수치가 작은 쪽으로 맞춘다.
세그먼트 사이즈128byte
윈도우 사이즈 32KB

통신 해제

통신을 해제할 때도 TCP 헤더의 컨트롤 플래그를 사용하여 연락을 취한다.

💻 → 통신을 끝냅시다 → 💻
💻 ← 알겠어요 ← 💻
💻 ← 통신을 끝냅시다 ← 💻
💻 → 알겠어요 → 💻


5. 확실히 전달하기 위해(2)

💡 데이터가 무사히 전달되었는지 서로 하나씩 확인하는 것도 TCP의 특징이다.

TCP 헤더에는 데이터의 순서를 나타내는 번호(시퀀스 번호)가 적혀있다. 헤더를 확실히 받기 위해서 이 번호를 사용해 다음과 같은 주고받기를 수행한다.

  1. 송신층
    TCP 헤더에 시퀀스 번호를 쓰고, 세그먼트를 보낸다.

  2. 수신측
    시퀀스 번호를 보고 순서대로 전달되고 있는지를 확인하고, 전달된 세그먼트의 다음 번호를 송신측에게 알려준다.

  3. 송신측
    무사히 전달되었다는 것을 확인하고, 다음 세그먼트를 보낸다.

  4. 수신측
    다음 세그먼트를 받고, 시퀀스 번호를 보고 순서대로 나열한다.

세그먼트가 없어질 때까지 계속한다. 효율은 떨어지지만 확실하다.
세그먼트는 하나씩 보내는 것보다 몇 개씩 모아서 보내는 것이 효율적이다. 통신을 시작할 때 정한 윈도우 사이즈까지라면 확인 응답을 기다리지 않고 모아서 보낼 수 있다.

윈도우 사이즈의 변경

윈도우 사이즈는 통신 도중에 변경할 수 있다. 그래서 네트워크가 비어있을 때는 크게하고, 혼잡할 때는 작게하는 등 상황에 맞게 조절할 수 있다. 이렇게 TCP는 약속에 대해 세세한 처리가 가능하다.


6. 문제 발생시의 처리

💡TCP에는 ‘송수신 중에 문제가 발생하면 세그먼트를 재전송한다’는 약속이 있다.

확인 응답이 없을 때 재전송한다.

일정 시간 기다려도 확인 응답이 없을 때는 이유 불문 송신측은 세그먼트를 재전송한다.

세그먼트의 지연 및 분실
송신 도중에 세그먼트가 해방불명이 되버리는 경우가 있다. 세그먼트가 전달되지 않으면 수신측은 확인 응답을 보낼 수 없다.

확인 응답의 지연 및 분실
확인 응답 자체가 네트워크 상에서 행방불명되는 경우도 생각할 수 있다.
세그먼트가 중복되면 하나를 남기고 파기한다.

데이터의 파손
송신 도중 데이터가 깨지는 경우, 수신측에서는 그 데이터를 파기하고 확인 응답은 보내지 않는다. 깨졌는지 아닌지는 헤더에 있는 체크섬(checksum)이라는 값을 사용하여 판단한다.

재전송 횟수
일정 횟수 이상을 재전송해도 확인 응답이 돌아오지 않는 경우에는 송신측이 강제적으로 통신을 해제한다. 통신 해제할 때는 TCP 헤더의 컨트롤 플래그 RST를 1로 만든다.

수신측의 처리

수신측에서는 TCP 헤더에 적힌 포트 번호를 보고 지정된 애플리케이션 프로토콜에 데이터를 전달한다. 데이터가 하나의 세그먼트로 묶여있을 때는 헤더를 제거하고 전달하기만 하면 되지만, 두개 이상으로 분할되어 있는 경우는 세그먼트를 조립한 후 전달한다.

TCP 헤더
TCP 헤더는 다음과 같은 순서와 크기로 작성되어 있다. 색이 진한 부분은 수신측이 작성하는 부분이다.

헤더에 적힌 시퀀스 번호를 보고 조립해간다 → 조립한 데이터를 지정된 애플리케이션 프로토콜에게 전달하면 TCP의 일은 끝난다.


8. UDP 프로토콜

UDP에서는 사전 의논을 하지 않고 일방적으로 데이터를 보낸다. 이런 통신을 비커넥션 통신이라고 한다.
UDP에서는 여러 상대에게 동시에 데이터를 보낼 수 있다. 복수의 특정인에게 보내는 것을 멀티캐스트(multicast), 불특정 다수에게 보내는 것을 브로드캐스트(broadcast)라고 한다.
이것은 TCP로는 불가능하다.
UDP로 할 수 있는 일은 2가지 이다. 그밖의 장치가 필요한 경우는 애플리케이션층의 프로토콜에서 처리한다.

  1. 데이터가 깨지지 않았는지 확인하고, 깨졌다면 파기한다.
  2. UDP 헤더를 제거하고 지정된 애플리케이션 프로토콜에게 전달한다.

송신측 포트 번호(16비트) : 송신측 포트 번호를 기록한다. 지정하지 않은 경우는 모두 0으로 만든다.
수신측 포트 번호(16비트) : 수식측 포트 번호를 기록한다.
데이터 양(16비트) : 헤더와 데이터의 합계가 몇 바이트인지를 기록한다.
체크성(16비트) : 데이터가 무사한지 아닌지를 확인하기 위한 값을 기록한다.

UDP는 데이터의 확실성보다도 실시간성이 중요시되는 통신이나 데이터가 작은 네트워크 관리의 통신 등에서 사용된다.


9. netstat 명령

netstat는 통신에 관한 정보를 표시하는 명령이다. 명령 프롬프트와 같은 CUI 환경에서 netstat라고 입력하고 ENTER 키를 누르면, 현재 설정된 통신 정보가 표시된다. 여기서 Windows의 명령 프롬프트를 예로 보면

명령 프롬프트에서 netstat를 작성하면 프로토콜과 로컬 주소, 외부 주소, 상태를 볼 수 있다.

프로토콜 : 사용되고 있는 프로토콜이다.
로컬 주소 : 자신의 컴퓨터의 호스트명과 포트번호이다. :(클론) 다음에는 포트 번호를 표시한다. 호스트명은 컴퓨터에서 처리될 때의 번호(IP 주소)로 표시될 때도 있다. 잘 알려진 포트 번호는 그 서비스 키워드로 나타낸다. 또 통신이 연결되어 있지 않을 때는 *로 표시된다.
외부 주소 : 접속한 컴퓨터의 호스트명(또는 IP주소)과 포트 번호를 표시한다. 표시 방법은 로컬 주소와 같다. 즉, 상대의 도메인과 포트 번호이다.
상태 : 통신 상태이다. ESTABLISHED는 통신이 연결되어 있다는 것을 나타낸다.

netstat만 사용하면 원래 통신 연결을 수행하지 않는 UDP 정보는 보이지 않는다. 모든 정보를 보려면 netstat -a 라고 입력하면 된다. (Linux, UNIX도 동일하다.) 이렇게 명령 다음에 쓰는 문자를 옵션이라 한다.


문제 풀이

  1. 트랜스포트층의 역할에 대해 간단히 설명하세요
    데이터를 상대에게 전달하여 통신을 실현한다.
    트랜스포트층은 애플리케이션층과 네트워크층의 중개 역할을 하는 것으로, 받은 데이터를 수신측의 애플리케이션층의 특정 프로토콜에게 전달한다. 이때 목적한 프로토콜을 지정하기 위해서 포트(port)라는 장치를 사용한다.

2.트랜스포트층의 프로토콜 두 가지는 무엇이며, 각각의 차이점에 대해 설명하세요
TCP,UDP
TCP는 데이터의 신뢰성을, UDP는 속도를 중시한다.
TCP는 데이터를 안전하고 확실하게 전달하는 것을 중시하며, UDP는 데이터를 빨리 전달하기만 할뿐 안전성에 대한 확인은 하지 않는다. TCP는 전자메일이나 WWW 서비스에 사용되며, UDP는 실시간이 요구되는 IP 전화나 스트리밍 송출 등에 사용된다.

3, 데이터를 수신측의 어떤 애플리케이션층 프로토콜에 전달할지 결정하는 것은 무엇인가
포트 번호
데이터를 수신측의 어떤 애플리케이션 프로토콜에 전달할지는 트랜스포트층에서 결정한다. 이때는 전달된 TCP 헤더에 적힌 포트 번호를 보고 판단한다. 포트 번호는 0-65536번까지 있으며, 그 중 0-1023번까지는 통신 서비스마다 미리 예약된 것으로 사용자가 임의로 설정할 수 없다.

  1. 트랜스포트층에서 취급하는 데이터 단위를 무엇이라고 부릅니까?
    세그먼트(segment)
  • 세그먼트는 애플리케이션층에서 전달된 데이터에 TCP 헤더를 붙인 것을 말한다.
  • 데이터그램은 네트워크층에서 사용되는 데이터 단위로 트랜스포트층에서 전달된 데이터에 IP 헤더를 붙인 것이다.
  • 프레임은 데이터 링크층에서 데이터에 헤더를 붙인 것을 말한다.
  • 패킷은 통신에서 사용되기 위해 작게 나눠진 데이터 하나하나를 말한다.
  1. TCP에서 테이터를 확실히 전달하기 위해 어떤 방법을 사용합니까?
    컨트롤 플래그와 시퀀스 번호 사용
    TCP는 데이터를 확실히 전달하는 것을 목적으로 하는 프로토콜이다. 따라서 통신 상대에게 통신 상태를 알려주는 컨트롤 플래그와 데이터의 순서를 나타내는 시퀀스 번호를 TCP헤더에 기록하여 확실한 데이터 주고받기를 수행한다. 컨트롤 플래그는 6비트로 된 값이며, 시퀀스 번호는 나중에 데이터를 순서대로 맞추기 위해 사용한다.
  1. 서로 통신하는 양쪽의 세그먼트 사이즈와 윈도 사이즈가 다음과 같다면 실제 통신은 어떤 크기로 이루어 집니까

    송신측
    세그먼트 사이즈: 150Byte
    윈도 사이즈: 32KB

    수신측
    세그먼트 사이즈: 128Byte
    윈도 사이즈: 64KB

세그먼트 사이즈 128Byte, 윈도우 사이즈는 32KB로 통신한다.
TCP에서는 실제로 통신을 시작하기 전에 양쪽 모두 다룰 수 있는 데이터의 양을 확인한다. 이 크기를 세그먼트 사이즈라고 하면, 한 번에 받을 수 있는 양을 윈도우 사이즈라고 한다. 둘 중 수치가 작은 쪽에 맞춰 통신한다.

profile
개미는 뚠뚠..오늘도 뚠뚠🐜

0개의 댓글