Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung

TCP/IP

인터넷 프로그램들이 서로 통신을 하는데 있어서 여러 프로토콜이 있습니다. 인터넷 프로토콜에서 가장 많이 사용하는 대표적인 프로토콜은 여러분들도 많이 아시다시피 IP입니다. 여기서 중요한 것은 TCP/IP는 계층이 아니라 프로토콜이라는 사실이라는 사실을 주의해주세요.

TCP/IP는 OSI7 계층과는 조금은 다른 TCP/IP의 구조적인 계층 위에서 동작합니다.

지난 번에 OSI7 계층에 대해서 알아보았는데요. TCP/IP 계층은 OSI7계층과 비교하여 어떤 점이 다른지 살펴보는 시간을 가져보도록 하지요.

Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung

OSI7 계층과는 조금은 다른 모습을 볼 수 있습니다. 보세요.

우선 계층의 수 부터가 다릅니다. OSI는 7계층인데 반해 TCP/IP 계층은 4계층이 전부라는 것을 알 수 있습니다.

이제 조금 더 세세하게 살펴보도록 하지요.

1. 네트워크 인터페이스 계층 (Network Interface Layer)

이 계층은 Node-To-Node간의 신뢰성 있는 데이터 전송을 담당하는 계층입니다. OSI7 계층의 물리 계층과 데이터링크 계층의 역할을 바로 이 계층이 담당하는 것으로 볼 수 있네요.

따라서 MAC주소가 이 계층에서 사용됩니다. MAC주소는 OSI7 계층에서 데이터링크 계층의 주소였죠?? 

네트워크 인터페이스 계층이 바로 데이터링크 계층까지 담당하니까 MAC 어드레스가 사용되는 겁니다.

혹시 랜카드라고 들어보셨나요? 바로 이거말이에요.

정확한 명칭은 NIC라고 하여 Network Interface Card입니다. 바로 이 랜카드가 있어야만 네트워크 통신을 할 수 있는데, 이름에서도 알 수 있듯이 네트워크 인터페이스 계층에서 동작하는 장비입니다.

주요 프로토콜을 무엇이 있을까요?

LAN상에서는 Ethernet, TokenRing, FDDI 등이 있으며 WAN 상에서는 X.25, Frame Relay, PPP 등이 있습니다.

2. 인터넷 계층 (Internet Layer)

OSI7계층의 네트워크 계층을 담당하는 계층입니다. OSI7 계층처럼 호스트간의 라우팅을 담당하지요. 

인터넷 계층에서 동작하는 프로토콜에는 무엇이 있을까요? 대표적인 몇가지 프로토콜을 살짝 알아보도록 합시다.

IP(Internet Protocol) : 비신뢰성, 비연결지향 데이터그램 프로토콜입니다. 

ARP(Address Resolution Protocol) : 주소변환 프로토콜입니다. IP주소를 MAC주소로 변환하는 프로토콜이지요.

RARP(Reverse ARP) : 반대로 MAC주소로 IP주소를 찾는 프로토콜입니다.

ICMP(Internet Control Message Protocol) : 상태 진단 메시지 프로토콜인데요. 이 프로토콜을 이용하는 대표적인 프로그램이 ping입니다.

IGMP(Internet Group Message Protocol) : 멀티캐스트용 프로토콜입니다.

3. 전송 계층 (Transport Layer)

OSI7 계층의 전송계층과 같습니다. 프로세스간의 신뢰성 있는 데이터 전송을 담당하는 계층입니다.

process-to-process 전송을 담당하기 위해서는 논리적 주소가 필요한데요. process가 사용하는 포트 번호를 그 논리적 주소로 사용합니다.

전송 계층에서 프로토콜은 무엇이 있을까요?

TCP (Transmission Control Protocol) : 신뢰성있는 연결지향형 프로토콜입니다. 신뢰성있다는 말은 그 페킷에 대한 오류처리나 재전송따위로 에러를 복구하는 것을 말합니다. 그때문에 TCP의 헤더에 붙는 정보가 많습니다.

UDP (User Datagram Protocol) : 비신뢰성 비연결형 프로토콜입니다. 페킷을 잃거나 오류가 있어도 대처하지 않는 것을 말합니다. 따라서 UDP헤더는 간단한 구조를 갖고 있습니다.

