
예를 들어, 어떤 Host의 IP주소가 10.0.0.1인 경우를 생각해보자. 이 주소는 Private Address로 사설 IP이다. Private Address란 따로 허가를 받지 않고 자유롭게 사용이 가능한 주소라고 했다. 이 Private Address 주소군은 다음과 같다.
그러나, 허가를 받지 않고 자유롭게 쓸 수 있는 반면 이 주소를 Global하게 사용해서는 안된다. 즉, Local Network에서는 자유롭게 써도 되지만, 인터넷 상에서는 이 주소들을 사용해서는 안된다는 말이다. 인터넷 상에서는 Global IP, 즉 공인 IP들만 사용해야 하기 때문이다. 그래서 사설 IP를 사용해서는 인터넷 상으로 나갈 수가 없으니까 이 사설 IP를 공인 IP로 바꿔주는 장치가 필요하다. 이를 NAT(Network address translation)이라고 한다.
위의 그림에서 본다면 외부에서 이 네트워크를 볼 때는 138.76.29.7로만 보이지, 그 안이 사설 IP주소로 구성되어 있다는 것을 알 수가 없다. 또한, 만약 이 네트워크가 C 클래스라고 한다면 할당할 수 있는 253(254에서 라우터 인터페이스 1개를 제외한)개의 IP주소와 사설 IP를 1대1로 매칭해서 사용하게 된다.
그러면 이 사설 IP를 굳이 안 쓰고 그냥 원래 주소를 쓰면 안되나? 어차피 개수가 늘어나는 것도 아니고 같은 개수를 쓸텐데 왜 굳이 이렇게 사용할까?
NAT로 공인 IP를 사설 IP로 바꿔서 사용하는 것은 사실 외부에서 들어오는 잘못된 패킹 접근을 막기 위해 주로 사용하는 경우가 많다. 외부에서 악의적인 목적을 가지고 침투하는 경우를 막기 위해 사용한다는 것이다. 내부 네트워크에서는 밖에서 보는 IP주소군과 다르기 때문에 NAT가 가지고 있는 라우팅 테이블을 모르는 이상 해당 네트워크의 주소들을 알 수가 없게 되고, 이런 이유 때문에 NAT에서는 악의적인 요청들을 필터링해줄 수 있다.

여기서 NAT는 들어온 요청들에 대해 IP주소는 그대로 쓰되, 포트 번호만 바꾸어서 보낸다. 즉, NAT의 테이블에는 IP주소가 1개만 있고 포트 번호만 바뀌는 것이 일반적이다.
이 방식을 NAPT(Network Address Port Translation)라고 부른다.
이렇게 NAT에서 테이블에 host의 주소가 등록되는 시점은 Private Network 안에서 외부로 패킷을 보내는 시점이다. 즉, PN 내부에서 외부로 패킷을 보내지 않는다면 테이블에 등록되지 않으므로 외부에서 해당 host까지 패킷을 전달할 수 없다. 또한, 외부에서는 내부 네트워크의 구조를 알 수 없고 외부에 알려진 Public IP와 Port 번호로만 내부 네트워크에 접근이 가능하므로 보안을 강화할 수 있다.
그러나, 엄청난 보안 강화로 이어지진 않는다. 여기에 악의적인 공격이 들어오는 원리는 해당 라우터 주소로 포트 번호를 하나씩 바꿔가며 전부 보내는 브루트포스 공격이 들어온다면, 그 중 허용된 포트 번호로는 요청이 들어오므로 Private Network 내부로 접근할 수 있게 된다. 이렇게 허용된 포트 번호를 알아낸 후 디도스 공격을 걸면 공격에 노출되기 때문에 완전하고 완벽한 보안책은 아니다. 단지 이런 과정을 거쳐야만 내부 네트워크를 알아낼 수 있다는 점으로 인한 보안 강화라고 생각하면 된다.
NAPT의 동작 과정을 예를 통해 알아보자.
Transport Layer의 얘기를 조금 가져와본다면 각 Host들은 각각의 Process들을 가지고 이에 대응되는 Port number를 여러 개 가진다. 이 Port number들은 이미 고정되어 사용할 수 없는 1023까지의 Well-known port number와 65535까지의 Ephemeral port numbers로 나뉘게 된다.이때, 10.0.0.1이 Private network 외부에 있는 1.2.3.4:80으로 요청을 보내고 싶다고 해보자. 그러면 일단 10.0.0.1이 사용하는 Process에 대한 Port 번호를 Ephemeral port numbers 중에 임의로 하나 선택해야 한다. 10.0.0.1은 3345을 선택했다고 해보자. 그러면 10.0.0.1:3345은 Public 네트워크로 나가기 위해 NAT 라우터를 거친다. 또, 10.0.0.2도 포트를 선택했는데, 하필 똑같은 3345을 선택했다고 해보자.
이 10.0.0.1:3345과 10.0.0.2:3345이 NAT 라우터에 들어가게 되면 NAT 테이블에서 해당 항목들을 찾는다. 항목을 찾으면 외부 Public 네트워크로 보내기 위해 10.0.0.1:3345라는 주소는 138.76.29.7:5001이라는 Public IP Address로 바꿈과 동시에 특정 포트 번호를 할당하고, 10.0.0.2:3345는 138.76.29.7:5002라는 동일 IP에 대해 다른 Port 번호를 할당한다.
이에 대해 외부에서 10.0.0.1:3345로 응답을 주고 싶다면 138.76.29.7:5001을 Destination address로 설정해서 패킷을 보내면 NAT가 다시 NAPT 작업을 통해 10.0.0.1:3345로 Destination address를 변환하고 Private network 안에서 데이터를 전달할 수 있게 된다.
IP는 Unreliable Connectionless Service를 제공한다고 했다. 즉, Sender가 패킷을 보냈는데 패킷이 중간에 없어지면 Sender는 없어졌다는 사실을 알 수 없다는 의미이다. 그래서 이런 IP의 단점을 보완하기 위해 나온 것이 ICMP이다.

IP 패킷의 Protocol 필드의 값이 1이면 ICMP 메세지를 담고 있는 패킷이라는 의미이다.
ICMP는 에러가 났다는 것을 알려주는 Error-reporting message와 지금 상태가 어떤가를 알려주는 Query message로 나뉜다.

tracert [Domain Name]
ICMP 메세지를 이용해서 해당 주소까지 가는 경로를 추적해줄 수 있는 명령어이다. (trace router) 이 명령어는 TTL을 1부터 하나씩 증가시키면서 보내서 돌아오는 ICMP 메세지를 사용해서 경로를 추적한다. TTL이 1부터 보내면 가장 처음, 2로 보내면 두번째 라우터, 이런 식으로 추적하기 때문에 ICMP 메세지를 사용해서 라우터를 추적할 수 있다.
여기서 Query message에 Address mask request and reply와 Router solicitation and advertisement는 DHCP를 사용하게 되면 쓸 일이 거의 없어진다. DHCP에서는 이런 정보들을 한번에 주기 때문이다.
IGMP
여러 장치가 하나의 IP 주소를 공유하여 모두 동일한 데이터를 수신할 수 있도록 하는 프로토콜이다. IPv4에서는 ICMP 이외에도 이 IGMP라는 기능을 지원한다.