Network/Network

이석복 네트워크 (10)IP, CIDR, Subnets, NAT

finepiz 2022. 8. 3. 05:00

===

http://ocw.hanyang.ac.kr/?course=8465 

 

컴퓨터네트워크_10회차

네트워크계층2 (Network Layer) IP protocol학습 (IP protocol)

ocw.hanyang.ac.kr

 

===

App layer에서 가장 중요한 프로토콜이 HTTP, DNS..

tr에선 TCP, UDP

N layer에선 IP, 오로지 IP

 

===

IP주소

- 32bits짜리 주소공간

- 인터페이스를 지칭한다(NIC)

- 네트워크ID+호스트ID

 

===

 

===

아래는 IP패킷이다(TCP/UDP segment가 DATA로 들어간 그거)

IP protocol version : 현재 이거 4다

length

checksum

time to live(TTL)  --여기 20이라고 적히면 라우터를 거칠때마다 -1씩 업데이트 시켜준다. 0이 되는순간 패킷이 버려진다

(네트웍 상에서 어떤 일이 일어날지 알 수 없어 라우팅 테이블이 잘못됐을 경우 루프를 돌 수도 있다, 이게 없으면 죽을때까지 돌거야, 한정 시간 만큼만 네트워크에 존재하다가 사라져라)

upper layer  --데이터부분에 들어가는게 TCP인지 UDP인지, 이 필드는 receiver측에서 사용할 것이다. 리시버가 받았을 때 이걸 N layer에서 tr로 올릴건데, TCP로 올릴지 UDP로 올릴지 모르니까 적어놓은것

..

가장 중요한건

- source IP address  --메세지 생성한 애

- destination IP address  --받는 애

 

===

모든 헤더는 총 20bytes

TCP 헤더 역시 총 20bytes

인터넷 상에 존재하는 패킷들 대부분 TCP segment를 담은 패킷(그래서 쉽게 TCP 패킷이라고 한다)

그럼 TCP 패킷을 보면 IP헤더, TCP헤더 20 20해서 40바이트가 들어간다. 기본적으로 애플리케이션 메시지에 40바이트의 오버헤드가 덧붙여서 가는것이다

 

*오버헤드 : 어떤 명령어를 처리하는데 소비되는 간접적, 추가적인 컴퓨터 자원을 의미한다.

 

근데 실제 인터넷에 돌아다니는 패킷들중엔 딸랑 5bytes인것도 있다

 = TCP ACK다. 파일전송을 받는다 치면 나는 데이터 안보내고 계속 ACK만 보낼것이다

 

===

▽프로그래밍할 때 클래스나 DB의 필드들을 얼마나 중요하게 생각해야 하는지, 또는 이런 저런 기능을 만들 때 필드 하나 늘려서 처리해도 되는건가? 하는 의문이 있었는데 이런 딱 정착 돼 있는 시스템을 보면서 감이 잡힌다

 

===

오늘의 주인공

 

현재 IPv4라는 프로토콜을 사용하는 IP address는 32bit 주소체계

이론상 2의 32승개

인간이 읽기 어려워서 굳이 8비트씩 끊어서 10진수로 바꿔서 읽는다. 사람들이나 하는 일. 255가 최대

기계는 00001100 00100010 ... 이것만 본다

 

===

host를 지칭하는 주소다 라고 알고 있는데, 틀린말은 아니지만 전공자의 입장에선 더 명확하게 정의해야해

 

IP주소는 host라기보단, host에 들어있는 네트워크 인터페이스 자체(네트워크 인터페이스 카드 NIC)를 인덱싱(지칭) 하는 주소다. 랜카드를 꼽거나 이런게 인터페이스

컴퓨터에 네트워크 인터페이스 카드를 여러개 꼽으면 IP주소 여러개 가질 수 있다. 라우터가 그렇다

 

===

IP주소를 갖고 있기 때문에 인터넷을 하는 것

어떤식으로 배정된걸까?

이런 방식으로 네트워크가 구성이 돼 있다. 네트워크 2개가 라우터로 연결 돼 있어

