[C#] TCP/IP 네트워크 (1)
네트워크 기술은 다른 컴퓨터에서 실행되고 있는 상대 프로세스가 마치 한 컴퓨터, 아니 한 프로세스 안에 있는 객체인 것처럼 다루게 해 줍니다.
이런 강력한 기술을 다루기는 기본적으로 어렵지만, 쉽게 해주는 프레임워크 같은 게 있습니다.
대표적으로 유니티에서 쓰는 포톤 프레임워크 같은게 있습니다.
하지만 이런 프레임워크를 쓸려고 해도 네트워크에 대한 기초는 필수 요소이기 때문입니다.
그래서 이번 글에서 네트워크에 대한 기초를 저도 배우는 입장에서 적어보겠습니다.
컴퓨터끼리 네트워크에서 데이터를 주고받기 위해서는 그 네트워크에서 통용되는 "프로토콜(protocol)"을 따라야 합니다.
프로토콜은 규약, 규칙이라는 뜻의 낱말로, 여기에서는 컴퓨터들이 네트워크를 통해 데이터를 주고받기 위한 통신 규약을 말합니다.
대표적인 예로 1:1. 1:N, N:N 네트워크에서는 대화를 하고자 하는 상대를 어떻게 판단하는가에 대한 규칙,
데이터를 송수신할 때의 바이트 오더에 대한 규칙 등등이 그 예입니다.
그런데 이 세상에는 네트워크가 인터넷만 있는 게 아닙니다.
하지만, 인터넷이 사실상 전 세계 컴퓨터 네트워크의 표준이라 다행입니다.
그리고 프로토콜도 tcp/ip만 있는 건 아니지만 인터넷의 통신 프로토콜로 사용되는 tcp/ip도 실질적인 인터넷 표준 프로토콜로 자리 잡았습니다.
그러므로 사람들은 기본적으로 tcp/ip를 네트워크 공부의 처음으로 선택합니다.(저희 학교도 tcp/ip로 수업하더군요)
tcp/ip는 크게 네 개의 계층으로 구성되어 있으며, 한 계층 위에 다른 계층이 포개어져 있는 형태 때문에 TCP/IP 스택이라고 부르기도 합니다.
TCP/IP 스택
먼저 아래 표는 tcp/ip의 계층을 표시한 겁니다.
Application Layer (응용 계층) |
Transport Layer (전송 계층) |
Internet Layer (인터넷 계층) |
Link Layer (링크 계층) |
★ 패킷(packet)이란
네트워크 분야에서는 네트워크를 통해 오고 가는 데이터를 일컬어 "패킷"이라고 부릅니다.
근데 왜 데이터라고 안 하고 패킷이라고 하냐면 패킷은 내용물+포장지를 의미하기 때문입니다.
왜 포장지가 필요하냐면 포장지로 데이터를 싸서 보호하고, 데이터가 어디에서 어디로 가는지를 기입해야 하기 때문입니다.
데이터를 보낼 때는 애플리케이션 계층부터 시작해서 링크 계층까지 계층을 지날 때마다 포장을 하고, 데이터를 받을 때는 링크 계층부터 시작해서 애플리케이션 계층까지 포장을 뜯어 내용물을 꺼냅니다.
링크 계층
링크 계층은 TCP/IP 계층 구조에서 가장 아래에 위치하며, 물리적인 매체(유선 또는 무선)를 통해 데이터를 전송하는 역할을 담당합니다.
가령 어떤 패킷이 네트워크를 통해 컴퓨터에 들어오면 제일 먼저 바로 이 링크 계층이 맞이합니다.
그리고 이 패킷에서 물리적 데이터 전송에 사용되던 부분을 제거하고 인터넷 계층에 넘깁니다.
그렇게 함으로써 인터넷 계층에서는 패킷이 전파를 타고 넘어왔든 광케이블을 타고 넘어왔든 간에 상관없이 자신의 역할을 처리할 수 있게 됩니다.
인터넷 계층
인터넷 계층은 인터넷 프로토콜 스택의 세 번째 계층으로, 전 세계의 컴퓨터들 간의 데이터 패킷 전송을 관리합니다.
이를 비유하자면, 인터넷 계층은 글로벌한 우편물 배송 네트워크와 같은 역할을 수행합니다.
예를 들어, 송신자가 전송하고자 하는 데이터를 인터넷에 전송하면, 인터넷 계층은 이 데이터를 여러 개의 작은 패킷으로 분할합니다. 각 패킷에는 출발지 IP 주소와 목적지 IP 주소가 포함되어 있습니다. 이후 인터넷 계층은 이러한 패킷들을 인터넷 상에서 목적지까지 최적의 경로를 통해 전송합니다. TCP/IP에서 IP가 인터넷 포로토콜의 줄임말입니다.
근데 인터넷 계층은 상대방이 잘 받았는지 중간에 손상되거나 분실했는지 보장하지 않고, 그저 전송 계층에서 내려온 패킷에 주소를 붙여 네트워크 계층으로 보내기만 할 뿐입니다.
전송 계층
전송 계층은 인터넷 프로토콜 스택의 두 번째 계층으로, 전송 계층에는 이름 그대로 패킷의 운송을 담당하는 프로토콜들이 정의되어 있습니다.
그 중에서도 전송 제어 프로토콜 Transmission Control Protocol(TCP)는 송신 측과 수신 측 간의 연결성을 제공하며, 신뢰할 수 있는 패킷 전송 서비스를 제공합니다.
여러 개의 패킷을 송신하는 경우 패킷 이의 순서를 보장하며, 패킷이 유실되기라도 하면 재전송을 해주기까지 합니다.
TCP/IP의 TCP가 바로 이 프로토콜을 가리키는 것이며, IP가 제공하지 않는 연결성, 신뢰성을 제공합니다.
웹문서를 전달하는 기능을 하는 HTTP를 비롯한 수많은 응용 프로토콜들이 바로 이 TCP/IP 프로토콜 위에서 동작합니다.
한편, TCP는 IP가 제공하지 않는 연결성과 신뢰성을 제공하느라 성능에서 손실을 봅니다. 데이터가 큰 경우에는 여러 개의 패킷에 나눠 담아 순서대로 보내야 하지만, 데이터가 충분히 작은 경우에 는 하나의 패킷에 담아 보내도 됩니다. 이런 상황에서는 TCP가 제공하는 패킷의 순서 보장성이 필 요가 없지요. 또한 받아도 그만 안 받아도 그만인 패킷의 경우에는 굳이 재전송할 필요가 없습니다. 다시 말해, 충분히 작고 전송 신뢰성을 요구하지 않는 데이터의 경우에는 TCP의 장점은 곧 단점밖에 되지 않는다는 뜻입니다.
이를 위한 대안으로 전송 계층에는 UDP(User Datagram Protocol)라는 프로토콜이 정의되어 있습니다. 이 프 로토콜은 연결성도, 신뢰성도 제공하지 않지만 성능이 TCP에 비해 상당히 우수하기 때문에 전송 제어를 직접 처리하는 애플리케이션 수준에서 채용되는 경우가 많습니다.
특히 게임에서 캐릭터의 위치를 UDP로 많이 구현합니다.
응용 계층
응용 계층은 인터넷 프로토콜 스택의 최상위 계층으로, 애플리케이션 간의 데이터 교환을 위한 인터페이스를 제공합니다. 이를 비유하자면, 응용 계층은 편지를 쓰는 사람이나 편지를 받는 사람과 같은, 편지 송수신에 직접적으로 관련된 인터페이스와 기능을 제공하는 역할을 수행합니다.
예를 들어, 이메일 클라이언트나 웹 브라우저와 같은 애플리케이션은 응용 계층을 이용하여 데이터를 전송합니다. 이 때, 응용 계층은 애플리케이션 간의 데이터 포맷과 교환 방식을 정의하고, 데이터를 전송하기 위해 하위 계층들을 이용합니다.
응용 계층은 인터넷에서 가장 많은 서비스와 프로토콜을 포함하고 있습니다. 이에는 이메일, 파일 전송, 웹 서버, 동영상 스트리밍 등이 포함되며, 이러한 서비스는 모두 응용 계층에서 제공되는 인터페이스와 프로토콜을 사용하여 데이터를 전송합니다.
보통 응용 계층 프로토콜은 연결성과 신뢰성을 중요한 프로토콜은 TCP 기반으로 성능이 중요하고 데이터가 조심 유실되어도 된다면 UDP에 기반합니다.
또한 프로그래머가 자신만의 프로토콜을 만들수 있기도 합니다.
위 그림으로 각 계층에 속한 프로토콜들을 한 눈에 볼 수 있습니다.