인터넷 프로토콜 기반 소켓의 경우, 데이터 전송방법에 따라서 TCP 소켓과 UDP 소켓으로 나뉘고, 특히 TCP 소켓의 경우 연결을 지향하기 때문에 스트림 기반 소켓이라고도 얘기합니다. TCP는 Transmission Control Protocol의 약자로 데이터 전송과정의 컨트롤 이라는 뜻을 지닙니다. 따라서 TCP 소켓의 이해를 위해서는 컨트롤의 방법과 범위에 대해 살펴볼 필요가 있습니다.
TCP/IP 프로토콜 스택
TCP가 속해있는 TCP/IP 프로토콜 스택을 먼저 보겠습니다.
위 그림을 통해 TCP/IP 스택이 네 개의 계층으로 나뉨을 알 수 있는데, 이는 데이터 송수신을 네 개의 영역으로 계층화했다는 의미로 받아들일 수 있습니다. 즉 인터넷 기반의 효율적인 데이터 전송이라는 문제를 하나의 덩치 큰 프로토콜 설계로 해결한 것이 아니라 그 문제를 작게 나눠 계층화하려는 노력이 시도되었고, 그 결과로 탄생한 것이 TCP/IP 프로토콜 스택입니다.
TCP 소켓을 생성해 데이터를 송수신할 경우는 다음 네 계층의 도움을 통해서 데이터를 송수신하고,
UDP 소켓을 생성해 데이터를 송수신할 경우는 다음 네 계층의 도움을 통해서 데이터를 송수신합니다.
그리고 각 계층을 담당하는 것은 운영체제와 같은 소프트웨어이기도 하고, NIC와 같은 물리적 장치이기도 합니다.
이제 TCP/IP 프로토콜 스택을 계층별로 하나씩 살펴보겠습니다.
LINK 계층
LINK 계층은 물리적인 영역의 표준화에 대한 결과입니다. 이는 가장 기본이 되는 영역으로 LAN, WAN, MAN과 같은 네트워크 표준과 관련된 프로토콜을 정의하는 영역입니다. 두 호스트가 인터넷을 통해 데이터를 주고받으려면 다음 그림과 같이 물리적인 연결이 있어야 합니다. 이 부분에 대한 표준을 LINK 계층에서 담당합니다.
IP 계층
물리적 연결이 형성됐으니, 데이터를 보낼 기본준비가 되었습니다. 복잡하게 연결되어 있는 인터넷을 통한 데이터의 전송을 위해 선행되어야 할 일은 경로의 선택입니다. 목적지로 데이터를 전송하기 위해 중간에 어떤 경로를 거쳐갈 것인가에 대한 문제를 해결하는 것이 IP 계층이고, 이 계층에서 사용하는 프로토콜이 IP(Internet Protocol)입니다. IP 자체는 비 연결지향적이며 신뢰할 수 없는 프로토콜입니다. 데이터를 전송할 때마다 거쳐야 할 경로를 정해주지만 그 경로는 일정하지 않고 데이터 전송 도중 경로상에 문제가 생기면 다른 경로를 선택해주는데 이 과정에서 데이터가 손실되었거나 오류가 발생하는 등의 문제가 발생한다고 해서 이를 해결하지는 않습니다. 즉, 오류발생에 대한 대비가 되어있지 않은 프로토콜이 IP입니다.
TCP/UDP 계층
IP계층에서 정해준 경로를 기준으로 데이터를 전송만 하면 됩니다. TCP/UDP 계층은 데이터의 실제 송수신을 담당합니다. 때문에 이 층을 가리켜 전송(Transport) 계층 이라고 합니다. UDP는 TCP에 비해 상대적으로 간단하고, 이후 별도로 언급할 것이므로 일단 TCP에 대해서만 설명하겠습니다.
TCP는 신뢰성 있는 데이터의 전송을 담당합니다. 그런데 TCP가 데이터를 보낼 때 기반이 되는 프로토콜이 IP입니다. IP는 오로지 하나의 데이터 패킷(데이터 전송의 기본단위)이 전송되는 과정에만 중심을 두고 설계되었습니다. 따라서 여러 개의 데이터 패킷을 전송한다 할 때 각각의 패킷이 전송되는 과정은 IP에 의해 진행되므로 전송의 순서와 전송 그 자체를 신뢰할 수 없습니다. TCP 프로토콜이 추가되어 데이터를 송수신하면 이 과정에서 서로 데이터의 주고받음을 확인하고, 분실된 데이터가 있다면 해당 데이터를 재전송해줌으로써 데이터의 송수신 과정에 신뢰성을 더해줍니다. 아래 그림은 TCP의 역할을 간단히 표현한 것입니다.
APPLICATION 계층
최종적으로 소켓이라는 도구가 주어졌고, 이를 이용해 무엇인가를 만들면 됩니다. 이렇게 무언가를 만드는 과정에서 프로그램의 성격에 따라 클라이언트와 서버 간의 데이터 송수신에 대한 약속들이 정해지기 마련인데, 이를 가리켜 APPLICATION 프로토콜이라고 합니다.
'네트워크 프로그래밍 > C' 카테고리의 다른 글
[네트워크 프로그래밍/C] TCP의 이론적 내용 (0) | 2022.02.25 |
---|---|
[네트워크 프로그래밍/C] TCP 기반 서버, 클라이언트 구현 (0) | 2022.02.22 |
[네트워크 프로그래밍/C] 인터넷 주소의 초기화와 할당 (0) | 2022.02.22 |
[네트워크 프로그래밍/C] 네트워크 바이트 순서와 인터넷 주소 변환 (0) | 2022.02.21 |
[네트워크 프로그래밍/C] 주소정보의 표현 (0) | 2022.02.17 |