가장 단순하게 IP주소를 배정하는 방법은

이렇게 막무가내로 하면 되겠지(prefix그런거없다 다 써놨어)

 

근데 문제점이 라우터 안에 들어있는 forwading table이 엄청나게 커져, 검색이 힘들어져

왜? host별로 방향이 다 틀릴테니까

그래서 이렇게 마구잡이가 아닌

 

===

계층화를 시켜놨다

32bit 공간을 두 부분으로 개념상으로 나눠놨다

앞부분은 Network ID

뒷부분은 그 Network안에 속한 host 지칭하는 host ID

 

같은 Network에 해당하는 host들은 같은 Network ID를 갖는다

저 예에선 Network ID부분이 24 bits인데, 굳이 사람들이 보기 편하게 'IP주소/숫자' 로

/숫자가 Network ID의 해당하는 앞의 비트 수

 

앞 부분을 network ID라고 하는데 앞에 나온다고 해서 prefix라고도 부른다

network ID = subnet ID = prefix

 

===

Mask

실제로 기계는 비트로 표현한게 더 편하기 때문에 어디까지가 NetworkID고 hostID인지 알기 쉽게 하기 위해

서브넷 마스크란건 단순히 이 주소중에서 어디까지가 subnetID(NetworkID)인지 나타낸 것  ▽다양하니까 표시하겠지

이 둘은 항상 같이 다닌다 어디까지가 네트워크ID인지 표시해줘야 되니까. 그리고 이걸로 네트워크의 크기를 알 수 있다 256개의 host를 지원한다는 것

 

▽1은 그냥 통과하고 0은 안통과 한댔나?

 

===

그래서 prefix방식으로 구성을 해놓으면

같은 네트워크에 속한 애들은 같은 prefix니까 forwarding table이 단순해진다

이 네트워크는 이쪽

저 네트워크는 저쪽

뭔가 하나를 추가해도 forwarding table에 변화가 없어도 된다 같은 prefix만 가지면 되니까

 

같은 교실에 있으면 networkID는 같고 hostID만 틀려

 

===

과거(지금은 또 안그렇대)에 어떤식으로 IP주소가 네트워크에 붙어있는 기관들에게 배분이 됐는지

인터넷은 네트워크들의 집합, 네트워크의 네트워크

인터넷의 구성요소는 네트워크들. 그 네트워크들은 자기들의 prefix를 가져야해. prefix를 갖더라도 크기가 다 틀리다

우리집 네트워크랑 한양대 네트워크랑 크기가 틀리잖아

 

예전엔 네트워크들한테 prefix를 배정할 때 클래스라는 개념을 두고 배정했다

이렇게

/8 /16 /24

 

class A는

/8 받으면 host를 2의 24승개의 host를 보유할 수 있다

*어림잡는법 지수승을 3으로 나눈다음 그걸 10의 지수승 하면 됨(1억인데? 답은 1600만개잖아 이게얼추맞는건가?)

class A를 가질 수 있는 기관은 전세계에 몇개? 8비트지만 맨 처음은 0으로 시작해야돼서 128개다(극소수다. 문제가 있었다. 시작하자마자 동났다 인터넷 디자인한애들(MIT, UCLA..)이 선점해버림. 선점해도 걔네들이 못 썼어. 낭비)

 

classB는

2의 16승개의 기관이 2의 16승개의 host 가진다

(얘도 금방 동이 남)

 

classB는

2의 24승개의 기관이 2의 8승개의 host 가진다

(얜 많은데 255개 끝)

 

너무 비효율적이다~~ 유연하지 않아 1000개 필요한데 classC는 모자라고 classB받으면 6만개고

 

===

그래서 1990년대 중반에 class개념 없애!하고 나온게 싸이더 CIDR

더이상 8비트단위로 prefix가 끊어지는게 아니라 자유롭게 끊어진다 /15같은게 가능해짐

▽배분할 때 작게 나눠서 줄 수 있다 이 말

 

