Post

Network 기초 쌓기

용어 정리와 도식화로 네트워크를 이해해보자.

TCP/IP 도식화

보내는 쪽

image

받는 쪽

image

image

image

전송계층에서 Acknowledgement

image

식별자

User 계층, Kernel 계층이 상호작용 하기 위해서 interface 가 존재하는데

  • 이를 socket 이라고 부른다.
  • socket 이라는 interfacefile 형태로 추상화된다.
    • file 형태로 존재하기 때문에 User 계층에 존재하는 Application Process 에
    • TCP 가 접근할 수 있게 된다.

MAC 주소

  • H/W 계층 식별자 (L2)
    • 하드웨어 주소라고 볼 수 있다.
    • 그럼 MAC 주소는 절대로 변경이 불가능한건가?
      • 변경할 수 있다.
    • NIC 가 있어서 LAN 에 연결되기에
    • NIC 의 개수만큼 MAC 주소를 가지고 있다.

IP 주소

  • Network 계층 식별자 (L3)

Port 번호

  • Transport 계층 식별자 (L4)
  • 개발자 관점에서 process 번호
  • 네트워크 관리자 관점에서는 service 번호
  • 통신공사 관점에서는 interface 번호

Host, Switch, Network

Host

  • 인터넷에 연결된 컴퓨터이다.
  • Network 의 이용 주체
    • End-Point(= 단말기) 라고 부른다.

Network

  • HostNetwork 그 자체라고 볼 수 있다.
    • Switch 로 분류된다.
    • Router 를 통해 switching 이 이루어진다.
    • MAC 주소를 통해 switching : L2 스위치
    • IP 주소를 통한 switching : L3 스위치 (= router)
    • PORT 번호를 통한 switching : L4 스위치
    • HTTP 특정 정보를 통한 switching : L7 스위치
    • L7 로 갈수록 헤더에 붙는 정보가 많아져 연산량이 증가하기 때문에 가격이 비싸진다.

Network 는 개념적으로는 독립적인 장치가 어떤 영역 내에서 물리적 통신 채널을 통해서 서로가 직접 통신할 수 있도록 지원하는 데이터 통신 체계이다.
인터넷 또한 물론 네트워크이고, 다음과 같이 말할 수 있다.
인터넷 : Router + DNS 의 집합체

네트워크의 단위 ⭐

image

네트워크 인터페이스 선택 원리와 기준

윈도우 OS 인 경우, route PRINT 명령어를 통해 IPv4 경로 테이블을 확인할 수 있다. 거기서 메트릭, 즉 비용이 가장 적은 인터페이스가 우선적으로 선택된다.

맥 OS 인 경우 직접 확인해보니 좀 달랐다.

  • en0 : WIFI
  • en1, en2 : 썬더볼트를 통한 IP 제공
  • lo : loopback
  • ubun# : 제 3자에 의해 사용되는 tun/tap 인터페이스
    • kernel 단에서 제공되는 가상 인터페이스(?)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
❯ netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags               Netif Expire
default            192.168.0.1        UGScg                 en1
127                127.0.0.1          UCS                   lo0
127.0.0.1          127.0.0.1          UH                    lo0
169.254            link#13            UCS                   en1      !
192.168.0          link#13            UCS                   en1      !
192.168.0.1/32     link#13            UCS                   en1      !
192.168.0.1        88:36:6c:b0:7f:7c  UHLWIir               en1   1170
192.168.0.4        f0:d4:f7:5f:d3:3f  UHLWI                 en1   1190
192.168.0.6/32     link#13            UCS                   en1      !
192.168.0.20       8e:cc:ff:30:fa:22  UHLWI                 en1   1137
192.168.0.25       link#13            UHLWI                 en1      !
192.168.0.255      ff:ff:ff:ff:ff:ff  UHLWbI                en1      !
224.0.0/4          link#13            UmCS                  en1      !
224.0.0.251        1:0:5e:0:0:fb      UHmLWI                en1
239.255.255.250    1:0:5e:7f:ff:fa    UHmLWI                en1
255.255.255.255/32 link#13            UCS                   en1      !

