본문 바로가기

소켓 프로그래밍/서버와 클라이언트

* TCP / IP 4계층

TCP는 Transmission Control Protocol의 약자로 "전송 과정을 컨트롤한다."라는 의미가 있다. 전송 과정을 컨트롤한다라는 것이 무엇인지 알아보자.

TCP를 이해하기 위해서는 "TCP / IP 프로토콜 스택"이라는 것이 있는데 아래의 그림을 보자.

TCP / IP 프로토콜 스택

크게 4가지의 영역이 나누어져 있다. 미처 신경 쓰지 못했지만 데이터의 송수신은 소프트웨어만으로 해결이 될 수 있는 문제가 아니다. 어느 정도 하드웨어의 시스템이 구축이 되어있어야 하고 많은 필요한 문제들이 존재한다. 따라서 이러한 문제들을 하나의 프로토콜의 설계로 해결하는 것이 아닌 작은 문제로 해결이 되어야 한다. 그래야 효율적으로 문제들을 해결할 수 있기 때문이다. 그렇기 때문에 프로토콜 스택은 위와 같은 4가지의 영역 별로 세분화되어있다. 이제부터 하나씩 세분화된 각 영역들을 살펴보자.

Link 계층
물리적인 영역을 표준화하고 있는 계층이다. 가장 기본이 되는 영역으로 LAN, WAN, MAN과 같은 네트워크 표준과 관련된 프로토콜을 정의하는 영역이다. 두 호스트가 인터넷을 통해 데이터를 주고받으려면 기본적으로 물리적인 영역이 존재해야 하며 연결되어있어야 한다.

IP 계층
Link 계층에서 물리적으로 연결했으니 데이터를 보낼 수 있는 상태이다. 거미줄처럼 복잡하게 얽혀서 연결되어 있는 인터넷을 통해 데이터를 보내기 전에 선행될 것은 경로를 선택하는 것이다. 목적지에 데이터를 보내기 위해서는 어떠한 경로를 거쳐갈 것인가? 이 문제를 해결하는 것이 IP 계층이며, 이 계층에서 사용하는 되는 프로토콜이 IP(Internet Protocol)이라 한다. IP 자체로는 비연결 지향적이며 신뢰할 수 없는 프로토콜이다. 만약 전송되는 프로토콜 경로가 문제가 생겼을 경우 돌아가게 될 것이고 경로가 일정치 않다. 그렇기 때문에 데이터의 전송 순서나 오류 발생에 대해서는 전혀 관심을 두지 않는 프로토콜이다. 

TCP/UDP 계층
물리적인 연결과 데이터를 이동해야할 경로도 정해졌으니 그 방법을 기반으로 데이터를 전송만 해주면 된다. TCP/UDP 계층은 데이터를 전송하는 방법을 정의하는 영역이다. 그 방법에 따라서 TCP나 UDP로 나뉘게 되는데 여기서는 TCP만을 설명할 것이다. TCP는 데이터를 보낼 때 길을 찾기 위해 IP를 기반으로 사용한다. IP는 신뢰성이 없는 프로토콜인데 오로지 하나의 데이터 패킷이 전송되는 과정에만 중심을 두고 설계되었다. 따라서 여러 개의 데이터 패킷을 전송했다 하더라도 각각의 패킷이 전송되는 과정은 IP에 의해서 진행되므로 그 순서나 진행은 신뢰할 수 없다.
그렇다면 신뢰성 있는 전송을 하기위해서는 어떻게 해야 할까? A 호스트에서 B 호스트로 데이터를 하나 전송한다고 가정해보자. 그러면 B 호스트에서는 잘 받았다는 내용의 데이터를 A 호스트에게 응답한다. 만약 A 호스트가 B 호스트에게 응답을 받지 못했다면 A는 B가 데이터를 수신하지 못했다고 간주하며 임의의 시간이 지난 후 다시 데이터를 전송한다. 따라서 B는 반드시 데이터를 수신받을 수 있도록 한다. 이것이 바로 TCP의 역할이다. 데이터를 주고받는 과정에서 서로 확인을 거친다면 반드시 전송된다는 것을 보장해줄 수 있다. 결론적으로 IP를 기반으로 호스트 대 호스트가 어떻게 데이터를 주고받을 것인지 약속하는 것이 TCP/UDP 계층이 담당하는 역할이다.

Application 계층
지금까지 살펴본 내용들은 일반적으로 소켓을 생성해서 데이터를 주고 받으면 알아서 처리되는 것들로서 우리가 프로그램을 구현하는 데에 있어서 보기가 어려운 내용들이었다. 데이터의 경로를 찾는다던가, 응답 확인 과정이라던가 하는 작업들이 소켓 하나에 의해 감추어진 것들이기 때문이다. 즉, 프로그래밍을 하는데 있어서 신경을 쓰지 않아도 된다. 이제 소켓을 이용하여 FTP 서버를 구현할지, 인터넷 채팅 프로그램을 구현할지에 대해서는 여러분의 선택에 달렸다. 소켓은 하나의 도구이며 도구를 어떻게 사용하는지에 따라 결과물이 다르게 나오기 때문이다. Application 계층에서는 소켓이라는 도구를 이용해 무엇인가를 만들어 낸다. 무엇인가를 만들어내는데에서 탄생되는 데이터 전송에 관련된 약속(규칙)이 어플리케이션 프로토콜이다. 따라서 대부분의 어플리케이션 개발자의 경우 소켓 프로그래밍을 한다면 Application 계층의 구현을 위해 많은 시간을 보내게 된다.

'소켓 프로그래밍 > 서버와 클라이언트' 카테고리의 다른 글

2) 에코 서버  (0) 2020.07.14
* Iterative 서버  (0) 2020.07.14
* 바이트 순서  (0) 2020.07.09
* 주소 체계와 데이터 설정  (0) 2020.07.08
* 소켓의 생성과 프로토콜  (0) 2020.07.08