C++ 게임 서버를 개발하기 위해서는 네트워크 통신 구조에 대한 이해가 필수적입니다. 그리고 네트워크 통신을 제대로 다루기 위해서는, 그 기반이 되는 OSI Model과 TCP/IP Model에 대한 기본적인 지식이 선행되어야 합니다.
이전 글에서 물리 계층에 대해서 알아보았다면, 이번 글에서는 OSI 모델의 데이터 링크(Data Link) 을 중심으로 네트워크 통신의 가장 기초적인 부분을 살펴보겠습니다.
(이 글은 여러 기술 문서와 교재 등 다양한 자료를 참고하였습니다.)
데이터 링크 계층(Data Link Layer) 은 같은 네트워크(LAN) 내에서 네트워크 장비들이 데이터를 올바르게 주고받기 위한 규칙을 정의하는 계층입니다. 물리 계층이 신호를 전달하는 역할만 담당한다면, 데이터 링크 계층은 그 신호를 프레임 단위로 관리하고, 누가 누구에게 데이터를 보내는지, 그리고 전송 중 오류가 발생하지 않았는지를 책임집니다.
이 데이터 링크 계층에서 사용되는 대표적인 통신 규칙(프로토콜)이 바로 이더넷(Ethernet) 입니다. 오늘날 대부분의 유선 LAN 환경은 이더넷을 기반으로 동작하고 있습니다.
[Wikipedia]
Data Link layer is the protocol layer that transfers data between nodes on a network segment across the physical layer.
앞서 설명했듯이, 허브(hub) 는 수신한 데이터를 목적지와 상관없이 모든 포트로 그대로 전송하는 장비입니다. 이러한 구조에서는 여러 컴퓨터가 동시에 데이터를 전송할 경우, 신호가 하나의 전송 매체에서 서로 충돌할 수 있습니다. 충돌이 발생하면 데이터는 정상적으로 전달되지 못하고, 결국 재전송이 필요해져 네트워크 성능이 크게 저하됩니다.
초기의 이더넷은 허브 기반의 공유 매체 환경에서 사용되었기 때문에, 이러한 충돌 문제를 해결하기 위해 CSMA/CD(Carrier Sense Multiple Access with Collision Detection) 라는 방식을 사용했습니다.
즉, 이더넷은 아무 때나 데이터를 보내는 것이 아니라, 전송 시점을 조절하고 충돌을 감지·회피하는 방식으로 네트워크의 안정성을 확보했습니다.
다만, 오늘날의 이더넷 환경은 과거와 다릅니다. 현재는 허브 대신 스위치(switch) 를 사용하고, 전이중(Full Duplex) 통신이 기본이기 때문에 충돌 자체가 거의 발생하지 않습니다.
스위치(switch)의 동작 원리를 제대로 이해하기 위해서는, 먼저 MAC 주소와 그 구조에 대한 기본적인 이해가 필요합니다.
랜카드(RAM Card, NIC)는 컴퓨터 내부에서 생성된 비트열(0과 1)을 전기 신호로 변환한다고 했습니다. 이러한 랜 카드에는 IP 주소보다 먼저 존재하는 MAC(Media Access Control) 주소라는 번호가 정해져 있습니다. 제조할 때 새겨지기 때문에 물리 주소(Physical Address)라고도 부르며 전세계에서 유일한 번호로 할당되어 있습니다.
[Note]
IP 주소가 네트워크 환경에 따라 변경될 수 있는 논리 주소라면, MAC 주소는 장비에 고정된 물리 주소라는 점이 가장 큰 차이입니다.
MAC 주소는 48bit 숫자로 구성되어 있습니다. 그 중 앞쪽 24bit는 국제기구 IEEE가 랜 카드 제조업체에 부여한 번호이고, 뒤쪽 24bit는 제조사가 랜 카드에 붙인 일련 번호입니다.

이더넷 환경에서 데이터가 전송될 때, 상위 계층에서 내려온 데이터에 이더넷 헤더(Header) 와 트레일러(Trailer) 가 추가되어 전송됩니다. 이렇게 헤더와 트레일러가 포함된 데이터 단위를 프레임(Frame) 이라고 합니다.
이더넷 헤더는 총 14바이트(Byte) 로 구성되어 있으며, 다음과 같은 정보를 포함합니다.
목적지 MAC 주소(6byte) : 데이터를 전달받을 네트워크 장비의 MAC 주소
출발지 MAC 주소(6byte) : 데이터를 전송한 네트워크 장비의 MAC 주소
이더넷 타입(2byte) : 이더넷 프레임에 담긴 상위 계층 프로토콜의 종류를 나타내는 필드
이때 이더넷 유형(Ehternet type)이란? 이더넷 타입(EtherType) 은 이 프레임의 페이로드(payload)에 어떤 상위 계층 프로토콜이 들어 있는지를 알려주는 식별자입니다. 이 값은 16진수(0xXXXX) 형태로 표현됩니다.

이더넷 프레임의 마지막에는 트레일러(Trailer) 가 붙으며 이를 FCS(Frame Check Sequnence) 라고도 합니다. 트레일러는 CRC(Cyclic Redundancy Check) 방식으로 프레임 전송 도중에 오류가 발생하는지 확인하는 용도로 사용합니다.
수신 측은 프레임을 받은 후 CRC 값을 다시 계산하여 FCS와 비교합니다. 만약 값이 일치하지 않으면 해당 프레임은 손상된 데이터로 판단하여 폐기됩니다.
스위치(Switch) 는 OSI 모델의 데이터 링크 계층(Layer 2) 에서 동작하는 네트워크 장비로, 레이어 2 스위치(L2 Switch) 또는 스위칭 허브(Switching Hub) 라고도 불립니다. 외형은 허브와 비슷하지만, 동작 방식과 역할은 완전히 다릅니다.

스위치 내부에는 MAC 주소 테이블(MAC Address Table) 이 존재합니다. 이를 주소 테이블(Address Table) 또는 CAM 테이블(Content Addressable Memory) 이라고도 부릅니다. MAC 주소 테이블은 다음 정보를 저장합니다.
스위치 전원을 켠 상태에서는 MAC 주소 테이블에 비어 있습니다. 만일 MAC 주소가 테이블에 없다면, 프레임이 돌아온 포트 번호와 함계 MAC 주소를 테이블에 등록합니다. 반대로 이미 등록되어 있다면, 기존 정보를 유지하거나 갱신합니다. 이를 MAC 주소 학습 기능이라고 합니다.

MAC Adress Learning이 끝난 후, 스위치는 Frame에 포함된 목적지(Destination) MAC 주소를 MAC 주소 테이블에서 조회합니다. 목적지 MAC 주소가 테이블에 존재하면 해당 MAC 주소가 연결된 포트로만 프레임을 전달합니다. 이 방식 덕분에 스위치는 필요한 장비에만 데이터가 전달되는 효율적인 통신을 가능하게 합니다.
하지만 컴퓨터 1에서 컴퓨터 3에 데이터를 전송한 시점에서는 아직 컴퓨터 3의 목적지 MAC주소가 MAC주소 테이블에 등록되어 있지 않아서 소싱 포트 이외의 포트에 데이터(프레임)가 전송되는데 이러한 데이터(프레임) 전송을 플러딩(Flooding)이라고 합니다.

.
.
.
[]
[]
[정보통신기술용어 해설]