패킷은 크게 "헤더"와 "데이터" 두 부분으로 구성되어 있다.
그리고 "헤더"는 이더넷의 제어 정보인 MAC 헤더, IP의 제어 정보인 IP 헤더 그리고 TCP 헤더로 구성되어 있다.
헤더에는 최종 목적지 및 다음 경유지에 대한 정보가 적혀 있어 헤더에 적힌 제어 정보를 통해 최종 목적지에 가기 위한 경로를 찾을 수 있으며 다음 경유지로 데이터가 송신될 수 있다.
TCP 헤더는 프로토콜 스택 안에 존재하는 TCP 담당이 생성하며 IP 헤더와 MAC 헤더는 프로토콜 스택 안에 있는 IP 담당이 생성한다.
먼저 데이터를 송신하는 기기가 패킷을 생성한다. 이후 가장 가까운 중계 장치에 만들었던 패킷 송신한다.
중계 장치에서는 패킷의 헤더 내용을 조사하여 자신이 받아야 할 패킷이 맞는지 확인하고 만약 맞다면 헤더에 적혀 있는 목적지 정보를 활용하여 다음에 데이터를 받아야 할 중계 장치를 파악한다.
이런 방식으로 계속해서 다음 중계 장치로 패킷을 보내면 최종적으로 수신처(최종 목적지)에 패킷이 도착할 것이며 패킷의 송신 과정이 종료된다.
네트워크 상에선 "송신처"와 "수신처"가 구분되어 있지 않다.
웹 서버와 브라우저를 예로 들어보면 브라우저는 웹 서버에게 요청을 보내는 송신처임과 동시에 웹 서버로부터 요청에 대한 결과물을 받는 수신처 역할도 하기 때문이다.
이 때문에 송신처와 수신처 기기를 묶어 "엔드 노드"라고 부른다.
또한 엔드 노드를 연결시키고 있는 중계 장치들을 "중계 노드" 혹은 "중간 노드"라고 부른다.
이전에 말했듯 패킷을 송신할 때에는 서브넷 내부에 존재하는 "허브"와 서브넷 사이를 연결하는 "라우터"라는 두 개의 네트워크 장치를 활용해 패킷을 보낸다.
패킷 송신은 아래 1,2번 과정이 반복되며 수신처까지 도착하는 과정을 통해 이뤄진다.
나중에 자세히 배우겠지만 허브는 이더넷의 규칙에 따라 패킷을 실제로 운반하고 라우터는 IP 규칙에 따라 패킷이 도착할 다음 경유지의 위치를 찾는다.
즉, 위 과정은 아래와 같이 바꿔 말할 수 있다.
두 개 네트워크 장치에서 패킷을 송신하기 위해 활용하는 규칙이 다르기 때문에 데이터(패킷)를 송신하기 위한 제어 정보인 헤더 또한 달라야 하는데 이 때문에 "MAC 헤더"와 "IP 헤더"로 헤더를 나누어 놓았다.
MAC 헤더는 이더넷용 제어 정보로써 서브넷 내부에서 패킷을 이동시키기 위한 제어 정보이다.
IP 헤더는 TCP/IP용 제어 정보로써 다음 라우터 IP 주소를 알아내기 위한 제어 정보이다.
먼저 패킷을 송신할 송신처에서 수신처(패킷이 전달될 최종 목적지) IP 주소를 파악하여 IP 헤더에 저장한다.
이후에는 "경로표"라고 불리는 데이터를 활용하여 패킷이 전달되어야 할 다음 경유지의 IP 주소를 찾는다.
이 경로표는 IP 규칙을 활용하는 네트워크 기기에 존재하는데 대표적으로 라우터와 엔드 노드에 존재한다.
경로표에는 현재 기기에서 패킷이 도착할 수 있는 최종 목적지들과 최종 목적지로 가기 위해 방문해야 하는 다음 중간 노드(라우터)에 대한 정보가 저장되어 있다.
경로표를 통해 다음에 들러야 할 중간 노드의 IP 주소를 찾았다면 ARP 작업을 통해 해당 IP 주소를 가진 라우터의 물리적 주소인 MAC 주소를 구해야 한다.
이렇게 구한 다음 라우터의 MAC 주소를 MAC 헤더에 저장함으로써 이더넷 규칙을 통해서도 다음 라우터를 파악할 수 있게 만들어준다.
위 과정을 모두 거쳐 MAC 헤더와 IP 헤더 값 설정이 끝난 패킷은 이더넷 규칙을 통해 이동된다.
클라이언트와 허브 사이를 연결하고 있는 케이블을 통해 신호 형태로 패킷이 송신되면 허브에 패킷이 도착한다.
허브는 받은 패킷 정보 중 MAC 헤더에 저장되어 있는 다음 라우터의 MAC 주소를 파악한다.
허브의 종류에 따라 동작 방식이 다르겠지만 현재 사용되는 스위칭 허브는 파악한 MAC 주소를 가진 라우터와 현재 허브 사이에 연결된 케이블을 통해 패킷을 전달하며 이를 통해 다음 경유지인 라우터에 도착할 수 있다.
그리고 다음 라우터에선 그다음 경유지인 라우터를 찾는 방식으로 계속해서 패킷을 이동시키면 최종 목적지(패킷 수신지)까지 패킷이 전달되는 것이다.
이후 수신지에서 프로토콜 스택이 패킷에서 데이터를 추출하면 데이터가 전달되는 것이다.
정리하자면 라우터(혹은 송신지)에서 다음 경유지 역할을 할 라우터에 대한 IP 주소와 MAC 주소를 모두 파악한 뒤 패킷을 만들어 보내면 이를 받은 허브가 실제로 지정된 라우터에 패킷을 보내는 과정을 통해 패킷이 송신되는 것이다.
네트워크 통신을 수행할 때 아무것도 없는 환경에서 마법처럼 데이터가 보내지는 것이 아니다.
이미 물리적인 네트워크 기기를 통해 네트워크 환경이 구축되어 있는 상태에서 구축된 네트워크 환경을 활용하여 패킷이 송신되는 것이다.
즉, 한국에서 미국 사이트를 접속할 수 있다는 것은 곧 한국과 미국 사이를 연결하는 네트워크 기기가 존재한다는 것이다.
네트워크 환경을 구축하는 네트워크 기기는 물리적으로 존재하고 있는 기기이므로 한계가 존재한다.
예를 들어 패킷이 송신되는 케이블의 길이가 너무 길 경우 패킷이 중간에 소실되어 목적지까지 도착하지 못할 수 있다.
이런 환경에서 MAC 헤더가 없다고 가정하자.
IP 헤더에는 패킷이 전해질 최종 목적지 IP 주소만 저장되어 있으므로 어떤 경로를 통해 목적지에 도달할지 모른다.
서울에서 부산을 가고 싶은데, 시작지인 서울과 목적지인 부산만 알고 있을 뿐 경부고속도로를 타야하는지타야 하는지 호남고속도로를 타야 하는지 모를 것이다.
물론 전국 일주를 하다보면 언젠가 부산에 도착하긴 하겠지만, 이는 매우 비효율적이다.
패킷도 마찬가지로 통신할 수 있는 모든 케이블을 통해 전달되다 보면 목적지에 도달할 수는 있겠지만(심지어 도달할 수 없을 수도 있다. 서버가 꺼져 있어 접근 못하는 경우도 있기 때문이다) 이는 매우 비율적이다.
그렇다고 IP 헤더가 없는 것은 더욱 말이 안 되는 것이다.
MAC 헤더를 통해 다음 중계 노드는 알고 있지만 최종 목적지를 모를 경우 어디까지 패킷이 전달되는지 모르기 때문이다.
서울 톨게이트를 지나야하는건 알고 있는데 정작 부산을 가려했다는 것을 까먹으면 아무 의미가 없게 된다.
그렇다면 왜 MAC 헤더와 IP 헤더를 나눠 복잡하게 역할을 분리시켜 놨을까?
그냥 1개의 헤더에 MAC 헤더의 제어 정보와 IP 헤더의 제어 정보를 동시에 저장시키면 되지 않았을까?
이는 네트워크 통신의 유연성을 확보하기 위해서이다.
지금까지 설명할 때는 이더넷과 TCP/IP가 역할을 분담하여 패킷을 송신했는데 이더넷 부분은 다른 기술로 대체될 수 있다.
휴대전화 등에 사용되는 무선 LAN, 기존 전화 선로를 활용하여 고속으로 데이터 통신을 수행하는 ADSL, 광섬유를 사용하는 FTTH 등 IP의 의뢰를 받아 패킷을 운반할 수만 있다면 무엇이든 이더넷을 대체할 수 있다.
이 때문에 거대한 네트워크를 구축할 때 가장 중요한 점은 이런 다양한 기술을 모두 활용할 수 있는 네트워크 환경을 구축하는 것이다.
이러한 유연성을 증가시키기 위하여 모든 통신 기술에서 동일하게 사용되는 IP 부분과 각기 다른 규칙을 가진 이더넷 부분(MAC)을 나누어 구축하는 것이다.
프로토콜 스택의 TCP 담당과 IP 담당에 의해 만들어진 패킷은 네트워크용 하드웨어에게 건네진다.
이 네트워크용 하드웨어는 변환기의 역할을 수행한다.
프로토콜 스택에 의해 만들어진 패킷은 0과 1의 바이너리 데이터로 이뤄진 디지털 데이터이다.
하지만 실제로 패킷이 전달되는 케이블은 이러한 디지털 데이터를 전달시킬 수 없고 단순히 빛이나 전기 신호만 전달할 수 있다.
따라서 패킷을 빛이나 전기 신호로 변환하는 과정이 필요한데 이 과정을 네트워크용 하드웨어가 수행하는 것이다.
이 하드웨어는 많은 이름을 가지고 있다.
네트워크와 컴퓨터 사이를 중계해주는 역할을 한다는 의미에서 "네트워크 인터페이스"라고도 부르며 LAN 선과 연결되어 있는 네트워크용 하드웨어라는 의미로 "LAN 어댑터"라고도 불리며 네트워크 환경과 접속되어 있다는 의미로 "네트워크 어댑터"라고도 불린다.
또한 이 네트워크용 하드웨어는 사용되는 방식에 따라서 다양한 종류가 존재한다.
일반적인 경우로 컴퓨터의 마더보드에 이 하드웨어가 내장되어 있을 때는 NIC(Network Interface Controller)라고 한다.
주변 장치를 추가함으로써 네트워크에 접속할 때는 PCI(Peripheral Component Interconnect)를 사용하며 대표적으로 무선 통신을 위해 달았던 안테나가 존재한다.
USB 포트에 직접 연결하여 네트워크에 연결하는 USB 네트워크 어댑터 및 가상 사설망(VPN)에서 사용되며 특정 컴퓨터의 로컬 네트워크를 활용하여 특정 컴퓨터에서 연결하는 것처럼 보이게 하는 가상 네트워크 어댑터도 존재한다.
이렇게 다양한 유형과 이름이 존재하지만 결국 역할은 디지털 데이터를 전기/빛 신호로 변환하거나 그 반대 동작을 수행하는 것이다.
따라서 혼동을 막기 위해 앞으로는 "LAN 어댑터"로 명칭을 통일하겠다.
패킷이 도착하면 아마 이더넷을 통해 전기/빛 신호로 도착했을 것이다.
LAN 어댑터는 이 전기/빛 신호를 다시 0과 1로 이루어진 디지털 데이터로 변환한다.
이렇게 되돌려진 디지털 데이터가 패킷이며 IP 담당 및 TCP 담당에 의하여 데이터 추출이 가능해진다.
데이터 송/수신 동작을 수행할 때 TCP는 단계별로 수행하는 동작이나 TCP 헤더 값 설정이 달라졌다.
연결을 수행할 때는 SYN 비트를 1로 설정한 헤더를 만든다거나 데이터 송/수신을 수행할 때는 시퀀스 번호를 적는 등 각 단계마다 수행하는 동작이 달랐다.
즉, 각 단계마다 다양한 역할을 가진 패킷을 만들어 사용했다.
하지만 IP 담당에게 TCP 헤더와 데이터 조각의 내용은 그렇게 중요하지 않았다.
IP 담당은 단지 TCP 담당이 전달한 패킷을 송신하기 위한 헤더 값만 설정한다.
현실로 예를 들자면 TCP 담당은 편지 제목을 짓는 역할로 편지 내용에 알맞는 편지 제목을 쓴다.
IP 담당은 편지 봉투를 만드는 역할로 편지 내용이 무엇이든 편지를 받을 사람의 이름과 주소만 쓰는 것이다.
이렇기 때문에 IP 담당은 TCP 담당이 어떤 동작을 수행하는지 신경쓰지 않으며 도착한 패킷의 순번이 바뀌었거나 패킷이 누락된 것에 대해서도 큰 관심을 가지지 않는다.
이런 데이터에 관련된 처리는 모두 TCP 담당이 처리하며 IP 담당은 단순히 데이터를 받고 데이터를 보내기 위해 목적지를 기록할 뿐이다.
즉, IP 담당은 TCP 담당의 모든 의뢰에 대하여 동일한 동작이 이뤄지는 것이다.
이제 전체적인 흐름은 알았으니 각 과정에 대해 하나씩 뜯어보며 자세히 공부해 보자.