4. 응용 계층 (Application Layer)

사용자와 가장 가까운 계층입니다. OSI7계층의 5계층부터 7계층까지의 기능을 담당하고 있지요.

서버나 클라이언트 응용 프로그램이 이 계층에서 동작합니다. 우리가 알고 있는 브라우저나 텔넷같은 서비스가 이 계층에 동작하며, 동작하기 위해서는 전송계층의 주소, 즉 포트번호를 사용합니다.

이를테면 http는 포트번호 80번을 사용하지요.

역시 프로토콜은 무엇이 있나 살펴볼까요?

HTTP (Hyper-Text Transfer Protocol) : TCP기반의 프로토콜로 포트번호 80번을 사용합니다.

Telnet : TCP 포트번호 23번을 사용합니다. 원격 터미널을 접속할때 이 포로토콜을 사용합니다.

SSH (Secure Shell) : 텔넷과 같은 서비스는 보안에 취약합니다. 비밀번호가 암호화되지 않아 그대로 노출이 되기 때문이지요. 이것을 보완한것이 SSH입니다. 포트번호 22번을 사용합니다.

FTP(File Transfer Protocol) : 파일 전송 프로토콜입니다. 파일을 받거나 올릴때 FTP를 사용하지요. FTP는 파일을 올리거나 내려받을때 신뢰성을 중요시하기 때문에 TCP에서 동작하구요. 2개의 포트를 사용합니다. 

TCP 포트 20번은 데이터 전송을 위한 용도, TCP 포트 21번은 제어용으로 사용합니다.

SMTP (Simple Mail Transfer Protocol) : 메일 전송 프로토콜입니다. TCP 상에서 동작하며 포트는 25번을 사용합니다.

POP3 (Post Office Protocol Version3) : 메일 수신용 프로토콜입니다. 아웃룩같은 프로그램이 POP3라는 프로토콜을 사용하여 동작합니다. TCP 포트 110번을 사용합니다.

DNS (Domain Name System) : 도메인명에 대한 호스트 정보를 제공해줍니다. 기본적으로 UDP상에서 동작합니다. 기본적으로 실패하면 다시 한번 요청하면 되며 그렇게 중요한 정보가 아니기 때문이죠. 하지만 신뢰성을 요할 경우에는 TCP상에서도 동작합니다. 데이터의 길이가 길 경우같은 때 TCP 기반으로 동작할 수 있습니다.

UDP, TCP 포트 53번을 사용합니다.

이와 같이 포트번호가 특정 프로토콜이 사용해서 우리가 쓸 수 없는 포트들이 있습니다. 이런 포트들을 well-known port라고 합니다.

프로토콜 헤더 정보를 잘 읽고 분석할 수 있다면 네트워크를 더 잘 이해할 수 있을 겁니다.

따라서 다음 시간에는 헤더를 보고 무슨 정보가 있는지 살펴보는 기회를 갖도록 하겠습니다.

우노

패킷 통신이란?

  • 데이터를 패킷이라고하는 작은 단위로 나누어 전송하는 방식을 의미합니다.

IP (Internet Protocol) 란?

  • IP는, 패킷 데이터들을 최대한 빨리 특정 목적지 주소로 보내는 프로토콜입니다.
    • 빨리 보내는게 목적이기 때문에,
    • 패킷 전달 여부를 보증하지 않으며, 패킷을 보낸 순서와 받는 순서가 다를 수 있습니다.

TCP (Transmission Control Protocol) 란?

  • 패킷 통신은, 데이터를 작은 단위로 나누어 전송하기 때문에, 순서가 뒤섞이거나 내용이 유실될 수 있다는 단점이 있습니다.
  • 따라서, 이러한 문제를 해결하기 위해 TCP 라는 프로토콜이 존재합니다.
  • TCP는, 패킷을 정상적으로 받을 수 있도록 하는 프로토콜입니다.
    • 꼼꼼하게 보내는게 목적이기 때문에, IP 보다 패킷 전송 속도는 느리지만,
    • 패킷 전달 여부를 보증하고, 패킷을 송신 순서대로 받게 해줍니다.
    • 즉, 목적지에 도착한 패킷들을 순서대로 정렬하고, 손상되거나 손실된 패킷이 있다면, 출발지에 재요청하는 방식으로 진행됩니다.

