본문 바로가기
기타/아카이브

[Network Basic] 1. Networks and Protocols

by Riverandeye 2020. 5. 26.

OSI 개념과 프로토콜 기초개념은 생략하였다.

 

loopback address

- 127.0.0.1 -> connection to myself. OS 내부적으로 이 주소를 로컬에서만 접근되도록 보호한다.

 

Reserved Private ranges

아래 나와있는 IPv4 address 영역은 Private network 로 사용하게끔 reserved 된 영역이다.

10.0.0.0 to 10.255.255.255 -> 10.0.0.0/8

172.16.0.0 to 172.31.255.255 -> 172.16.0.0/12

192.168.0.0 to 192.168.255.255 -> 192.168.0.0/16

 

IPv6

IPv6는 128bit (32byte) 이고, 각 byte는 hexadecimal character로 작성되어있다. 

너무 길다보니, 0으로 채워져 있는 영역을 줄여서 표현하기도 한다. 예를 들면

fe80:0000:0000:0000:75f4:ac69:5fa7:67f9 이녀석을

fe80::75f4:ac69:5fa7:67f9 이렇게 줄인다. :: 사이에 있는 건 이제 모두 0으로 채워져있다고 생각하면 된다. 

0000:0000:0000:0000:0000:0000:0000:0001 애는

::1 이렇게 줄일 수 있다. 

 

IPv6에서 Loopback address는 ::1이다.

 

dual-stack implementation은, protocol stack이 IPv4와 IPv6를 동시에 포함한다는 의미이다. 

이를 적용하면 IPv4 뿐만 아니라, IPv4를 업그레이드 한 IPv6를 사용할 수 있다. 

IPv6를 IPv4에 direct mapping 하기 위해서 reserved 된 주소는 다음과 같다.

::ffff:0:0/96.

이제 여기에 IPv4 주소를 붙이면 IPv6에 매칭이 된 것이다. 

 

IPv6 - IPv4 매핑

 

Link-local Address

- network-segment 혹은 broadcast domain 내에서만 유효한 네트워크 주소이다. Uniqueness가 보장되지 않기 때무넹 라우터는 내부적으로 이 주소를 밖으로 포워딩하지 않는다. IPv4에서는, address configuration을 담당하는 DHCP가 동작하지 않거나 할 때만 거의 사용되고, IPv6에서는 항상 지정되고 다양한 프로토콜에 사용된다. 

 

reserved address는 다음과 같다.

IPv4 : 169.254.0.0/16

IPv6 : fe80::/10

 

IPv6에선 IPv4에는 없는 여러 기능들을 제공한다. scope, lifetime, multiple address 등.. IPv4와는 다르다. 

 

Domain names

IP 프로토콜은 패킷을 특정 IP address 에만 전송할 수 있다. 그래서, 도메인 이름으로 연결한 경우, 그 도메 인 이름이 어떤 주소를 가리키고 있는지를 알아야 한다. 이때 DNS 서버와 연결하게 된다. DNS 서버의 IP 주소는 주로 ISP에 의해 할당된다. 

 

DNS Providers

hostname을 찾기 위해 DNS 서버로 UDP message를 전송하여 맨 처음 AAAA-type record를 요청한다. 이때 있으면 IPv6 주소가 반환되고, 없으면 다시 A-type record를 요청하여 IPv4 주소를 반환받는다. 

 

Internet routing

각 endpoint device가 다른 device와 연결되기 위해서 여러 router 들을 거쳐서 도착 지점을 향한다. 가장 먼저 local router 로 전송되고, 다른 라우터로 이동하게 된다. 

 

여러 Router 들을 거쳐 endpoint로 향한다.

 destination으로 갈 때 여러 라우터들을 거치는데, 실제로 어떤 주소의 라우터를 거치게 되는지를 파악하는 명령어가 윈도우에 있다. (리눅스에도 있다) tracert (unix는 traceroute) 를 이용하면, 입력한 도메인의 주소로 이동하는데 어떤 라우트를 거치게 되는지에 대한 목록이 나타나게 된다. 다음은 naver.com으로 이동하는데 거치는 라우터의 모든 주소를 파악하는 명령어이다. 

