본문 바로가기
개발/소켓 프로그래밍

TCP/IP Protocol 정리

by p_human 2020. 3. 29.

오늘 공부하면서 중요한 것들을 정리해보았습니다.

앞으로 소켓 프로그래밍에 대해서 올리는 내용들은 '윤성우의 TCP/IP 소켓 프로그래밍', 여러 블로그의 내용들을 정리(참고)해서 올릴 것입니다.

 

TCP/IP Protocol Stack

위 그림은 하나의 문제를 작게 나눠서 효율적인 데이터 송수신이 가능할 수 있도록 데이터의 송수신의 과정을 4개의 영역으로 계층화한 것입니다.

TCP 소켓을 생성해서 데이터를 주고받을 때에는 LINK <-> IP <-> TCP <-> Application 4개의 계층을 통해서 이루어집니다.

UDP 소켓도 마찬가지로 데이터 전송이 4개의 계층을 통해서 이루어지지만, LINK <-> IP <-> UDP <-> Application 전송계층(3번째)에서 서로 차이점을 보입니다.

 

왜 위와 같은 그림처럼 데이터의 송수신 과정이 4개의 영역으로 세분화됐을까요?

생각해보면 간단합니다. 예를 들어 수학 문제를 풀 때 복잡한 문제가 나오면 여러 가지 기본 공식을 통해 문제를 풀듯이, TCP/IP 프로토콜도 인터넷의 효율적인 데이터의 송수신을 위해서 4개의 영역으로 나눠진 것입니다.

 

개방형 시스템의 장점

그리고 이렇게 프로토콜을 계층화를 했을 때의 장점은 표준화 작업을 통한 개방형 시스템입니다.

예를 들어, 기존에 사용하던 A케이블을 B케이블로 교체하거나, 컴퓨터에 내장되어 있는 NIC가 고장이 나서 A-NIC에서 타사의 B-NIC으로 교체를 하면 아무 문제없이 정상적으로 작동이 됩니다. 그 이유는 서로 표준을 잘 지켜서 제작을 했기 때문에 타사의 장비로 교체를 해도 아무런 문제 없이 작동하는 것입니다. 이와 같이 표준이 잘 갖추어져 있고, (지원만 잘해준다면...) 해당 기술분야는 빠른 속도의 발전이 가능하게 될 것입니다.

 

LINK 계층

물리적인 영역의 표준화에 대한 결과이며, 가장 기본이 되는 영역입니다. 또한 아래 그림과 같이 두 호스트 간에 데이터 송수신이 가능하려면 물리적인 연결이 필요한데, 이 부분에 대한 표준을 LINK 계층에서 담당하고 있습니다.

인터넷의 연결구조

IP 계층

복잡하게 연결되어 있는 인터넷에서 어떤 경로로 데이터를 전송할 것인가에 대해서 선택해주는 프로토콜이 IP(Internet Protocol)입니다. 데이터의 경로를 선택해주지만 선택할 때마다 일정하지 않고, 비 연결 지향적이라서 신뢰할 수 없는 프로토콜입니다. 그리고 데이터 전송 중에 경로에 문제가 생기면 다른 경로를 선택해서 데이터를 전송해줍니다. 하지만 이 과정에서 데이터의 손실이나 오류 발생 시에는 해결해주지 않습니다.

 

TCP/UDP 계층

IP 계층에서 정해준 경로를 통해 데이터 송수신을 담당함으로 전송(Transport) 계층이라 부릅니다. TCP/UDP는 IP 프로토콜을 기반으로 동작합니다. TCP와 UDP에 대해서 간단히 알아봅시다.

 

TCP(Transmission Control Protocol)

  • 신뢰성 있는 데이터 전송 보장
  • 분실된 데이터의 재전송
  • 연결 지향형 프로토콜
  • 흐름 제어 및 혼잡 제어

UDP(User Datagram Protocol)

  • 신뢰할 수 없는 데이터 전송
  • TCP보다 빠른 데이터 전송 속도
  • 비연결형 프로토콜

 

 

Application 계층

LINK, IP, Transport에서 일어나는 일들은 소켓을 생성 시에 데이터의 송수신 과정에서 자동으로 처리됩니다.

자동으로 처리된다는 것은 프로그래머가 데이터의 전송경로를 확인한다던가, 데이터 수신에 대한 응답의 과정을 신경 쓰지 않아도 된다는 뜻입니다. 이러한 과정은 소켓이라는 도구에 포함되어 있습니다.

프로그래머는 소켓 덕분에 좀 더 자유롭게 네트워크 프로그램을 작성할 수 있게 되었고, 프로그램의 성격에 따라 클라이언트와 서버 간의 데이터 송수신에 대한 약속들이 바로 Application 프로토콜입니다.

 

혹시 잘못된 내용이나 새로 추가할 내용이 있다면 바로 수정하겠습니다.

 

다음 글은 TCP 기반 서버와 클라이언트를 구현하는 부분입니다.