본문 바로가기

개발👩‍💻/네트워크

11-1:Network Layer: IP: the internet protocol

728x90

IP: the internet protocol

- network address translation (NAT)

- IPv6

 

이제 살펴볼 위 두가지 기술 NAT, IPv6는 IPv4가 지금 부족한 상황에서 나온 솔루션 기술들이다.

 

NAT: network address translation

IPv4는 총 32개의 비트로 주소를 표현할 수 있었고, 이는 2^32로 약 40억개정도의 IP 주소를 나타낼 수 있다

근데 인구수와 디바이스 개수를 고려해보면 아이피 주소가 부족할 것이다.

이를 해결하기 위한 방법 중 하나의 기술이 NAT이다.

NAT는 로컬 네트워크에 있는 모든 장치들을 하나의 IP 주소를 공유한다. 그래서 

로컬 네트워크가 존재한다고 하고, 이를 집에서 사용하는 공유기라고 생각해보자.

이 로컬 네트워크는 이러한 IP 주소 영역의 래인지를 갖는다.

실제로 라우터를 기준으로 외부로 나가는 방향에서는 실제 IP 주소를 갖는다.

결국엔 바깥 쪽에서 봤을 때는 모든 애들의 IP 주소가 138.~이다.

패킷이 들어올 때는 외부에서 받는 공식 IP 주소로 들어오고 이의 내용을 보고 어떤 호스트로 전달을 해야하는지 판단을 해준다. 그래서 말그대로 네크워크 어드레스를 변환해주는 기술이다.

퍼블릭 IP, 프라이빗 IP 로 볼 수 있다.

집에서 사용하는 IP들을 프라이빗 IP들을 가진다.

 

실제로 외부에서 접근할 수 있는 퍼블릭 IP는 예를들어 공유기를 기준으로 보면

공유기에 할당된 실제 퍼블릭 IP주소도 확인할 수 있다.

외부에서는 이 퍼블릭 IP를 통해서 이 호스트에 접근할 수있다.

로컬 네트워크 안에 있는 애들은 프라이빗 IP 어드레스 공간을 가진다.

 

프라이빗 아이피는 로컬 네트워크 안에서만 쓸 수 있다.

 

이런식으로 사용하게 되면 장점은

모자른 아이피 주소는 실제 IP 주소, 퍼블릭 IP 주소인데,

로컬 네트워크에 대해서 딱 하나만 있게 되고, 로컬 네트워크에 있는 호스트들을 이 네트워크를 공유하고, 얘네들은 NAT을 이용해서 프라이빗 IP를 갖게 되므로,

필요한 퍼블릭 IP의 수가 줄어들 수 있다.

 

그리고 장치의 IP주소를 변경을 하고 싶다고 하면,

원래 아이피 주소가 바뀌게 되면 그 장치에 도달하기 위해서 중간에 있는 라우팅이 잘 동작하도록 포워딩 테이블들이 쭉업데이트가 되야할 것인데,

이 NAT을 사용하면 그럴 필요가 없다.

이는 내 로컬 네트워크 내에서만 바뀌었을 뿐이니까 바깥 네트워크게 알릴필요가 없게된다. <- 더 자유로음

 

심지어 ISP를 바꿔도 우리가 사용하고 있던 프라이빗 IP를 바꿀 필요는 없는 것이다.

 

반대로 우리가 공유기 회사를변경(다른 ISP로 변경)했다고 하면, 예를들어 엘지에서 케이티로,

그렇다면 우리가 사용하고 있는 프라이빗 IP는 바뀔 필요가 없고, 퍼블릭 IP만 변경되면 된다.

 

보안적인 장점

결국에 외부에서 내 장치, 내 로컬 네트워크 장치에 직접 접근을 할 수 없다.

왜냐면 항상가운데 라우터가 존재하고, 퍼블릭 IP가 있다면

각각의 호스트들은 프아이빗 IP를 갖고있다.

얘네들을 외부에서 직접 접근할 수 없고, 퍼블릭 IP를 받아 라우터의 도움을 받아서만 네트워크 어드레스를 변환할 수있다. 

