
본격적인 컴퓨터 네트워크에 대한 이야기를 시작해보려고 합니다. 이번 챕터는 2개로 나눌지, 고봉밥으로 1개로 할지 고민이 되지만 글을 써보다가 너무 넘치면 ARP는 따로 다루는걸로 하겠습니다.

자신의 영역이 아닌 다른 외부까지도 전송을 할 수 있게 보장하는 것이 L3입니다. LAN과 다른 LAN간의 통신을 담당하는 계층이고, 핵심적인 계층입니다. 여기서 다른 LAN과 통신하는 장비가 Router라고 합니다. 하지만, L3는 전송을 최대한 노력(Best-Effort)할 뿐, 중간에 패킷에 대한 운명은 책임지지 않는것도 특징입니다. 이는, 단순한 네트워크라는 설계 때문에 그렇습니다.
LAN과 LAN간의 통신을 담당하는 계층. 비로소 Inter + Network (각자 독립적인 네트워크가 연결 되기 시작함)라는 개념이 등장함.
인터넷 프로토콜은 처음 접하게 되면 굉장히 헷갈릴 수 있습니다. 왜냐하면, 한번도 생각해본적이 없고 신뢰성이 없다는게 받아들여지지 않습니다. 제가 학부때 교수님께서 이야기 해주신 그나마 좀 와닿았던 이야기 하나를 보고 가볼까요. 컴퓨터 동작을 이해하는데 가장 좋은 방법은 현실에서 사람들이 어떻게 하는지 보는것도 하나의 방법입니다.
해외여행 갔을 때, 목적지는 알고 있는데 가는 방법이 모를 때 어떻게 하시나요?

아마, 대부분 주변에 사람이 있다면 몸짓발짓을 하면서 길을 물어볼겁니다. 패킷이 길을 찾아가는 방법이 그거랑 똑같습니다. 패킷이 Router들에게 물어보면서, 목적지를 찾아 한치앞도 모르는 길을 헤쳐나가는 겁니다.

이 과정에서, 대답해주는 사람(Router) 또한 자신의 머릿속 지식(Routing Table)에 근거해서 대답해주기 때문에, 해당 지식은 명확하지 않을 수 있습니다. 길을 물어 물어 갔는데, 막상 가보니 아무것도 없는 경우도 있잖아요? 이게 Routing하는 과정입니다. 심지어, 모른다고 할 수도 있습니다.
정리하자면, Packet을 보낼 때, 신뢰성을 보장하지 않고 보내게 됩니다. 단지, 이쪽으로 가면 아마(?) 될 것 같다는 정보만 Router는 주게됩니다.
신뢰성을 보장하지 않는 상황이라는걸 L3에서 표현하면 2가지 상황에 대처를 하지 않는다는 이야기 입니다.
이제, Internet Protocol에 대한 거시적인 이해는 끝난것이라고 보고, IP 주소에 대해서 소개해보겠습니다.
IP주소는 꽤 친숙할 수 있는데, IP 주소는 L3에서 쓰이는 주소체계입니다. 하나의 목적지를 대표하는 주소입니다. 목적지는 하나의 컴퓨터일 수도 있습니다만, 대부분 하나의 LAN을 대표하는 주소라고 이해하는게 더 정확할 수 있습니다.
NetId와 HostId를 이해하려면, 서브넷 마스크라는 개념을 이해해야 합니다. IPv4는 주소가 유한하기 때문에, 처음에는 IP를 관리하는 협회(IANA)가 적절한 클래스로 나눠서 신청을 받는 형식이었습니다. 그래서, IP주소체계를 구글링하게 되면, A클래스,B클래스,C클래스의 이야기가 나오게 됩니다.

