본 내용은 한양대학교 이석복 교수님의 강의를 참고하여 정리하였습니다. 교재는 Pearson/Addison Wesley에서 출판한 Computer networking : a top-down approach입니다.
IP datagram format
- TTL (Time To Live) : router를 지날 때마다 -1을 해준다. 그리고 0이 되면 PKT 제거한다.
* TTL 사용 이유 : 네트워크에서 이동할 때 무한루프가 생성되기도 한다. PKT가 네트워크 안에서 영원히 존재하는 것을 방지하기 위해서 사용한다.
- length, 16-bit identifier, flags, fragment offset : PKT를 조각내고 다시 합치기 위한 fields
* length : PKT의 길이
* 16-bit identifier : PKT ID
* flags : 조각난 PKT뒤에 다른 PKT가 있는지 여부
* fragment offset : 원래 PKT에서 있던 위치
* 각각의 network link는 최대로 보낼 수 있는 최대의 PKT 크기(MTU = Max Trasnfer Size)가 존재한다. 이때, MTU보다 큰 PKT가 들어오면 PKT를 fragment로 쪼갠다. 이 나뉜 PKT들은 독립적으로 이동하여 목적지에서 합쳐지게 되는데 이때 필요한 것들이 위의 4 fields이다.
* 예시
+ Data 3980 bytes를 분할해서 header를 붙여 1500 bytes가 되도록 분할
+ offset은 byte / 8로 계산된다. 이렇게 하면 field의 크기를 아주 조금이라도 줄일 수 있다.
IP Address (IPv4)
- 고유한 32 bits 번호
- 장치에서 하나의 interface를 지칭
* 보통 IP를 기기의 네트워크 주소라고 알고 있지만 더 정확하게는 기기 내의 interface이다. 1개의 router는 여러 개의 interface를 갖는다.
IP 계층화
- 상황 : IP를 어떻게 배정할까? 무작위로 배정하면 router에 forwarding table의 크기가 커질 것이고 탐색 시간이 증가할 것이다.
- IP Address를 계층화 시켜서 network ID와 Host ID로 구역을 나눈다. 그리고 카테고리 별로 그룹화 한다.
- Network ID는 prefix 또는 subnet이라고도 불린다.
- 아래 IP Address에서 Network ID를 인간이 보기 위해 표현하는 방법은 12.34.158.0/24 이다. 앞에서 부터 24bits까지 network ID라는 의미이다.
- 아래 IP Address에서 Network ID를 컴퓨터가 보기 위해 표현하는 방법은 Mask를 이용하는 방법이다.
- 아래 subnet mask와 AND 연산으로 컴퓨터는 network ID를 알 수 있다.
- 계층화를 했을 때 forwarding table의 수가 줄었다.
- 장점
* 새로운 호스트를 추가하기 쉽다. 왜냐하면, 새로운 호스트가 추가되어도 forwarding table은 그대로이기 때문이다.
* Address 확장이 쉽다. 왜냐하면, 트리 형식으로 체계적으로 구조화 되어 있기 때문이다.
CIDR (Classless Inter-Domain Routing)
- Network ID와 host ID의 길이를 상황에 따라 변화시켜서 사용
- 상황 : 기존 IP Address의 network ID와 host ID는 고정되어 있었다. Class로 나누는 방식이 있었다. 그러나 bits가 고정되면 상황에 따라 원하는 host를 모두 지원할 수 없거나, 반대로 너무 적게 지원하여 자원을 낭비할 수 있다.
- 예시
* Host ID에 17bits를 사용하여, 2^17개의 host를 지원 가능
- Forwarding table
* 가변적인 Network ID를 이용하여 forwarding table을 구성
* 예시 : forwarding 과정
+ 201.10.6.17이 들어오면 201.10.0.0/21과 201.10.6.0/23과 부합한다. 이때, 더 길게 부합하는 201.10.6.0/23 링크를 타고 PKT는 보내진다.
NAT (Network Address Trasnlation)
- PKT의 IP와 port 번호를 router를 통해 변경하여 네트워크 트래픽을 주고 받는 기술
- 상황 : IPv4으로 만들 수 있는 최대 IP 개수는 약 40억이다. 현재, 지구상의 모든 사람들이 40억개를 쓰기에는 많이 부족한 상태이다. 따라서 카테고리로 묶어서 local unique IP와 port를 만들 필요가 있다.
- Router를 기준으로 왼쪽은 global unique IP와 port이고, 오른쪽은 local unique IP와 port입니다. NAT는 global과 local의 IP와 port를 변화시키고 서로 대응시켜 줍니다.
- datagram이 router를 통해 나갈 때 port 번호도 바꿔주는 이유는? IP 변환만으로 host를 찾을 수 없다. 왜냐하면, 같은 port를 쓰는 경우가 있기 때문이다.
* 예시 : local host의 IP가 각각 10.0.0.1과 10.0.0.2이고 port는 80으로 같을 때, router 밖으로 나가는 IP는 138.76.29.7이다. 따라서 IP 만으로 어떤 호스트에서 보낸 datagram인지 알 수 없다. 그래서 port 번호도 새로 부여하는 것이다.
- Local network를 떠나는 모든 datagram은 같은 source NAT IP 주소인 138.76.29.7을 갖고, 다른 source port 번호를 가집니다. 다른 포트 번호는 local network의 host를 찾는데 이용됩니다.
- 동작
1. Host는 자신의 local IP와 port 번호 그리고 목적지 IP와 port 번호를 기록하여 datagram을 전송한다.
2. Router는 도착한 datagram의 출발지 IP와 port 번호를 NAT IP와 새로운 port 번호로 변경하고 기록한다.
3. 보냈던 메시지에 대한 응답이 오면, NAT table에 기록해 두었던 것을 보고 IP와 port 번호를 변경하여 보낸다.
- 예시
* 제주에 사는 나와 서울에 사는 A는 SKT를 사용한다. 구글이 둘의 IP를 검색하면 같은 IP로 검색된다. SKT는 구글에서 보낸 dest IP와 port를 보고 각자에게 보낸다.
* 뉴스에서 부정선거 뉴스가 있었다. 같은 IP로 무수히 많은 투표가 진행되었다는 것이다. 제주에 사는 나와 서울에 사는 A가 투표하면 같은 IP가 나온다. 우리 집은 HCN 통신사를 이용한다. 내 핸드폰으로 투표하고 동생은 자신의 핸드폰으로 투표하면 같은 IP가 나온다.
- 임시 해결
* NAT을 하고 다시 NAT을 계속 하면, local IP에 다시 local IP가 만들어 지는 것과 같아서 IP를 무한히 배정할 수 있다.
- 문제
* Router는 port 번호를 수정하면 안된다. Router는 network layer에 속하기 때문에 오로지 IP header만 다룰 수 있다. 그런데 port 번호는 transport layer의 관할이다.
* NAT은 end-to-end 규칙을 위반한다. Network nodes는 PKT를 수정하면 안된다.
* Local에서 서버 운영이 힘듦
+ Local에서 서버를 만들고 IP와 port를 친구에게 알려주어 접속하게 하면 접속할 수 없다. 왜냐하면, 서버의 IP와 port는 global unique IP와 port가 아니기 때문이다. 그렇다고, 중간 router의 IP를 알려주어도 힘들다. 왜냐하면, router에 NAT table이 없기 때문이다. NAT table은 client에서 나갈 때, 생성된다. 그럼에도, 많은 사용자들이 불편함을 겪지 않는 이유는 대부분의 사용자들은 server가 아닌 client이기 때문이다.
- 근본 해결
* IPv6
+ 비용과 눈치 싸움 등의 다양한 이유로 아직까지 적용하지 않고 있다.
DHCP (Dynamic Host Configuration Protocol)
- 어디를 가든지 host에게 동적으로 IP를 할당
- DCHP server : client가 도착하면 IP를 부여
- DCHP server port 번호 : 68
- DCHP client port 번호 : 67
- 상황 : 위에서 local마다 IP가 다르다고 했다. 그러면 IP를 어떻게 얻을 수 있을까?
- 동작
* 상황 : 새로운 DHCP client가 DHCP server에게 IP를 요청
* DHCP discover
+ client는 자신의 IP를 모름으로 0.0.0.0으로 하고 port 번호를 68로 한다.
+ 많은 DHCP server가 있을 수 있으므로 브로드캐스트 방식으로 네트워크에 뿌린다. 이때, DHCP server만 port 번호 68을 사용하기 때문에 DHCP server만 응답 가능하다.
+ 많은 DHCP server 상황은 우리가 스벅에서 laptop을 키면 옆에 이디야, 투썸 등 여러 DHCP server가 있다.
+ 자신의 ID를 654로 한다.
* DHCP offer
+ 메시지를 받은 DHCP server들은 응답으로 부여할 IP(yiaddrr)를 보낸다.
+ 요청한 장치의 IP가 없으므로 브로드캐스트 방식으로 메시지를 네트워크에 뿌린다.
+ 응답 메시지는 ID 654 장치만 받을 수 있다.
* DHCP request
+ 여러 DHCP server로 부터 응답이 오면 원하는 DHCP server를 선택해서 연결 요청 메시지를 보낸다.
+ 요청은 브로드캐스트 방식을 사용한다. 왜냐하면, 3개의 offer가 왔다고 가정하면, 1개를 선택하고 나머지 2개에게 A라는 DHCP 서버를 선택했다고 알려야 하기 때문이다.
* DHCP ACK
+ 요청에 대한 ACK를 보낸다.
- 결과
* Subnet IP Address
* Subnet mask
* DNS server IP Address
* Gateway router IP address
ICMP (Internet Control Message Protocol)
- IP 패킷을 처리할 때 발생하는 에러를 알려주는 프로토콜
- 목적지 호스트가 없거나 해당 port에 대기 중에 서버 프로그램이 없는 등의 에러 상황이 발생하면, IP header에 기록되어 있는 출발지 호스트에게 발생한 에러를 알려주는 기능을 한다.
- 상황 : Host A가 host B에게 패킷을 보내는데 host B가 원래 없었거나 네트워크 링크가 단절된 상황일 경우, 이러한 에러 상황을 host A에게 알릴 필요가 있다.
- 에러 메시지 종류
* Destination unreachable : 목적지에 도달하지 못함
* Time exceeded : 시간 초과
* etc
- 사용
* Ping : 목적지 호스트의 작동 여부 및 응답시간 측정
* Tracert : 목적지 호스트까지의 경로 추적
IP Address (IPv6)
- 128-bit address space
- 상황 : IPv4는 32-bit 주소 공간으로 약 40억개의 IP주소만 생성 가능. 디지털화에 따라 40억개는 굉장히 부족한 개수.
- 구조 : IPv6 datagram format
* Header 크기 : 40 bytes
* fragmentation 허용하지 않음
* Priority : Flow 안에서 우선순위 구별
* Flow label : 같은 flow에 있는 datagram들을 구별
* Next header : 데이터를 위한 상위 계층 프로토콜 구별
- Tunneling
* IPv6를 IPv4와 섞어서 운영하는 방법
* IPv4 router를 거칠 때, IPv6 datagram을 IPv4 datagram의 데이터 필드(payload)에 넣어서 전송
참고
- 블로그
'Software Courses > Network' 카테고리의 다른 글
Link layer : overview (0) | 2021.01.10 |
---|---|
Network : routing algorithms (0) | 2021.01.08 |
Network : router (0) | 2021.01.06 |
Network : overview (0) | 2021.01.06 |
Transport : Segment의 크기 (0) | 2021.01.05 |