이 포스트는 널널한 개발자님 강의를 참조하여 작성한 포스트입니다.
인터넷은 라우터의 집합체라고 할 수 있는 논리적 네트워크이다. 즉, 인터넷은 라우터의 집합체이다. 라우터하고 비교해서 생각해봐야 할께 L3 스위치이다. 이게 논란의 여지가 있는데 라우터라는 것이 L3 스위치 일종이다라고 생각하는 경우가 있고 그래서 이 2개를 구분하는게 의미없다라고 생각할 수 있고 L3스위치가 라우터의 일종이다라고 생각하는 경우도 있다. 이런 논란이 있는데 나와 강사님의 생각은 이 2개를 구분하는게 의미없다 생각한다. 라우터라는것은 개념적으로 봤을 때 큰 틀에서 L3스위치에 포함된다 생각한다.
인터넷의 핵심적인 요소는 Router와 DNS이다. 그럼 여기서 라우터는 무엇일까? 라우터가 하는 일은 라우팅이고 비유로 택배기사님이나 물류센터 역할을 한다고 보인다. 무슨 뜻이냐면 라우터 자체가 정보를 수집하는게 아니라 라우터라는것을 거쳐간다고 생각한다. 정보는 라우터를 거쳐서 다른 라우터로 이동한다. 그렇게 해서 점핑이 되는건데 뭔가 이동이 일어나는거고 그렇게 해서 통신이 가능한 구조로 되어있다. 그래서 이 부분에 대해 이야기를 하면 이동의 단위 패킷이 나오게 되고 그 다음 TTL 애기가 나오게 된다. 이 TTL에 대해 조금 자세히 보자.
패킷이라는 것은 1가지 중요한게 뭐냐면 인터넷에서의 단위인데 이 패킷이라는 것이 인터넷을 헤매 돌아다니면서 결국 어떤 목적지 주소까지 가야하는데 간혹 어떤 이유로 목적지까지 도달하는데 실패하는 경우가 있다. 즉, 라우터를 타고 라우팅을 계속 하면서 목적지를 찾아다니다가 끝내 못 찾는 경우이다. 그럴때 이 패킷을 빨리 버리고 폐기시켜야지 안그러면 이 패킷이 좀비처럼 살아남고 이 좀비 패킷들이 네트워크에 넘쳐나서 네트워크가 다운되는 다운되는 일이 벌어진다. 그걸 막는 역할을 하는게 TTL이다. 그래서 이 TTL값은 128, 255등 이런 8bit값에서 출발을 한다. 이런 값에서 출발했다가 라우터에서 어떤 라우터로 지날때 이 단위를 Hop이라고 하는데 이 Hop단위로 지나갈때 마다 TTL값이 1씩 감소된다. 이렇게 TTL값이 계속 낮아지다가 0이되었는데도 목적지 주소를 못 찾으면 목적지 주소로 가는게 실패했다고 보고 그 라우터가 해당 패킷을 버린다. 그리고 패킷을 버린 라우터가 출발지 주소 IP에 알려주기도 한다.
단편화는 MTU와 관련이 있다. MTU는 기본적으로 1500byte정도인데 가끔 1400정도 되는 애가 있으면 문제가 발생한다. 왜냐하면 MTU가 1400이면 수신용량이 들어오는 패킷에 비해 적어서 수신을 못하게 된다. 그래서 패킷이 유실되게 된다. 그래서 보내는 쪽에서 패킷을 쪼개서 보내야 한다. 그래서 단편화라는 것은 안 그래도 작은 패킷을 또 짜르는 것이 단편화다. 그래서 이 과정을 설명하면 다음과 같다.
예를 들어 PC 1대가 있다 가정해보자. 이 PC에서 1번 라우터가지 왔다 그리고 라우터들이 위 그림처럼 연결되어 있다 해보자. 그리고 6번 라우터 뒤에 서버라는 것이 있다 생각해보자. 그러면 생각을 해보면 어떻게 가는게 효율적이냐 생각해야 하는데 위 그림처럼 형광색칠한데로 간다 해보자. TTL이 처음 나올때 128이였다고 하면 Hop을 지날때 마다 1씩 감소한다.
이 전체 패킷의 이동경로를 라우팅 경로라고 한다.
그런 패킷을 포워딩해주는 역할을 라우터가 하는거고 그때 기준이 되는 것이 라우팅 테이블이다. 이것을 보고 그것에 따라 라우팅을 결정한다. 근데 중요한것은 MTU관점으로 생각해보면 나머지 MTU는 1500인데 5번 라우터만 1400이라 해보자. 그러면 5번 라우터에서 단편화가 발생한다. 즉, 패킷이 가는데 5번에서 1400밖에 못가니까 패킷을 자르게 되어 있다. 즉, 패킷의 payload를 2개로 짜르고 각각에 IP header를 붙인다. 결국 이렇게 되면 3번에서 5번으로 이동할때는 패킷이 1개였지만 5번에서 6번으로 이동할때는 패킷이 2개가 된다. 그럼 최종적으로 서버에서 이 2개의 패킷을 조립한다. 물론 서버말고 그 전에 어떤 특수 장치를 두어서 여기서 조립을 시킬 수 있지만 통상적으로 수신측 end-point에서 하게 되어있다.
조금 자세히 보면 데이터라는 것은 소켓 인터페이스를 타고 나가 IP stack에서 패킷이 되고 송신이 되면 수신측에 들어온 2개의 패킷이 IP stack에서 조립이 이루어진다. 그리고 조립된 패킷에서 세그먼트를 끄집어내서 최종 프로세스 버퍼에 올리게 된다.
즉, 단편화는 최대한 발생 안 하는게 좋지만 만약 다른 MTU가 있다고 하면 송신을 할때 다른 MTU크기로 보내는 방법으로 해결을 할 수 있다. 하지만 요즘 PC들은 왠만해서 MTU가 1500인데 1400으로 떨어지는 경우가 대표적으로 VPN기술을 적용할때 MTU가 줄어들게 되어있다. 이런 경우 위의 방법으로 해결을 할 수 있다.