이제 host 1000개 필요하면 C클래스 4개 받는게 아니고

--이땐 한 기관이 쓸데없이 prefix를 여러개 갖고 있어서 네트워크 안의 라우터들의 forwarding table크기가 컸다

 

/22받으면 1024개 까지 가능한것, prefix도 하나로 바뀌고 forwarding table크기도 줄어듦

▽규모가 애매하면 prefix를 3개 받았겠구나. 그리고 원래 forwarding table이 3개가 들어갔겠네 같은 네트워크인데

forwarding table에 적히는건 prefix

 

===

라우터에 들어있는 forwarding table의 예

라우터가 패킷을 받았고 패킷의 destination IP address를 보니까 201.10.6.17이고

이거에 매칭이 되는 forwarding table의 entry를 찾아서 맞게 행동하면 된다

 

들어온 destination IP address가 /17이니까  210.10.00000110.

세번째 entry prefix가 /21이니까 201.10.00000000.0

이렇게만 해도 201.10.00000까지 같으니까 prefix 매칭되는거래

 

▽뭐지 같은 201.10.00000 이라도 201.10.0까지 네트워크ID인거랑 201.10.00000까지 네트워크ID인거랑 무슨 관계지? 그래도 엇비슷하니까 매칭되는건가

▽prefix랑 dest IP의 prefix말고 IP전체랑 매칭되는거라고 생각해야되나

 

네번째것도 해보면 매칭된다 201.10.00000110.0

 

prefix방식으로 매칭시키면 매칭되는게 여러개 등장한다. 여러개 매칭되는 것중 가장 구체적으로 매칭되는것 = 그것은 prefix의크기가 가장 큰것을 찾아서 매칭시키면 된다

그래서 Longest Prefix Match Forwarding, 라우터에서 하는일이 다 이거다

 

===

그래서 근본적인 질문, forwarding table의 entry은 누가 채우는거야? 이게 있어야 forwarding 하잖아

사람은 못해

라우팅 알고리즘이라고 불리는게 채워줘. 다음 시간

 

===

정리

현재 IP주소는 32비트고 두 부분으로 나뉘어있다

저거는 호스트 2의 9승까지 커버

 

===

수업 말고 따로 찾아본 것

 

subnet mask
 : prefix와 host를 구분해주는 것

192.168.200.135 / 27이면
135는 128+4+2+1 이므로 10000111 이거든?
IP : xxxxxxxx.xxxxxxxx.xxxxxxxx.10000111
서브넷마스크/27 : 11111111.11111111.11111111.11100000
그러므로 IP주소의 xxxxxxxx.xxxxxxxx.xxxxxxxx.10000111 까지가 prefix고 host는 32개다. 10진수로 구분하는게 아니야
그러므로 저 네트워크는(135가 할당된 네트워크는)
xxxxxxxx.xxxxxxxx.xxxxxxxx.10000000부터 (128부터)
xxxxxxxx.xxxxxxxx.xxxxxxxx.10011111까지다 (159까지)

 

그리고 저게 xxxxxxxx.xxxxxxxxx.xxxxxxxx.0이 네트워크를 쪼갠거래. 저건 5번째래

생각해보면 x.x.x.여기서부터 256갠데, 5번째 라는게 이걸 쪼갤 땐 10진수로 생각해보면 순서대로 쪼개겠지 랜덤하게 쪼개진 않을거아냐

그러니까 두개로 쪼개면 0~127 / 128~255일거고

네개로 쪼개면 0~63 / 64~127 / 128~ / ~255 인거

0첫번째(00000000)
1두번째(00100000)
10세번째(01000000)
11(01100000)
100(10000000)
이니까 나뉘었던 네트워크 중에서 5번째도 맞겠네.

8개로 쪼갰다면 (이해하려고)10진수로 생각하면 2진수가 저렇게 특이하게 되니까 맞네

 

===

수업 말고 따로 찾아본 것2

https://mani4u.tistory.com/88

(1)서브넷 마스크 보이지 10진수