그래서 임의로 프라이빗 주소에는 접근할 수 없다.

 

라우터를 해킹을 하지 않는 이상 여기에 직접 접근하기에는 어렵다.

 

 

결국에 NAT라는 것을 지원하려면, 라우터가 지원해주어야 하는 것들이 있다.

 

몇가지가 있는데, 

데이터그램의 IP 주소와 포트 넘버를 중간에 라우터가 조작을 하는 기능을 한다.

바꿀 수가 있는 것.

그래서 데이터그램을 인터넷 바깥으로 외부로 내보낼 때는, 나의 출발지에 IP 주소와 포트 넘버를 원래는 넣어서 보내는데,

이것을 NAT IP 어드레스로 변환을 하고 새로운 포트 넘버로 변환을 한다. 

NAT IP ADDRESS 라고하면 PUBLIC IP라고 이해하면 된다.

 

데이터그램을 받는 쪽은 

NAT IP 어드레스와 포트 넘버를 가지고 다시 보내게 된다.

즉 바꿔치기한 IP주소와포트넘버로 외부에서 보내게 된다.

 

그러면 어떤 것을 라우터에서는 기억해야할까.

- NAT translation table

NAT IP 주소 새로운 포트가 어떤 IP, PORT에 연결이 되어 있는지 이 페어를 기록을 해놔야 하기 때문에

 

새로운 데이터그램이 외부에서 들어올 때는 라우터가 새로바꿔서 보냈던 것을 다시 소스 IP 주소와 포트넘버로 바꿔준다.

 

결국에는 데이트그램의 IP, PORT를 라우터에서 조작한다.

 

라우터는 기본적으로 LAYER-3 = NETWORK LAYER 밑으로만 동작한다.

근데 NAT은 포트를 건드린다 -> 트랜스포트레이어에서 사용을 하는

그래서 원래는 건드리면 안되는데, 건드려야만동작한다.

 

원래는 IP주소가 부족한 것은 NAT 기술보다는 IPv6를 통하는 게 맞는 건데,

실제로는 NAT가 더 많이 사용한다.

 

NAT는 오늘날 많이 쓰인다. 

 

IPv6: motivation

IP 주소공간이 부족해서 주소공간 확장을 위해 고려되었다.

32비트 ipv4 주소를 다 할당을 했기 때문에 나왔다.

이같은 경우에는 128bits 주소 공간을 사용한다.

2^128로 굉장히 큰 수를 표현할 수 있다.

 

추가적으로 고려가 된것이

되도록 빠르게 프로세싱, 네트워크 레이어를처리해야 하는데

라우터가하는일이 많다보니 빠르게 처리하는게 어려워졌다.

 

어떻게 쁠게 처리하고 포워딩을 할 수 있을지를 고려하여 40bytes 의고정길이를 사용한다.

 

IPv4에서는 optional header가있었다. 실제로 옵션의 유무를 확인하려면 헤더의 길이를 확인을 한번 더 했어야 했다.

ipv6에서는 처리하는데 걸리는 시간을 없애고자 고정길이의 헤더를 만들었다.

그래서 여기서는 옵션 헤더 필드가 따로 존재하지 않는다.

다만 우회해서 따로사용할 수 있는 방법을 사용한다.

 

flow라는 개념을 추가했다.

흐름이라는개념을 고려해서 어떤것은 실시간 응용프로그램에 활용되는 흐름인지 아닌지에 대한 흐름을 표현할 수 있도록 추가했다.

 

format을 한번보면

포맷만 보면 IPv4보다 더 간단해졌다.

내용이 더 많이 줄었다.

대신에 source address, destination address는 32bits에서 128bits로 늘어났다.

 

- ver

ipv4와 같이 version을 표시해 주는 필드가 있고,

 

- flow label

위에서 설명한 플로우라는 부분이 플로우 라벨로 표현된다.

그래서 같은플로우에 속하는 데이터그램을 라벨링한다.

어떤 플로우에다가 1이라는 값을 부여한다면, 이 값이 1인 애들은 다 같은 흐름에 속한다고 생각하면 된다.