예를들어, A클래스는 0.x.x.x , 1.x.x.x, 2.x.x.x,3.x.x.x ~~ 127.x.x.x로 127개의 네트워크 대역과 각 네트워크가 255 x 255 x 255개의 host를 가진 아주 큰 네트워크 대역들입니다. B클래스는 65535개의 호스트를 가지는 네트워크 대역이고, C클래스는 255개의 호스트를 가지는 네트워크 대역입니다. 즉, 하나의 LAN을 호스트 수에 따라 클래스들을 나눈것이죠.
하지만, 네트워크 ID에 따라 호스트 갯수가 정해져있었기 때문에 소비자들이 원하는대로 LAN을 구성하기가 힘들었기 때문에, 나온 개념이 서브넷 마스크입니다. 현재는 위의 주소체계가 유효하긴 하지만,사실 서브넷 마스크로 Network 대역과 Host 갯수를 결정하게 됩니다.
서브넷 마스크는 Prefix라고도 하며, 앞의 몇비트를 고정시킬지 정하는 겁니다. 표시는 ip주소맨 뒤에 /고정시킬 비트의 수로 표기합니다. 예를들어, 172.16.1.2/24 라는 표기가 되어있다고 합시다. 그럼, 아래와 같은 그림으로 NetId와 hostId는 나타나게 됩니다.

NetId (Network ID)
하나의 LAN을 가리키는 ID입니다. Router는 이 부분을 보고, 해당 IP가 내 LAN에 있는지 없는지 결정을 합니다.
HostId
하나의 Host를 가리키는 부분 입니다. 하나의 LAN안에서 각자 가지는 ip 영역입니다.
이제, 현실의 예시를 들어볼 차례입니다. 저희 집에서는 공유기를 사용하기 때문에, NAT에 대한 이야기와 사설망에 대한 이야기를 조금 하고 가야합니다.
IANA에서 IP에 대한 정의를 내릴 때, Multicast, 연구용과 같이 특수한 용도로 사용되는 IP 몇개들은 빼놨습니다. 그 중, 우리가 살펴봐야하는건 사설IP 대역입니다.
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
위 주소들은 도착지가 될 수 없고, Router들이 다 거르게 됩니다. 오직 자신의 LAN에서만 유효한 주소 대역입니다. 따라서, ip주소를 알아내기 위해 cmd에 ipconfig -all 명령어를 쳤을 때, 친구 ip와 내 ip가 똑같이 나오게 되는 경우도 이 사설망 대역이라면 가능합니다.
NAT는 IP의 수요가 1990년대에 고갈되었기 때문에, 땜빵(?)용으로 나온 네트워크 장치입니다. 하나의 IP로 여러 개의 host들을 사용하기 위해서 만들어진 장치입니다. 흔히들 HomeRouter, 공유기라고 불리는 장치입니다.
NAT는 1개의 공인 ip를 갖고, 내부를 사설망 ip로 설정할 수 있습니다. 현재 대부분의 장치는 L4기능까지 추가되어, 포트도 다르게 사용합니다.

네트워크 관리자가 1개의 고속망을 이용하고, 2개의 다른층에 있는 사무실이 있을 때 서로 내부망인데 통신을 보장해줘야하는 상황을 그림으로 그려봤습니다.
4층에서 3층으로 통신을 해야한다면, 사실 위의 이론대로라면 자신의 LAN이 아니라고 판단한 라우터가 최상위 라우터로 보낼거고, 최상위 라우터 또한 자신의 LAN이 아니므로, 외부로 나가기 때문에 해당 패킷은 사설 대역이라서 없어지게 됩니다.

따라서, 최상위 라우터의 라우터 테이블에 10.0.2.1/24 대역은 10.0.0.3 장비로 가라고 기입을 해주어야합니다. 이처럼, 라우팅 테이블은 네트워크 관리자가 직접 조작해서 내부망을 구축할 때 사용하기도 합니다. 여기서, 이제 왜 ip가 같을 때 통신이 안되는지도 쉽게 알 수 있을 겁니다.
사실, 각 프로토콜의 특징을 알려면 Header를 보는게 제일 좋습니다. 왜냐하면, 네트워크 장비도 Header를 보고 해석하기 때문에 Protocol의 모든 특징은 Header에 있습니다.