TCP/IP 란?

  • TCP/IP는 IP(인터넷 프로토콜)와 TCP(전송 조절 프로토콜)의 묶음을 의미합니다.
  • 즉, 두 가지 프로토콜 방식을 조합하여 인터넷 통신하는 것을 TCP/IP 라고 부르는 것입니다.
    • 송신자가 수신자에게 IP 를 사용하여 최대한 빠르게 패킷을 전송하면
    • TCP 를 활용해 패킷을 정상적으로 수신 받습니다.
  • 이렇게 복수의 프로토콜 집합을 프로토콜 스택(Protocol Stack), 혹은 프로토콜 스위트(Protocol Suite)라고 부르며, 서로 다른 프로토콜 스택끼리는 통신 할 수 없습니다.

OSI 7계층과 TCP/IP 4계층 간단 비교

Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
  • OSI 7계층은, 컴퓨터와 간 패킷 통신을 위해 거쳐야하는 7개의 계층을 의미합니다.
  • TCP/IP 4계층은, TCP/IP 프로토콜 통신 과정에 초점을 맞추어, OSI 7계층을 좀 더 단순화 시킨 계층을 의미합니다.
  • 이러한 계층적인 구조는 아래와 같은 특징을 가지고 있습니다.
    • 각 계층별 처리 역할이 다르기 때문에, 계층별 간섭을 최소화할 수 있습니다.
    • 특정 계층에서 문제가 생기면, 해당 계층을 살펴보면 되기 때문에, 유지 보수가 편리합니다.
    • 다른 계층끼리는 데이터의 전달 과정을 구체적으로 알 필요가 없기 때문에, 데이터의 캡슐화와 은닉이 가능합니다.

TCP/IP 4계층의 캡슐화, 역캡슐화

Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
  • TCP/IP 4계층은, 위 그림과 같이 애플리케이션 계층, 전송 계층, 인터넷 계층, 네트워크 접근 계층으로 이루어져있습니다.

  • 데이터 전송 시, 데이터는 상위 계층에서 하위 계층으로 이동하고, 계층 이동 마다 필요한 정보(헤더)가 추가됩니다.

    • 이를, 캡슐화라고 합니다.
  • 데이터 수신 시, 데이터는 하위 계층에서 상위 계층으로 이동하고, 계층 이동 마다 추가된 헤더를 읽고 알맞은 행동을 취한 후, 헤더를 제거합니다.

    • 이를, 역캡슐화라고 합니다.
  • 계층 별로 추가되는 헤더는 아래와 같습니다.

    Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung

4계층 : 애플리케이션 계층(Application Layer)

  • 사용자와 가장 가까운 계층으로, 사용자-소프트웨어 간 소통을 담당하는 계층입니다.
  • 애플리케이션을 실행하기 위한 데이터 형식이 작성됩니다.
  • 프로토콜로는 HTTP, HTTPS, FTP, SSH, Telnet, DNS, SMTP 가 있습니다.

3계층 : 전송 계층(Transport Layer)

  • 통신 노드 간 신뢰성 있는 데이터 전송을 보장하는 계층입니다.
  • 역캡슐화 과정에서, 포트 번호를 사용해 데이터를 정확한 애플리케이션에 전달하는 역할도 합니다.
    • 네트워크 액세스 계층과 인터넷 계층을 통해, 데이터가 목적지 기기까지 정상적으로 도착했다면,
    • 전송 계층은 포트 번호를 사용해, 데이터를 목적지 기기 내 적절한 에플리케이션으로 전달합니다.
  • 프로토콜로는 TCP, UDP, RTP, RTCP 가 있습니다.

2계층 : 인터넷 계층(Internet Layer)

  • 패킷을 최종 목적지까지 라우팅하는 계층입니다.
  • 프로토콜로는 IP, ARP, ICMP, RARP, OSPF 가 사용됩니다.

1계층 : 네트워크 액세스 계층(Network Access Layer or Network Interface Layer)

  • 데이터를 전기신호로 변환한 뒤, 물리적 주소인 MAC 주소를 사용해, 알맞은 기기로 데이터를 전달하는 계층입니다.
  • 프로토콜로는 Ethernet, Wi-Fi, PPP, Token Ring 과 같은 프로토콜이 사용됩니다.

