[TCP/IP 소켓 프로그래밍] 프로토콜 개요
본 포스팅은 학습 목적으로 쓴 포스팅이므로, 정확하지 않을 가능성이 높습니다. 사실과 맞지 않는 부분이 있다면 지적해주세요.
프로토콜이란 무엇일까
Protocol 의 뜻은 ' 규약 ' 이라는 뜻이다. 그러면 통신 프로토콜이란? 통신에 관련한 규약 정도로 받아들일 수 있겠다. 그렇다면 통신을 하는것에 있어서 어떠한 특별한 규약이 필요하다는 뜻일테고, 그러한 규약이 왜 필요한걸까? 그 이유를 알아보기 전에 호스트와 라우터에 대해 먼저 알아보자.
인터넷을 통해 통신을 수행하는 개체는 크게 호스트와 라우터로 나뉜다. 호스트는 사용자의 응용 프로그램을 수행하는 주체이고, PC , 노트북, 스마트폰등이 여기에 속한다. 라우터는 간단하게 말해 호스트와 호스트 간의 데이터 전달, 즉 서로 다른 네트워크에 존재하는 호스트 간의 데이터를 교환할 수 있게 만들어주는 장비이다.
여기에서 호스트와 라우터, 라우터와 라우터, 호스트와 호스트가 통신을 하기 위해서는 정해진 절차와 방법을 따라야하는데, 여기에서 사용되는것이 바로 통신 프로토콜이다. ( 물론 통신 프로토콜의 존재 이유가 이뿐만은 아닐것 같지만.. 이유 중 하나라고 받아들여보자. )
TCP / IP
이러한 통신 프로토콜의 종류 중 가장 중요한 프로토콜 2가지가 흔히 들을 수 있는 TCP 와 IP 이다. 이 두개의 프로토콜은 함께 사용되는 경우가 많아 TCP/IP 프로토콜이라고 불린다. 각 프로토콜의 특징은 다음과 같다.
- TCP ( Transmission Control Protocol ) 은 말 그대로 전송제어 프로토콜이다. TCP 는 데이터의 패킷 전송 순서, 손실 및 오류를 검출 및 복구할 수 있다. 즉, 데이터의 신뢰도가 높은 프로토콜이라고 볼 수 있다.
- IP ( Internet Protocol ) 은 데이터 패킷을 출발지에서 목적지로 안전하게 전송하기 위해 네트워크 경로를 선택해주며, 데이터의 전송을 관리한다. IP 주소를 활용해 컴퓨터나 장치를 식별하고 데이터를 목적지까지 전달한다.
프로토콜을 사용한다는 것은 어떤 의미일까. 규약을 사용한다는 의미일것이고, 규약을 사용한다는것은 내가 만들고자 하는 통신에 이 규약을 적용시키는것이 아닐까 싶다. 그런 의미에서 볼 때, TCP 를 사용한다는 의미는 통신을 할 때, 이미 정해진 특별한 규약인 TCP 프로토콜을 적용시켜 통신을 한다는 의미이고, TCP 규약을 사용했을 때 위와 같은 특장점을 활용할 수 있다는 의미가 아닐까 싶다.
TCP / IP 프로토콜의 계층별 기능
통신 프로토콜은 기능별로 나누어 계층적으로 구현하는것이 일반적이다. 계층적으로 구분을 해두어야 관리적인 측면이나 유지보수 측면, 그외 여러가지 이점이 생기기 때문이다. TCP / IP 프로토콜 또한 이 구조를 따르는데, TCP / IP 프로토콜의 구조를 요약하자면, 응용계층, 전송 계층, 인터넷 계층, 네트워크 접근 계층 으로 나뉜다.
네트워크 접근 계층
물리적 네트워크를 통한 실제 데이터 송수신을 담당한다. 구성 요소로는 물리적 신호를 처리해 데이터 송수신을 담당하는 네트워크 하드웨어와 운영체제가 제공하는 장치 드라이버가 있다. 이 계층에서는 하드웨어적으로 정의된 물리적 주소를 사용하여 통신한다.
인터넷 계층
네트워크 접근 계층의 도움을 받아 데이터를 목적지 호스트까지 전달하는 역할을 한다. 네트워크 접근계층과 마찬가지로, 주소를 지정하는 방법이 필요한데, 물리적 주소 대신 논리적 주소인 IP 주소를 사용한다. 서로 다른 기술에 기반한 물리적 네트워크를 연결하기 위해서는 물리적 주소로는 불가능하다. 이때 필요한게 IP 주소 이며, 통신에 참가하는 개체 각각에 유일성을 지정할 수 있게 된다.
실제 통신을 하기 위해서는 데이터를 전송하는 전송 경로를 정해야 하며 데이터를 전달하는 작업인 라우팅 작업이 필요하다. 라우팅 작업에는 필요한 정보를 수집하는 작업과 실제 데이터를 전달하는 작업을 포함하는데, 이러한 작업을 라우터를 통해 서로 다른 네트워크에 연결된 호스트가 통신할 수 있게된다.
전송 계층
전송 계층에서는 최종 통신 목적지를 지정하고 오류 없이 데이터를 전송하는 역할을 하게된다. 인터넷 계층의 역할이 IP 주소와 라우팅 작업을 이용해서 목적지 호스트에 데이터가 도달할 수 있게 하는 것이었다면, 전송 계층에서는 호스트에 전달된 데이터를 호스트에서 실행되는 프로세스에 전달하는 역할을 한다.
그렇다면, 데이터가 호스트로 전달이 되었고, 호스트에서 실행하는 프로세스에 데이터를 전달한다면, 어떤 데이터가 어떤 프로세스로 가야할지 정해주는 작업도 필요하겠다. 이때 필요한것이 포트 번호 이다. 각 프로세스는 16비트 주소를 사용해서 포트번호를 지정할 수 있다.
인터넷 계층이 제공하는 전송 서비스는 Best Effort , 즉 최선을 다하지만, 신뢰성은 보장하지 않는다. 즉, 데이터에 문제가 생기면 목적지에 도달하지 못하는 상황이 발생할 수도 있고, 도달해도 실제 데이터가 손상되었을 가능성 또한 포함한다. 이때 전송 계층에서는 이러한 손실이나 손상을 검출해서 잘못된 데이터가 목적지에 전달되지 않도록 한다.
전송 계층에 해당하는 프로토콜로는 TCP 와 UDP 가 있다. 간단하게 말해, TCP 는 속도는 상대적으로 느리지만 신뢰성이 보장된 프로토콜이며, UDP 는 속도는 상대적으로 빠르지만 신뢰성이 보장되지 못한다.
응용 계층
전송 계층을 기반으로 하는 다수의 프로토콜 ( Telnet , FTP, HTTP, SMTP ) 과 이 프로토콜을 사용하는 응용 프로그램을 포괄한다.