본문 바로가기
💻 programming

[TCP/IP] 1. 네트워크, 패킷 그리고 프로토콜

by 연구원-A 2020. 12. 18.
반응형

네트워크, 패킷 그리고 프로토콜

컴퓨터 네트워크수많은 호스트 (host)와 라우터 (router) 장비들로 구성되어 있습니다. 호스트는 웹 브라우저나 파일 공유 프로그램들을 구동하는 컴퓨터를 의미합니다.

호스트에서 동작하는 응용 프로그램이야 말로 네트워크의 '실 사용자'라고 할 수 있습니다. 라우터 (=게이트웨이)는 하나의 통신 채널 (communication channel)로부터 온 정보들을 다른 통신 채널로 전달하는 장비입니다.

프로토콜은 통신 프로그램 사이에서 교환되는 패킷에 대한 약속이자 정의입니다. 그 중에서 TCP/IP는 이러한 문제를 해결하기 위한 프로토콜의 모음 (protocol suite)중 하나입니다. TCP/IP 프로토콜 집합체의 중요 프로토콜에는 IP, TCP, UDP가 있습니다.

이러한 TCP/IP의 구현은 보통 호스트 상의 OS 내부에 존재하게 됩니다. 응용 프로그램은 소켓 API를 통해 TCP 또는 UDP 서비스에 접근하게 됩니다. 아래 그림은 응용프로그램에서 생성된 데이터가 TCP/IP 내부 구현을 통해 네트워크를 지나 상대방 호스트의 TCP/IP 구현을 거슬러 올라가는 것을 보여주고 있습니다.

  • IP: 호스트에서 다른 호스트로 데이터를 전달하는 프로토콜
  • TCP/UDP: 프로그램에서 다른 프로그램으로 데이터를 전달하는 프로토콜 (= 종단 간 전송 프로토콜: end-to-end transport)

TCP는 IP가 제공하는 호스트-호스트 전달 과정에서 일어날 수 있는 손실, 복제, 기타 오류 등의 검출과 복구 기능을 수행하도록 설계되었습니다. TCP는 신뢰성 있는 바이트-스트림 (reliable byte-stream) 채널을 제공하므로 응용 프로그램은 이러한 문제에 신경을 쓸 필요가 없습니다. TCP는 연결 지향적 (connection-oriented)인 프로토콜이며, 통신 전에 두 개의 프로그램은 반드시 TCP 연결을 설정해야만 합니다. 보통 이러한 연결은 TCP 계층 사이에서 핸드셰이크 메시지 (handshake message)를 교환하면서 이루어지게 됩니다. 한편 UDP는 IP가 가지는 오류를 복구하려고 하지 않습니다.

UDP는 단순히 IP의 최선 전달 서비스를 확장하여 호스트 간의 전달이 아닌 두 개의 응용프로그램 간의 전달이 가능하도록 합니다. 따라서 UDP를 이용하는 응용 프로그램은 데이터의 손실, 순서 바뀜 등의 오류에 대비해야 합니다.


주소

어떤 프로그램이 다른 프로그램과 통신하기 위해서는 대상 프로그램을 구분하기 위한 정보를 네트워크에 알려야 합니다. TCP/IP에는 특정 프로그램을 구분하기 위해서 두 개의 서로 다른 주소 정보를 필요로 하는데, 바로 IP 계층에 존재하는 인터넷 주소 (Internet address)와 TCP 또는 UDP 상에 존재하는 포트 주소 (port address)입니다.

호스트를 구분하기 위한 정보가 인터넷 주소 (IP address)이고 응용 프로그램을 구분하기 위한 정보가 포트 주소 (port address)이다

IP 주소의 표기법

IPv4 표기법: 점으로 구분된 10진수의 값 (e.g 192.168.0.1)

IPv6 표기법: 콜론 (:)으로 구분된 16진수의 값

기술적으로 각 IP주소는 하나의 호스트와 해당 호스트 하부에 존재하는 통신 채널, 즉 네트워크 인터페이스 (network interface) 사이에 존재하는 네트워크 연결을 의미합니다. 하나의 호스트는 다수의 인터페이스를 가질 수 있고, 하나의 인터페이스도 IPv4와 IPv6 주소 등 여러 개의 주소를 동시에 가질 수도 있습니다.

