출처 : https://en.wikipedia.org/wiki/Internet_Protocol_version_4
IP 헤더의 여러 필드 중 눈여겨봐야 하는 것은 "수신처 IP 주소"와 "송신처 IP 주소"이다.
먼저 IP 헤더 필드 중 가장 중요한 제어 정보인 "수신처 IP 주소"이다.
이전에 설명했듯 네트워크에서는 IP 헤더에 적혀 있는 수신처 IP 주소를 통해 패킷의 수신지를 알 수 있다.
즉, 수신처 IP 주소가 제대로 설정되어 있어야 원하는 서버에 접근하여 데이터(메시지)를 전달할 수 있는 것이다.
이때 수신처 IP 주소는 IP 담당이 스스로 알아내는 정보가 아니다.
지금까지 배웠던 네트워크 이론을 간단히 복습해 보자.
먼저 브라우저는 Request Message를 만든다. 이후 DNS를 통해 도메인 명에 맞는 IP 주소를 찾은 뒤 찾은 IP 주소를 특정 메모리 공간에 저장한다.
그리고 프로토콜 스택의 TCP 담당은 데이터 송/수신을 위해 소켓을 생성한 후 연결을 수행한다.
이때 소켓에는 이전에 찾았던 통신 상대(서버)의 IP 주소와 포트 번호를 저장하고 이후 프로토콜 스택은 데이터 송신을 진행할 때마다 소켓에 저장되어 있는 정보를 활용한다.
즉, IP 담당이 굳이 IP 주소를 찾으려는 노력을 하지 않아도 이미 프로토콜 스택은 통신 상대의 IP 주소를 알고 있는 것이다.
따라서 IP 담당은 TCP 담당이 패킷과 같이 전달해 주는 통신 상대의 IP 주소를 활용하기만 하면 된다.
이처럼 IP 담당은 스스로 수신처 IP 주소를 찾지 않으므로 전달받은 IP 주소가 적절한 수신처인지를 판단하지 않는다.
오직 TCP 담당이 준 IP 주소에 의존하여 IP 헤더를 만든 뒤 패킷을 송신할 뿐이다.
만약 TCP 담당이 어떠한 이유로 수신처 IP 주소를 잘못 주더라도 잘못 전달받은 IP 주소를 그대로 수신처 IP로 기록하여 IP 헤더를 생성한다.
이 경우 올바르게 동작하지는 않겠지만 애플리케이션 혹은 TCP 담당 측에 오류가 있는 것이므로 IP 담당은 책임에 자유롭다.
이런 경우는 대부분 접속 동작에서 최초로 SYN 비트를 1로 설정한 패킷을 보낼 때 일어난다.
이 상황에서 문제가 발생하지 않았다면 상대와 패킷을 정상적으로 주고받았다는 의미이므로 이후 상황에선 정말 예외적인 상황이 아니라면 이 문제는 발생하지 않는다.
그렇다면 수신처 IP 주소가 중요하다는 것은 알겠는데 자기 자신을 의미하는 송신처 IP 주소는 왜 설정하는 것일까?
이를 알기 위해선 IP 주소에 대하여 조금 더 자세히 알 필요가 있다.
우리는 흔히 PC 1개당 IP 주소 1개가 설정되어 있다고 착각하기 쉽지만 사실 IP 주소는 컴퓨터가 아닌 컴퓨터와 연결된 LAN 어댑터에 할당되어 있는 주소 값이다.
우리가 흔히 사용하는 클라이언트용 PC는 연결되어 있는 LAN 어댑터가 하나밖에 없으므로 컴퓨터 1개당 1개의 IP가 할당된다고 착각할 수 있는 것이다.
하지만 서버 기계 등에서는 복수의 LAN 어댑터를 장착할 수 있다.
이렇게 복수의 LAN 어댑터를 활용하면 브라우저(클라이언트) 측에서 보낸 패킷을 받을 수 있는 문이 많아지는 것이므로 더욱 빠르게 요청을 받을 수 있고 동시에 데이터를 보낼 수 있는 문이 많아지는 것이므로 요청에 대한 결과 데이터 또한 빠르게 보낼 수 있을 것이다.
이렇게 복수의 LAN 어댑터가 장착되어 있는 경우 각 LAN 어댑터마다 서로 다른 IP 주소가 할당되어 있을 것이다.
그리고 서버 측 IP 담당은 어떤 LAN 어댑터를 통해 패킷을 보내야 할지 판단해야 한다.
이런 상황을 대비하기 위하여 송신처 IP 주소 값을 기록하는 것이다.
송신처 IP 주소 값을 기록함으로써 여러 개의 LAN 어댑터 중 어떤 LAN 어댑터를 활용하여 패킷을 송신할지 결정해 주는 것이다.
네트워크 환경에서 다음 중간 노드 역할을 수행할 라우터의 IP 주소를 찾아주는 동작과 유사하다.
이전에 설명했듯 네트워크를 통해 패킷을 송신하는 과정은 아래 2단계가 반복되는 것으로 설명할 수 있다.
이 과정에서 1번 과정은 IP 규칙에 따라 동작한다.
그리고 엔드 노드인 서버나 클라이언트 측에서는 프로토콜 스택의 IP 담당이 IP 규칙에 따라 패킷을 전달받을 다음 라우터의 IP 주소를 찾는다.
이때 다음 라우터의 IP 주소를 찾기 위하여 "경로표" 혹은 "라우팅 테이블"이라고 불리는 데이터를 활용한다.
IP 규칙에 따라 다음 라우터의 IP 주소를 찾는 과정은 엔드 노드뿐 아닌 중간 노드에서 IP 규칙에 따라 동작하는 라우터에서도 동일하게 일어나는 과정이므로 나중에 자세히 설명하도록 하겠다.
지금은 일단 눈으로 경로표를 확인해 보며 개요 정도만 파악하고 넘어가자.
윈도우의 경우 CMD 창에서 "route print" 명령어를 통해 경로표를 확인할 수 있다.
출처 : https://www.interfacett.com/blogs/understanding-cisco-routing-tables-with-route-print/
먼저 IP 담당은 전달받은 수신처 IP 주소를 위 이미지의 "Network Destination" 항목과 비교하여 어느 행에 해당하는 데이터를 활용할지 찾아낸다.
이때 IP 주소와 완전히 일치하는 데이터를 찾는 것이 아닌 IP 주소와 왼쪽 부분이 일치하는 데이터를 찾아낸다.
예를 들어 목적지가 65.0.0.12일 경우 이와 일치하는 데이터가 경로표에 없으므로 활용할 데이터가 없는 것이 아니라 빨간색 네모 안에 있는 10.0.2.0 Row Data를 활용하는 것이다.
이때 왼쪽의 어디 부분까지 일치하면 되는지는 IP 규칙에 의하여 정해져 있는데 이는 나중에 자세히 설명하겠다.
이렇게 해당하는 행을 찾으면 "Gateway" 항목과 "Interface" 항목 데이터를 조사한다.
"Interface" 항목 데이터는 패킷을 출력하는 네트워크용 인터페이스(LAN 어댑터 등)를 의미한다.
즉, Interface 항목에 적혀 있는 IP 주소가 할당된 LAN 어댑터를 통해 패킷을 송신하면 다음 라우터(중계 노드)에게 패킷을 전달해 줄 수 있다는 의미이다.
IP 헤더에서 "송신지 IP 주소"의 역할과 유사하다 생각하면 된다.
"Gateway" 항목 데이터는 다음 중계 노드(라우터)의 IP 주소를 의미한다.
정확히 말하자면 다음 중계 노드에 연결된 LAN 어댑터 중 패킷을 실제로 받을 LAN 어댑터의 IP 주소가 기록되어 있다.
정리하자면 현재 라우터에 접속되어 있는 LAN 어댑터 중 Interface 항목에 저장된 IP 주소를 가진 LAN 어댑터를 통해 데이터를 다음 중계 노드로 보낸다.
이후 Gateway 항목에 지정된 IP 주소를 가진 LAN 어댑터와 연결되어 있는 다음 중계 노드에 패킷이 도착하는 것이다.
만약 Interface 항목에 적힌 IP 주소와 Gateway 항목에 적힌 IP 주소가 동일하다면 라우터로 중계하지 않고 상대에게 직접 패킷을 전달할 수 있다는 의미를 가진다.
즉, 수신처 IP 주소에 직접 패킷을 건네줄 수 있다는 의미인데 이 과정 또한 나중에 자세히 다룰 것이다.
"Metric" 항목 데이터는 패킷을 운반할 경우 필요한 비용을 나타낸다.
당연히 운반하는 비용이 작을수록 좋기 때문에 이 값이 작을수록 지름길임을 의미한다.
마지막으로 경로표 맨 위에 존재하는 목적지와 넷마스크가 0.0.0.0으로 등록되어 있는 행을 확인하자.
이는 "기본 게이트웨이"를 의미하며 만약 일치하는 행이 없다면 이 행이 해당되는 것으로 간주한다.
이런 경로표를 활용하여 어느 LAN 어댑터에서 패킷을 송신하고 어떤 라우터(중계 노드)에서 패킷을 받을지 정함으로써 수신지에 도달할 수 있는 패킷 이동 경로를 만들 수 있다.