정리

Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung

예제를 통한 TCP/IP 흐름 이해

  • 만약, www.google.com 을 웹 브라우저에 입력하면 무슨 일이 일어날까요?

    • 구글 웹서버에 80번 포트로 HTTP Request 를 보낸다는 의미와 동일합니다.
  • 우선, 구글 웹 서버에 HTTP Request 를 보내기 위해선, 아래와 같이 각 계층에 필요한 정보들을 담은 패킷을 만들어야합니다.

    Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • 해당 예제에선, 각 계층 별로 HTTP, TCP, IP, Ethernet 프로토콜을 사용한다고 가정해보겠습니다.
  • 따라서, Application, Transport, Internet, Network Access Layer 순으로 어떤 데이터가 들어가는지 순서대로 살펴보겠습니다.

  • 먼저, 패킷의 Application Layer 에는 HTTP Request 헤더가 들어갑니다.

    Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
      :authority: www.google.com
      :method: GET
      :path: /
      :scheme: https
      ...
      ...
  • 이후,Transport Layer 에는 TCP 헤더가 들어갑니다.

    Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • TCP 헤더에서 중요하게 볼 것은 SP(출발지 포트번호)와 DP(목적지 포트번호)입니다.
    • 출발지 포트번호는 내 컴퓨터에서 만든 소켓의 포트 번호이므로, 내 컴퓨터는 알고 있으며, 목적지 포트 번호 또한 80으로 알고 있습니다.
  • 이후, Internet Layer 에는 IP 헤더가 들어갑니다.

    Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • IP 헤더에서 중요하게 볼 것은 SA(출발지 IP주소) 와 DA(목적지 IP주소)입니다.
    • 현재, www.google.com 이라는 도메인 정보만 알고 있기 때문에
    • 나의 시작 IP 주소는 알고 있지만, 목적지의 IP 주소는 아직 모릅니다.
    • 따라서, 도메인 정보로 목적지의 IP 주소를 알아내기 위해,
    • 도메인 서버에 DNS 쿼리를 보내고, IP 주소를 응답받습니다.
  • 이후, Network Access Layer 에는 Ethernet 헤더가 들어갑니다.

    Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • Ethernet 헤더에서 중요하게 볼 것은 SA(출발지 MAC 주소)와 DA(목적지 MAC 주소)입니다.
    • 여기서 목적지 MAC 주소는, 구글의 MAC 주소가 아닌,
    • 물리적으로 연결된, 패킷이 전달될 라우터(예를 들어, 공유기) 또는 게이트웨이의 MAC 주소를 의미합니다.
    • 따라서, 라우터의 MAC 주소를 알아내기 위해, ARP 프로토콜을 사용합니다.
      • ARP 프로토콜에 대한 개념은 아래 링크를 통해 배우실 수 있습니다.
      • https://wooono.tistory.com/110
    • 이제, ARP 프로토콜을 통해 라우터의 MAC 주소까지 알아냈습니다.
  • 이후 패킷을 전송하기 전, TCP는 연결지향형 프로토콜이기 때문에, 송신측과 수신측이 서로 연결되는 작업이 필요합니다.

    Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • 이러한 작업을 3 Way Handshaking 이라고 부릅니다.

    • 3 Way Handshaking 을 수행하기 위해서는, TCP 헤더에 표시한 플래그들이 사용되며, 이러한 플래그들을 컨트롤 비트라고 부릅니다.

    • 3 Way Handshaking 은 SYN(동기화) 과 ACK(승인) 로 진행됩니다.

      Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • 먼저, 클라이언트는 서버에게, 접속을 요청하는 SYN 패킷을 보냅니다.

    • 서버는 SYN 패킷을 받고, 클라이언트에게 요청을 수락한다는 ACK 와 SYN 플래그가 설정된 패킷을 보냅니다.

    • 클라이언트는 다시 서버에게 ACK 패킷을 보냅니다.

    • 이제 3 Way Handshaking 으로 기기 간 연결이 성립되었으니, 데이터 통신이 가능해집니다.

  • 이제 라우팅을 통해 패킷을 목적지 서버에게 전송합니다.

    Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • 패킷은 Network Access Layer의 MAC 주소와 Internet Layer의 IP 주소로 라우팅을 반복해 목적지 구글 서버까지 도착합니다.

    • 따라서, Transport Layer부터 설명을 진행하겠습니다.

    • 먼저, 구글 서버가 받은 패킷 내부 Transport Layer의 목적지 포트 번호에는 80번이 적혀져있습니다.

    • 따라서, Transport Layer는 80번 포트를 사용하고 있는 Application Layer에 데이터를 전송합니다.

    • 이후, Application Layer는 HTTP Request 데이터를 받아, “/” 에 매핑된 GET 요청을 처리합니다.

    • 이후, 적절한 HTML을 클라이언트에게 응답합니다.

    • 따라서, 클라이언트는 라우팅을 통해 전달 받은, “www.google.com” 에 해당하는 HTML 을 브라우저에 띄우게 됩니다.

      Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
  • 이제 HTTP 요청 및 응답 과정이 끝났으므로, 연결을 종료해야합니다.

    Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • 여기서도 TCP의 컨트롤 비트가 사용되며, 해당 단계에서는 ACK, FIN 플래그가 사용됩니다.

      Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • 클라이언트와 서버의 연결 종료 작업을 4 Way Handshaking 이라고 부르며, 총 4단계로 진행됩니다.

    • 먼저, 클라이언트는 서버에게, 연결을 종료하겠다는 의미인 FIN 패킷을 전송합니다.

    • 서버는 클라이언트에게 ACK 패킷을 보내고, 클라이언트가 보냈던 요청들에 대해 마저 응답을 보냅니다.

    • 이후, 서버의 응답이 끝나면 클라이언트에게 FIN 패킷을 전송합니다.

    • 클라이언트는 서버의 통신 종료를 확인한 뒤, 서버에게 ACK 패킷을 전송하고, 연결이 종료됩니다.

    • 하지만, 서버가 클라이언트에게 FIN 을 보내는 과정에서 한가지 문제가 발생할 수 있습니다.

      Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • 서버가 클라이언트에게 FIN 을 보내기 전에, 이전에 서버가 클라이언트에게 응답 했던 패킷이 FIN 보다 늦게 도착할 수도 있습니다.

    • 그렇게 되면, 클라이언트가 서버의 일부 응답을 받지 못하게 됩니다.

      Tcp/ip 프로토콜 계층 - tcp/ip peulotokol gyecheung
    • 따라서, 클라이언트는 서버로부터 FIN 패킷을 받고, ACK 패킷을 보낸 뒤에도

    • 일정 시간동안 혹시나 아직 도착하지 않은 잉여 패킷을 기다립니다.

    • 이렇게, 4 Way handshaking 이후에도 소켓을 닫지 않고 잉여패킷을 기다리는 상태를, TIME_WAIT 이라고 합니다.