서브넷마스크가 네트워크ID부분을 111111111 칠한거니까 그걸 10진수로 바꾸면 192, 224이런게 나오는거지

11000000 이런식으로 = 192

(2)사이더 값이 1씩 늘어날 때마다 쓸 수 있는 host수가 반씩 줄어든다 (2^n개로 쪼갰다)

 

IP가 어쨌든 40억개가 끝이잖아 일단 사설IP는 생각하지 말아야돼

서브넷 마스크는 그저 걔네를 네트워크 단위를 어떻게 잡을거냐야

xxx.xxx.xxx.00000000는 256개 다 쓰는거고

xxx.xxx.xxx.10000000는 0~127, 128~255쓰는거고

xxx.xxx.xxx.11000000는 1구역 2구역 3구역 4구역 쓰는거고

이게 IP주소랑 결합되는건데, host의 구체적인 IP니까 숫자고, 그럼 저 나눠진 애들중에 어느구역인지 알 수 있다

 

내 착각 : 난 서브넷 마스크가 11111111.11111111.11111111.11100000이니까
저 뒤에 0의 개수로 호스트 개수가 32개로 정해지니까
여기 네트워크는 xxx.xxx.xxx.224부터 시작하는건줄 알았어  아니지 그 논리면 11000000은 192부터255잖아 앞에거랑 겹쳐

 

그게 아니야 서브넷마스크는 그저 IP주소의 헤더같은 설명이야

11100000에서 111도 네트워크 식별을 하는거니까. 1이거나 0이거나 할 수가 있네 착각했다
이 의미가 어떤 xxx.xxx.xxx.0인 host 256개짜리 네트워크를 11100000이니까 3개의 1이 1or0 될 수 있으니 1개가 8개 등분한 것.
그럼 192.168.200.0 이라는 네트워크가 8개로 쪼개져서 32개씩 갖게 된 것으로 이해하면 되겠다

(2)135 host ip가 할당된 네트워크 주소
 : 이게 256개 들어가는 네트워크가 8개로 쪼개진건데 각각 32개고 저 host는 135니까 135가 할당된 네트워크는 128~159가 속한 네트워크다. 100/00000 앞 세개도 prefix라서 128+xxxxx니까
128이 네트워크주소고
159가 브로드캐스트고

 

(3)
http://www.ymsys.co.kr/snet.php

이게 /17이면 xxx.xxx라는 네트워크를 반으로 쪼갠거라는데?

/18이면 xxx.xxx라는 네트워크를 4개로 쪼갠거고

/27이면 xxx.xxx.xxx 라는 네트워크를 2^3, 8등분 한거고, 각 네트워크는 2^5개의 호스트가 있는 것

그럼 CIDR이 8의 배수면 기존 클래스 형식의 네트워크야?

 

(4)/17은

호스트가

xxx.xxx.128.1

xxx.xxx.129.5

이런식이 가능하다는거야? 근데 IP주소가 저 16+1의 1이 0일수도 있고 1일 수도 있는거야 그것에 따라

xxx.xxx.10000000 00000001

xxx.xxx.10000001 00000101 도 있지만

xxx.xxx.0... 일수도 있다

 

10진수로 따져서 헷갈리는듯

 

===

앞으로 Subnets이라는 용어를 자주 사용할 거니까, 네트워크랑 비슷한건데

같은 subnet ID(=prefix)를 가진 인터페이스를 가진 device의 집합

그림은 prefix가

223.1.1

223.1.2

223.1.3

subnet을 또 다르게 정의하면 라우터를 거치지 않고 접근이 가능한 host들의 집합

 

===

라우터가 IP주소를 가진다(인터페이스 개수만큼 가지니까 오히려 라우터는 IP주소를 더 많이 갖는다)

 

라우터에 연결된 인터페이스 3개니까 IP주소도 3개야. 얘네 prefix가 같아?다 틀리다(몇 비트 까진지 알아야 하니 /24라고 치면)

라우터는 IP주소를 여러개 갖는데, 걔네들 prefix가 다 틀리다. 라우터는 여러개의 subnet에 속한 걸쳐있는애

 