IPv4, IPv6 주소 버전의 처리

이러한 두 가지 서로 다른 IP버전은 소켓 프로그래머에게 여간 성가신 일이 아닙니다. 일반적으로 통신을 위한 소켓을 생성할 때 하부 프로토콜로 IPv4 또는 IPv6 중 하나를 선택해야 합니다. 그렇다면 두 가지 IP 버전에서 모두 잘 동작하는 응용프로그램을 어떻게 만들 수 있을까요? 물론 IPv4와 IPv6 주소는 상이하게 다르지만, IPv4 주소의 경우 IPv4 매핑 주소 (IPv4 mapped address) 형식을 이용하여 IPv6에 적용이 가능합니다. 그러나 이렇게 IPv6 주소를 가진다고 해서 인터넷에 있는 다른 IPv6 기반의 호스트와 통신이 가능한 것은 아닙니다. 이것이 가능하려면 ISP (Internet Service Provider)가 IPv6 전송 서비스를 지원해야만 합니다.

포트 번호

포트번호는 부호가 없는 16비트 이진수로 이루어져있습니다. (1 ~ 65,535)

특별한 주소들

루프백 주소

인터넷 프로토콜 버전과 관계없이 특별한 용도로 사용되기 위한 주소들이 정해져있습니다. 주목할 만한 것들 중 하나가 바로 루프백 주소 (loopback address)입니다. 이 주소는 항상 **루프백 인터페이스 (loopback interface)**라고 하는 가상의 디바이스에 할당되어 있으며, 이 가상의 디바이스에 전송한 패킷을 즉시 전송자에게 돌려보내는 기능을 가지고 있습니다. 다시 목적지로 돌아오기 때문에 테스트 시에 매우 유용합니다.

  • IPv4: 127.0.0.1
  • IPv6: ::1 (= 0:0:0:0:0:0:0:1)

멀티캐스트 주소

보통의 IP 주소 (유니캐스트; unicast)가 하나의 목적지를 가리키는 반면, 멀티캐스트 주소는 잠재적으로 임의의 목적지들을 가리킵니다. IPv4의 경우 멀티캐스트 주소는 224~239로 시작하며, IPv6는 FF로 시작합니다.


도메인 (네임 주소)

대게 host.example.com과 같이 호스트를 도베인 네임으로 부르는 것에 익숙해져 있지만, 중요한 것은 우리가 주소 대신 사용하는 네임 서비스는 TCP/IP 가 제공하는 서비스와는 개별적인 것입니다.


클라이언트와 서버

서버는 어떤 포트를 사용할까요? 원칙적으로 서버는 임의의 포트 번호를 사용할 수 있습니다. 그렇지만 클라이언트는 서버 포트가 무엇인지 알 수 있어야 합니다. 인터넷에서는 잘 알려진 포트를 특정 응용프로그램에 할당하는 협정이 존재합니다. (e.g. HTTP(80), FTP(21), SSH(22))

우리가 서버 응용프로그램을 개발한다면 잘 알려진 포트를 피해서 할당해야 합니다.


소켓이란

소켓이란 응용 프로그램이 데이터를 송수신할 수 있는 추상화된 통로

  • 소켓을 이용하면 응용 프로그램이 네트워크에 플러그인 하도록 한다
  • 동일한 네트워크에 플러그인된 다른 응용 프로그램과 통신하도록 한다

TCP/IP 소켓의 두 가지 타입은 스트림 소켓 (stream socket)과 데이터그램 소켓 (datagram socket)이 있습니다. 스트림 소켓은 TCP 프로토콜을 사용하며, 데이터그램 소켓은 UDP 프로토콜을 사용합니다. UDP의 경우 개별 메시지의 최대 크기가 65,500 바이트로 제한되며 비 신뢰적은 최선 전달 서비스를 제공하는 특징을 가집니다.

  • 응용 프로그램은 소켓 식별자를 이용해서 소켓에 접근한다
  • 소켓은 TCP 또는 UDP 포트에 연결 (bind)된다
반응형

댓글