tracert www.naver.com

그런데 실제로 이를 작성해보면 다음과 같은 결과가 나온다. 

 

요청이 만료되어 라우트를 파악할 수 없다고 한다

왜 그럴까? 해당 라우터가 ICMP 프로토콜을 지원하지 않기 때문이다. 실제로 ping naver.com 을 치면 아무것도 돌아오지 않는다. ICMP 프로토콜을 사용하지 않게끔 막아놓았기 때문이다. 이는 보안상의 문제인데, 이에 대해서는 따로 정리를 할 것이다. ping google.com 을 치면 잘 돌아오고, tracert google.com 을 실행했을때의 결과는 다음과 같이 나온다. 

 

endpoint 경로를 찾은 경우

매 row 마다 3개의 시간이 나와있는데, 이는 해당 주소에 ping을 날렸을 때 얼마만에 돌아오는가를 말해준다. 그래서 어떤 라우터에서 Timeout이 일어나 네트워크의 장애가 빚어졌고, 혹은 어떤 부분에서 네트워크의 병목이 존재하는지에 대해 판단할 수 있는 좋은 기준이 되어준다. 

 

Local Networks and Address Translation

일반적으로 가정 혹은 조직에 Local Area Network가 존재한다 (LAN). 이러한 LAN을 위한 Private address의 범위가 reserved 되어있다. (위에 있음)

IPv4 Local Network 로부터 패킷이 발생한 경우, Internet에 라우팅되기 전에 무조건 NAT를 거쳐야한다. NAT가 구성되어있는 라우터는 해당 커넥션이 어떤 Local Address로부터 발생하였는지를 기억한다

 

동일한 LAN에 있는 경우엔 local address를 직접 이용하여 연결할 수 있지만, internet을 거쳐야 한다면 라우터를 꼭 거쳐야한다. 이때 라우터는 Source IP 주소를 Private LAN 의 IP 주소에서 Public IP 주소로 변경한다. 

Private IP를 Public IP로 변경

 

endpoint에서 요청이 돌아오는 경우 destination IP를 Private IP로 전환해주어야 원래 의도했던 곳으로 응답이 전달될 것이다. Router가 이를 저장하고 있어, 어떤 Private IP로 전달해야 할 지를 기억한다. 이런 동작을 결국 Network Address translation 이라고 한다. 

 

Public IP가 Private IP로 전환

그럼 생각해보면, 에러로 detect되지 않으려면 Source에서 날린 패킷과 리턴된 패킷의 IP address를 고쳐야 하고, 그에 따라 packet의 checksum도 고쳐야 할 것이다. NAT는 또 어떤 private IP 주소가 전송되었는지 기억해야한다. translation address를 기억하지 않으면 어디로 돌려보내야 할지 모르니까는 말이다.. 

 

NAT는 packet data를 수정하기도 하는데, FTP에서 connection information이 packet data에 작성되는 경우에 그렇다. 

IPv6는 NAT가 필요없게끔 각 device가 publicly-addressable address를 갖게 할 수 있다. (물량빨임..)

 

그럼 라우터가 어떻게 메세지가 로컬에서만 돌아야하는지 forward 되야되는건지를 어떻게 판단할까? 

-> netmask, subnet mask, or CIDR

 

Subnetting and CIDR

IP 주소는 여러 부분으로 나뉘는데, msb (most significant bit) 는 네트워크 혹은 서브넷을 구분하는데 사용하고, lsb (least significant bit) 는 네트워크 내의 특정 device를 구분하는데 사용된다. 

 

IPv4는 mask notation을 이용해서 IP address를 구별한다. 예를 들어, 라우터의 주소가 10.0.0.0 에 subnet mask가 255.255.255.0 이라고 해보자. 이제 라우터는 어떤 입력이 들어왔을 때 subnet mask와 bitwise AND operation을 수행해서, 그 결과가 10.0.0.0이 나오면 local subnet에 포함이 된다고 판단한다. 