흐름 요약

  • www.google.com 을 브라우저 주소창에 입력합니다.
  • 보낼 패킷의 HTTP 헤더는, HTTP Request 를 통해 채워진 상태입니다.
  • 보낼 패킷의 IP 헤더를 채우기 위해, DNS 서버를 통해 www.google.com 도메인의 IP 주소를 응답 받습니다.
  • 보낼 패킷의 TCP 헤더를 채우기 위해, 클라이언트와 구글 웹서버 간 TCP 연결을 합니다.
    • 3-Way Handshaking
  • 보낼 패킷이 완성되었으므로, www.google.com 에 패킷을 전송하고, HTML 을 응답받습니다.
  • 클라이언트는 응답 받은 HTML 을 브라우저에 띄웁니다.
  • 클라이언트와 구글 웹서버간 TCP 연결을 종료합니다.
    • 4-Way Handshaking

참고

  • https://brunch.co.kr/@wangho/6#comment
  • https://nordvpn.com/ko/blog/tcp-ip-protocol/
  • https://velog.io/@rosewwross/TCPIP
  • https://coding-factory.tistory.com/613
  • https://data-study-clip.tistory.com/110
  • https://hahahoho5915.tistory.com/15
  • https://hwannny.tistory.com/117
  • https://m.blog.naver.com/soojin_2604/221950485931
  • https://www.youtube.com/watch?v=BEK354TRgZ8
  • https://www.wisewiredbooks.com/csbooks/ch3-network-internet/tcp-ip-intro.html
  • https://junu0516.github.io/posts/tcp_ip_4계층/
  • https://devlopsquare.tistory.com/233