사실 흐름이라는 것은 설계를 할 때는 고려를 했지만, 어떻게 활용할지는 아직 잘 정의가 되지 않았다.

나중에 활용하기 위해서 포맷상에서는 만들어 놓긴 했지만 실제로는 잘 활용되고 있지 않다.

 

- priority

IPv4 에서 TOS(Time of Service)가 있었는데, 

그거랑 비슷한 개념이라고 생각하면 된다.

결국에 이 플로우 안에서 데이트그램들 사이에 우선순위를 정하는 애라고 생각하면된다.

+ TOS는 어떤 패킷을 먼저 처리할지 정하는 필드였다. 트래픽 구별하여, 실시간에 필요한 패킷인지..

 

- next header

IPv4에서는 upper layer protocol이라는 필드가 있었는데, 위 레이어, 즉 트랜스포트 레이어의 프로토콜을 확인하는 필드였다. TCP, UDP

이거랑 똑같다고 생각하면 된다. 조금 다른 부분은 IPv4에서는 옵션이 있었는데, 여기선 없어졌는데, 이 옵션은 next header를 통해서 표현할 수 있다.

next header가 TCP나 UDP일수도 있지만 이것이 아닐 수도 있다. 그래서 다른 종류의 옵셔널한 내용이 있다면 

payload 부분에 넣어둔다.

UDP, TCP 인경우도 똑같다.

next header 에다가 UDP, TCP 라고 넣어두면 페이로드 부분에서 헤더 사이즈가 얼만큼인지 알 수가 있다. 그리고 그 헤더에서 몇번째가 포트 넘버고, 체크섬이고 이런 것들을 읽어 낼 수가 있다 그리고 그 밑에 부분은 다 데이터이다.

 

그니까 정리를 하자면, next헤더에 위 레이어에서 어떤 프로토콜을 썼는지 확인하는 필드이다. 그리고 여기에 대한 패킷 헤더 관련 추가 내용들 예를 들어 포트 넘버, 체크 섬같은 것들을 페이로드 맨 위에 추가적으로 넣을 수 있다. 

 

그래서 이 필드에서는 따로 정의한 프로토콜을 사용할 수있다.

불필요하게 옵션을 주는게아니라 고정헤더 사이즈 픽스하고 넥스트 헤드를 사용해서 페이로드 안에 헤더를 집어 넣는다고 생각하면 된다.

 

IPv4와 비교해보면 굉장히 단순해졌다.

어떤 것들이 빠졌나 보면, 우선 체크섬이 없어졌다. 이같은 경우는 왜 없앨 수 있었냐, -> 이 체크섬은 트랜스포트레이어에서도 체크섬을 한다. TCP, UDP 모두,

그리고 링크 계층에서도 체크섬 기능이 들어있다.

그래서 어처피 위, 아래 계층에서 체크섬을 하는데 여기서, 네트워크계층에서 까지 체크섬을 할 필요가 없다 판단하여 과감하게 없앤것. 체크섬 체크가 리소스를 많이 사용하게 되기 때문에 이런 계산하는 오버헤드, 그리고 이 계산에 활용되는 하드웨어 자원을 최소화 하고자 체크섬을 없앴다.

라우터 안에서 프로세싱하는데 걸리는 속도를 높혔다.

 

그리고 단편화/재결합하는 부분을 아예엾앴다.

단편화/재결합 하는 것이 

센더와 리시버 사이 라우터들, 각 라우터에서 단편화/재결합들을 진했했다.

중간에 있는 링크의 mtu가 내가 보내려는 데이터그램 사이즈보다 작다면, 

단편화 하여 보내야 했다.

그러나 ipv6같은 경우에는 이런 것을 다 끝에, 보내는애랑 받는 애에서만, 즉 출발지랑, 목적지에서만 단편화/재결합을 수행한는 것으로 바뀌었다.

 

만약 중간 라우터에서 보내려고하는데 다음 mtu보다 데이터그램이 큰경우에는 