해당 라우터에 10.0.0.105 로 가는 패킷이 들어왔다 가정하면, 255.255.255.0 으로 bitwise and를 수행하면, 105가 날라가서 10.0.0.0이 남는다. 그럼 애는 지정된 주소랑 똑같으니 이건 이 라우터의 Local network를 향하는 것이다. 

해당 라우터에 10.0.15.22가 들어왔다 치면, 255.255.255.0 으로 bitwise and를 수행하면 10.0.15.0 인데, 이는 10.0.0.0이 아니니까 다른 라우터로 forward를 시켜야 하는 것이다. 

 

Multicast, broadcast, and anycast

 

unicast addressing

packet이 one sender, one receiver로 전송되는 경우 이를 unicast addressing 이라고 한다. 가장 단순하고 일반적임.

 

Broadcast addressing

single sender로부터 패킷을 모든 수신자들에게 동시에 전송하는 방식. 주로, 해당 서브넷의 모든 receiver에게 패킷이 전달되는 방식으로 구성된다. (one to all)

 

multicast

single sender 가 여러 대상에게 communicate 할 때. group management를 포함하며, 메세지는 해당 그룹에 대해 전송된다. 

 

Anycast

target이 누구인지 상관 없는 recipient 에게 메세지를 전송한다. 같은 기능을 하는 여러 서버중에 아무데에나 보내고 싶을 때 사용한다. 

 

IPv4 및 lower network는 local broadcast addressing을 지원하며, 선택적으로 multicasting을 지원한다.

근데 일반적으로는 broadcasting이 허용되지 않고, local network에 대해서 implement 할 수 있다. same unicast를 여러번 하는것보단 multicast 한번이 bandwidth를 아낀다.

multicast를 Application level에서 수행할 수도 있지만, 물론 IP multicasting의 이점을 얻지는 못한다.

 

Port numbers

endpoint를 구분하는 connection Identifier는 IP address 뿐만 아니라 Port 번호도 필요하다. IP address는 specific system을 찾아가는데 사용하고, port number는 해당 IP address 내의 specific application을 찾아가는데 사용한다.

 

일반적인 Protocol에 대한 포트 번호는 다음과 같다. 

 

general 하게 지정되어있는 port 번호

IANA 에 의해 포트 번호가 지정되어있다. 어지간하면 저거랑 겹치는 포트에 다른 프로토콜을 사용하지 않는 것이 좋다. 

 

Socket

소켓은 두 시스템을 연결하는 communication link의 한 endpoint 이다. 마치 파일을 읽고 쓰듯, 네트워크를 통해 데이터를 읽고 쓰는 방식이 추상화되어있다.

 

socket을 define하는 5개의 구성요소

- Local IP address

- Local Port

- Remote IP address

- Remote Port

- Protocol (UDP or TCP)

 

이 5가지 정보를 통해 운영체제가 어떤 패킷이 어디로 가야하는지를 구분한다. 

예를 들어 브라우저 창 2개 띄워서 naver.com을 연결한다고 가정해보자. 이때 잘 생각해보면 애내는 프로토콜, 로컬 IP, remote IP, remote Port 가 똑같다. 이 때, Local Port를 달리하여 connection을 구분하게 된다. (ephemeral port) 

NAT도 이 five tuple을 통해 connection을 구분한다. 

 

Address

powershell에서 ipconfig를 치면 IP 구성이 나온다. 네트워크 어댑터마다 IP 주소가 존재하는데, ip adderss의 range가 Private network 영역에 있음을 확인할 수 있다. 

 

192.168.~~ 면 Private!

보면, link-local 주소가 모두 할당되어있는 것을 확인할 수 있다. Local Network 안에 있어서 그런지 Public IP address를 확인할 길이 없다. 근데 그럼 내 Public IP는 어떻게 알 수 있을까? 주로 내 주소를 알려주는 api를 이용한다.

 

http://api.ipify.org/

접속해보면, IP 주소를 바로 알려준다. 

 

 

Reference

hands-on network programming with c

댓글