===

몇개?

와 이렇게 그림으로 보여주니까 뭔가 이해가 될 것 같기도 하면서

subnet 6개다, subnet정의가 같은 prefix를 갖는 애들의 집합

라우터가 3개의 네트워크에 걸쳐있다

 

===

재밌는 얘기

인터넷에서 호스트를 2의 32승개까지 지원할 수 있다. 40억 정도. 1970년대에 디자인

1990년대 초부터 상업화 되면서 1995년에 아 이건 금방 동나겠다

1996년에 IPv6 디자인. 주소공간 128bits 주소공간 걱정할 필요가 전혀 없을 정도

오늘 2022년 IPv4 쓰고있다

어?

 

뭔가 다 각자 고유한걸 쓰는라 아니라 공유하면서 쓰고 있다

트릭이 바로 Network Address Translation(NAT)

 

===

메커니즘이라기보단 트릭이라고 부르고 싶어요

인터넷상에서 데이터를 주고받기 위해선 각자 고유한 IP주소를 갖고 있어야 해

근데 부족해

그래서 NAT를 사용하는 방식에서는 일단 어떤 네트워크가 있을때, 네트워크 내부에서는 유일한 IP를 사용해

내부에서는 유일하되, 다른 네트워크에서는 이 IP를 사용할 수 있어

 

문제는 이런 IP주소를 가진 패킷이 외부로 나가면 안된다

이런 IP주소를 가진 패킷이 외부로 나갈 땐

NAT기능을 하는 gateway router의 IP주소(이건 전세계적으로 유일한 것, 그림의 138.76.29.7)로 바꿔준다

바꿔주면 받는 사람 측에선 라우터에서 메시지가 온줄안다

그럼 리턴 패킷이 올 때 라우터로 오고 변환작업을 반대로 하면 원래 애한테 간다

 

===

 

===

좀 더 구체적으로 보면

처음에 보낼 때 source address가 10.0.0.1인데 이건 여기서만 유일한 거, 이대로 외부로 나가면 안된다 전 세계적으로 유일하지 않으니까

그래서 패킷이 나갈 때 라우터에서 source address를 바꿔준다 라우터의 IP주소로, 포트넘버도 바꿔준것

포트까지 바꿔준 이유는 네트워크 구성원들이 랜덤하게 포트번호를 쓴다면 그걸 그대로 수정을 안하고 밖으로 내보내면 어떤 두개가 같은 포트를 썼을 때 둘다 외부로 보내면 그 두개의 패킷이 구분이 안된다. 리턴 패킷이 돌아올 때 이 포트번호를 갖고 구성원 중 누군지 알아야한다

 

===

이때 또 뭐가 문제냐면

IP Packet

HDR+DATA

이 라우터가 나갈 때 이 컴퓨터가 보낸 패킷을 건드린다. source IP 수정을 해 -> 이건 헤더

여기서 포트넘버는 어딨어? TCP는 DATA부분에 있어

 

tr : 포트

Net L : IP

 

라우터는 Network Layer Device인데 얘는 network layer HDR(IP Packet의 헤더)만 봐야돼

우편배달부가 편지봉투에 적힌거 바꾸고 편지봉투 뜯어서 내용 바꿨어

1)Layer violation이다

 

또 원래

IP는 호스트의 인터페이스 찾아갈 때 쓰는 것

포트넘버는 호스트를 찾아가서 호스트 내부에서 프로세스를 찾아갈 때 쓰는 것

저 상황은 포트넘버를 호스트 찾을 때 쓰고 있어

그럼 NAT를 사용하는 네트워크 내부에서 서버를 운영할 수 없어. 남들이 80번으로 들어와봤자 어떤 호스트인지 지칭하는 것 뿐까지밖에 안돼 2)프로세스에 들어올 수가 없어

 

▽생활코딩에선 클라이언트 입장에서 나갈때는 어케 마법으로 저장해서 돌아올 때 기억하고, 서버입장에선 포트포워딩한대