그냥 데이터그램을 폐기를 하고 대신에 데이터그램사이즈가 너무 커서 전송할 수 없다고 하는 ICMP 오류메시지를 센더한테 다시 보낸다.

센더는 내가 보낸 데이터그램이 데이터그램 사이즈때문에 손실됨을 알고,

데이터그램을 다시 잘쪼개서 보내게 되는 것이다.

라우터에서할일을 점점 줄이기 위해서 이러한최적화가이루어졌다.

 

Transition from IPv4 to IPv6

IPv6가 만들어지긴했지만 바로 넘어갈 수 있을가?

IPv6는 라우터가 이 기능을 서포트해줘야하는데, 이를 한번에 다 바꾸기는 쉽지 않을 것이다.

현실적인 방법은 IPv4만 지원하는 라우터, IPv4, IPv6둘다 지원하는 환경이 있다면 이 IPv6를 활용할 수 있어야 할 것이다.

IPv4가 중간에 있다고해서 IPv6를 아예못쓴다고하면 안되겠지.

그래서 IPv6가 섞여 있을 때는 IPv6로 동작을하고 중간에 IPv4만 있을 때에는 IPv4로 동작하게 하게끔 만드는 것이 최선이라고 할 수있다.

이것을 가능하게하는 것 tunneling이라고 할 수 있다.

이런 컨셉의 기술들을 다 터널링이라고 한다.

 

일반적으로 우리가 생각하는 터널을 지나가는 것을터널링이라고 하는데,

결국 이 터널처럼 한번에 통과할 수 있는 통로를 만드는 것이라고 할 수 있다.

이 원리는 ipv6 데이터그램을 ipv4만 지원하는 라우터에서도 동작하게 하려면 ipv6데이터그램을 한번더 감싸서 ipv4의 페이로드로 넣는 것이다. -> 패킷안에 패킷을 넣는다.

4G, 5G 사이에도 이러한 터널링을 사용한다.

이런 것이 가능한 것이 터널링 같은 기술 때문이다.

Tunneling and encapsulation

실제로 예시를통해서 보면, IPv6라우터 끼리 있다면 6로 잘 작동할 것이다.

이렇게 되면 패킷을 전송할 때 6버전 그대로 패킷을 넘길 수 있을 것이다.

그러나 이와 반대로 중간에 ipv4 라우터가 있다고 가정해보자

터널링을 활용해서 이 4버전 구간을 통과할 수 있는 것이다.

터널링을 해서 ipv6 데이터그램을 ipv4 데이터그램안에 넣어서 보내게 된다.

중간에 있는 4버전 라우터는 이 패킷이 4버전처럼 처리하고, 6일 때는 패킷 내에 6버전 패킷을확인하여 보낼 수 있게 된다.

 

개념적으로 중간에 ipv4라우터 들이 있었고,

로지컬한 관점에서는 ipv4이든지 6이든지 상관없이 터널처럼 한번 들어가서 목적지로 나갈 수 있도록 동작해야

 

실제로 물리적인 관점에서 보면 

4버전으로 들어가야할 때 캡슐화를 해서 기존에 있는 6버전 캐핏을 다시 4버전의 데이터그램으로 감싼다.

4버전의 패킷에서 소스는 B로 4버전을 시작하는 지점이고 목적지는 4버전이 끝나는 지점인 E가 된다.

시간에 비해서 그렇게 많이 활용되고 있진 않다.

어플리케이션 계층에서 많은 변화가 있었다. 소셜 미디어, 넷플, 등등 많은 플로우가 빠르게 변했는데

네트워크 계층은 쉽게 이뤄지지 않을까.

이것을 생각해보면 문제는네트워크 계층은 집에 비유를 해보면 네트워크 계층을 바꾸는 것은 집을 아예허물고 새로운 집을 만드는 것으로 매우 어려운일, 어플리케이션 계층은 새로운 색깔칠하는 수준의 변화이다.

상대적으로 쉽게 변화를 할 수있는데 반에 네트워크는 하드웨어장치도 다 변해야하고, 의존하는 계층들도 많기 때문에 쉽게 변할 수가 없는 것.

 

 

반응형