ID: 12345 flag : 1 Fragment offset:0ID: 12345 flag : 0 Fragment offset:1400 전송을 하면서, MTU의 크기에 따라서 파편화가 진행될 수 있습니다. 왜냐하면, 통신을 생각해보면 결국 데이터가 흘러가는 것은 L2 -> L2 -> L2 -> L2이고, L3부터는 논리적으로 인간이 만든 개념이기 때문에 장치의 한계라는건 분명히 존재하게 됩니다.
따라서, IP Packet이 MTU를 초과하는 경우 송신자측에서 패킷들을 분할하기도 하고, 또는 라우터의 MTU를 초과하는 경우에서 Router들이 분할하기도 합니다. 이렇게 분할한 책임은 IP에 있기 때문에 IP는 해당 패킷들을 재조립하지만, 만약 중간에 Pakcet들이 Loss가 되었다면 재전송이나 이런 작업을 하지않고 다 버려버립니다.
그래서, IP가 비신뢰성 프로토콜이라고 이야기하게 됩니다.
ARP는 IP를 도와주기 위한 프로토콜으로, IP를 통해 MAC주소를 알아내크 프로토콜 입니다. 위에서, L3 switch는 자신의 LAN과 WAN을 구분한다고 했는데 자신의 LAN이라고 판단이 났다면, 전송을 하기 위해서 상대방의 MAC주소가 필요하게 됩니다.
이때, 해당 IP를 갖고있는 장치는 바뀔 수 있기 때문에 ARP를 통해 알게되도록 되어있습니다.


예를들어, 위처럼 10.0.1.5(AA:AA:AA:AA:AA:AA)가 10.0.1.8(BB:BB:BB:BB:BB:BB)을 찾는 ARP Request를 보낸다면 어떻게 될까요?
Opcode에 0001, Src MAC에 AA:AA:AA:AA:AA:AA를 입력하고, target Hardware에는 0을 기입하게 됩니다. 해당 request를 받은 LAN에 있는 PC들은 자신의 IP랑 똑같은지 확인한 뒤, IP와 같다면 OPcode에 0002, SRC MAC에 자신의 MAC, target에 Request한 곳의 MAC을 적어서 보내게 됩니다. 자신의 IP와 똑같지 않다면 무시합니다.
ARP는 장치가 얼마든지 바뀔 수 있다는 가정하에 동작하기 때문에, 꽤 자주 일어나게 됩니다. 따라서, 컴퓨터들은 내부에 ARP Table이라는 캐시 정보를 갖고있고 L2 switch도 ARP Table을 내부적으로 갖고있는 장비들이 있습니다. (발전된 형태)
따라서, 브로드캐스트를 최대한 줄이면서, 동작하게끔 유도하지만 cache때문에 이런 생각이 들 수 있습니다. 물론,장치가 바뀌지 않는다는 가정하에, ARP table에 MAC을 직접 기입하여, ARP의 부하를 줄일 수 도 있습니다.
다른 장치로 바꿔 끼웠는데, 내 컴퓨터에 해당 arp table은 업데이트 되지 않은 상태라면 엉뚱한 MAC으로 통신을 하게 됩니다. 따라서, 요즘은 OS가 IP 셋팅을 바꾸거나, 부팅이 되었을 때 ARP reply를 보내서 자신의 MAC을 업데이트 하도록 유도합니다.
자신의 같은 LAN에 악의적인 공격자가 들어올 수 있다면, ARP를 적극적으로 이용할 수 있습니다. 대표적인 방법이 ARP Spoofing인데, 같은 LAN에 있는 PC의 ARP cache를 조작해서, 공격자 PC로 통신이 오게끔 유도한 뒤, 서로 통신하는 과정의 전체를 도청하고, 정보를 탈취하는 공격입니다. (중간자 공격)