networksetup -listnetworkserviceorder 명령어를 통해서 여러 네트워크 인터페이스의 우선순위를 확인할 수 있고, 네트워크 설정에서 변경도 가능하다. 다만, 구체적인 메트릭 값이 얼마인지는 최근 자료에서는 찾을 수 있는 것이 없었다. 어떤 포럼에서의 질답을 보니 메트릭을 확인해서 내부적으로 로드밸런싱이 이루어지고 있고, 구형 맥에서는 해당 값을 확인하는 설정 탭이 따로 존재한것으로 보인다.

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ networksetup -listnetworkserviceorder
An asterisk (*) denotes that a network service is disabled.
(1) Ethernet
(Hardware Port: Ethernet, Device: en0)

(2) USB 10/100/1000 LAN
(Hardware Port: USB 10/100/1000 LAN, Device: en5)

(3) Thunderbolt Bridge
(Hardware Port: Thunderbolt Bridge, Device: bridge0)

(4) Wi-Fi
(Hardware Port: Wi-Fi, Device: en1)

ipconfig getsummary en1 을 입력하면 아래와 같다 (몇 가지 정보는 지웠다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
❯ ipconfig getsummary en1
<dictionary> {
  Hashed-BSSID : 3c:d6:4f:02:cc:22
  IPv4 : <array> {
    0 : <dictionary> {
      Addresses : <array> {
        0 : 192.168.0.6
      }
      ChildServiceID : LINKLOCAL-en1
      ConfigMethod : DHCP
      DHCP : <dictionary> {
        LeaseExpirationTime : 11/28/2023 17:59:05
        LeaseStartTime : 11/28/2023 15:59:05
        Packet : op = BOOTREPLY
htype = 1
flags = 0
hlen = 6
hops = 0
xid = 0xd4d1b35f
secs = 0
ciaddr = 0.0.0.0
yiaddr = 192.168.0.6
siaddr = 0.0.0.0
giaddr = 0.0.0.0
chaddr = 14:98:77:83:ff:4a
sname =
file =
options:
Options count is 7
dhcp_message_type (uint8): ACK 0x5
server_identifier (ip): 192.168.0.1
lease_time (uint32): 0x1c20
subnet_mask (ip): 255.255.255.0
router (ip_mult): {192.168.0.1}
domain_name_server (ip_mult): {"",""}
end (none):

        State : BOUND
      }
      IsPublished : TRUE
      Router : 192.168.0.1
      RouterARPVerified : TRUE
      ServiceID :
      SubnetMasks : <array> {
        0 : 255.255.255.0
      }
    }
    1 : <dictionary> {
      ConfigMethod : LinkLocal
      IsPublished : TRUE
      ParentServiceID :
      ServiceID : LINKLOCAL-en1
    }
  }
  IPv6 : <array> {
    0 : <dictionary> {
      ConfigMethod : Automatic
      DHCPv6 : <dictionary> {
        Mode : None
        State : Inactive
      }
      IsPublished : TRUE
      RTADV : <dictionary> {
        State : Solicit
      }
      ServiceID :
    }
  }
  InterfaceType : WiFi
  LinkStatusActive : TRUE
  NetworkID :
  SSID : jj
  Security : WPA2_PSK
}

또한 netstat 명령어를 입력하면, 실시간 통신 상태를 터미널에서 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
❯ netstat
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      0  192.168.0.6.55428      server-13-225-12.https ESTABLISHED
tcp4       0      0  192.168.0.6.55426      server-13-225-12.https ESTABLISHED
tcp4       0      0  192.168.0.6.55425      stackoverflow.co.https ESTABLISHED
tcp4       0      0  192.168.0.6.55390      20.205.69.80.https     CLOSE_WAIT
tcp4       0      0  192.168.0.6.55387      stackoverflow.co.https ESTABLISHED
^[[Atcp6       0      0  fe80::809f:82ff:.55212 c4145b6d-1a09-47.55504 ESTABLISHED
tcp6       0      0  fe80::809f:82ff:.55211 c4145b6d-1a09-47.55503 ESTABLISHED
tcp4       0      0  192.168.0.6.55203      td-in-f188.1e100.https ESTABLISHED
tcp4       0      0  192.168.0.6.55202      lb-140-82-113-25.https ESTABLISHED
tcp4       0      0  192.168.0.6.55200      121.53.203.203.https   ESTABLISHED
tcp4       0      0  192.168.0.6.55199      131.160.120.34.b.https ESTABLISHED
tcp4       0      0  192.168.0.6.55198      17.57.145.134.5223     ESTABLISHED
tcp4       0      0  192.168.0.6.55197      ec2-35-174-127-3.https ESTABLISHED
tcp4       0      0  192.168.0.6.55196      lb-140-82-113-25.https ESTABLISHED
tcp4       0      0  192.168.0.6.55163      stackoverflow.co.https ESTABLISHED

그렇다면, Linux, Window, Mac 할 것 없이 라우팅 테이블이 가지고 있는 정보를 토대로 인터넷에 연결된다.

  1. IP 주소를 라우팅 테이블에 적힌 모든 서브넷 마스크와 비트 연산(AND) 한다.
  2. 계산된 값(= )을 모든 네트워크 대상과 비교한다.
  3. 일치하는 네트워크 대상에 대한 메트릭 값을 비교하고, 가장 비용이 적은 인터페이스를 선택한다.
  4. 소켓에 TCP/IP 를 바인딩하고, 소켓 -> 세그먼트 -> 프레임 을 보내 통신한다.

공유기 작동 원리 ⭐

NAT : 네트워크 주소 변환

image

image

image

image

공유기가 중간에 IP 주소, PORT 번호를 바꾼다!

강사님 명언: 연결은 착각이다.

그럼 네이버에서 다시 패킷을 보낼 때, 아래와 같이 보낸다.

image

그럼 네이버에서 전송된 패킷이 공유기를 거치며 NAT 에 관련 정보가 담겨있으니, 테이블을 검색한다.

IP 주소의 종류

인터넷은 Router 와 DNS 의 집합체이다.

  • Global IP
    • Global IP 가 동일할 수 없다. (GSLB 생각하지 말기)
  • Private IP
    • curl https://ifconfig.me 터미널에 입력하면 주소 확인 가능
    • A 클래스, B 클래스, C 클래스, D 클래스
      • C 클래스: 192.168.x.x
      • 공유기에서 주로 사용
  • Loopback

    • 127.x.x.x (127.0.0.1)
    • Host 자신을 의미한다.
    • 패킷이 만들어지지만, 외부로 나가지 않는다.
      • 패킷이 IP 계층까지 도착하지만, 다시 Host 로 돌아간다.
    • 그렇다면, 외부와 접점이 없는 IPC(Inter Process Communication) 경우
      • loopback (localhost=127.0.0.1) 을 사용하면 될 것 같다.
      • 하지만, IPC 에서 소켓 통신을 사용하면 불필요한 전처리 과정을 거쳐야하기 때문에 느리다.
      • Docker 를 사용하는 경우, 컨테이너 간 통신은 또 linux namespace 를 활용하여
      • localhost 를 통해 내부 통신이 가능하고, 이는 따로 정리한다.
  • Broadcast

CIDR

CIDR 개념 쉽게 이해해보자 & 계산법

👷🚧

image

image

8비트로 사설 IP 를 잘게 쪼개서, 버려지는 것이 없도록 낭비를 막기 위한 도입된 꼼수이다. 좀 더 세밀하게 잘라서, 낭비되는 자투리를 최대한 막는것이 목적.

image

또한 192.168.10.70/26 등으로 표기하면 IP 가 가지는 범위에 대한 정보를 한 줄로 전달할 수 있다.

32비트 중 24비트는 네트워크 ID 이고, 나머지 8비트는 호스트 ID 이다.

1
xxxx xxxx.yyyy yyyy.zzzz zzzz.#### ####

192.168.10.70/26 라는 표현식에서 /26 을 생각해보자. 해당 숫자를 통해 서브넷 마스크를 유추할 수 있다. 32비트 중 26비트, 간단하게 32개의 숫자 중 맨 앞에서부터 숫자 1이 26개 있다는 것을 뜻한다.

1111 1111(2).1111 1111(2).1111 1111(2). 1100 0000(2)

1111 1111(2) 를 10진법으로 변환시키면 255 이다.

그럼 위 서브넷 마스크는

255.255.255.192 가 된다.

IP192.168.10.70
서브넷 마스크255.255.255.192

0 ~ 255 까지 총 256개의 숫자 중, 192개 부터 시작하니 256 - 192 = 64

여기서 가장 IP, 마지막 IP 는 네트워크 주소, 브로드 캐스트 주소를 나타내기 때문에 사용할 수 없다.

따라서 64 - 2 = 62

총 62개의 호스트를 가질 수 있다.

256 에서 192 를 제외한 결과인 64 는 256 / 64 = 4 로

4개의 서브넷 네트워크를 가질 수 있음을 나타낸다.

네트워크IP 범위
네트워크 A192.168.10.0 ~ 192.168.10.63
네트워크 B192.168.10.64 ~ 192.168.10.127
네트워크 C192.168.10.128 ~ 192.168.10.191
네트워크 D192.168.10.192 ~ 192.168.10.255

단, 가장 처음과 마지막 IP 는 사용할 수 없다.

다시 192.168.10.70/26 를 살펴보자.

  • 4개의 분리된 네트워크를 가질 수 있으며
  • 각 62개의 호스트를 가진 네트워크를 사용할 수 있고
  • 그 중에서 두번째 네트워크에 속한다는 것

서브네팅, 슈퍼네팅

IPv4 주소는 8비트 4개씩, 총 32비트로 구성된다.

192.168.10.70/26 에서 뒤에 붙는 /26 는 서브넷 마스크가 가지는 1의 개수를 나타낸다. 그럼 /0 ~ /32 까지 있을 수 있지 않겠는가?

하지만, Private IP 에서 클래스 A 가 처음 8비트는 네트워크 ID 를 나타내기 때문에, 가장 처음, 가장 마지막 IP 는 각각 네트워크 ID, 브로드 캐스트 IP 에 할당되기 때문에 사용할 수 없다. 따라서 /8 부터 /30 까지 붙을 수 있다.

서브넷 마스크와 AND 비트 연산을 통해서 네트워크 ID 를 날리고 호스트 ID 를 구할 수 있는데, 숫자 1이 빠지고 줄어드는 것에 따라서 개수가 달라질 것임을 예상해볼 수 있다.

공유기를 사용하는 가정에서 사용되는 192.x.x.x IP는 클래스 C 에 속한다.

image

가상 인터페이스

👷🚧

가상 IP

출처 에 정말 잘 정리가 되어 있다.

방화벽 이중화 예시

image

컴퓨터 200대가 있고, 방화벽에 막혀 있을 때 패킷이 대체 어느 놈한테 가야하는지 누가, 어떻게 결정할까? 가상의 IP 을 부여해서 각각의 IP 을 가진 컴퓨터가 가상 IP 를 바라보게 하면 된다.

실제 물리 주소를 담는 그릇 역할을 한다고 이해했고, 그릇에 담기는 내용물은 바뀔 수 있다. 따라서, 로드 밸런싱 과정에서 특정 경로에 문제가 발생 해 네트워크 통신이 불가능한 상황이 발생하면, 그릇에 통신이 가능한 내용물로 교체하면 된다.

출처

This post is licensed under CC BY 4.0 by the author.