OSI 7 layer ( OSI 7계층, 모델)

OSI 모형(Open Systems Interconnection Reference Model)은 국제표준화기구(ISO)에서 개발한 모델로, 컴퓨터 네트워크 프로토콜 디자인과 통신을 계층으로 나누어 설명한 것이다. 일반적으로 OSI 7 계층 모형이라고 한다. 1위키백과 에서 발췌

이 모델 자체가 특별한 역할을 하거나, 목적은 아니고 네트워크 설계를 하게 되면 이 모델을 따라 설계를 하자 하는 표준. 약속이다. 많은 공학도들이 네트워크 과목에서 이걸 만나고 ‘WTF!’2What The Fuck(와떠뻑) 을 외친다는 사실은 많이 알려진 사실이다. 많은 책, 오픈백과, 블로그 등등에서 친절하게 설명하고있고, 이 포스트도 가능한한 친절하게 설명하고자 하지만 그들보다 쉬울 수 있을지는 잘 모르겠다.

그림이 없으면 허전할 것 같아서 그려봤다.

1계층은 물리연결 계층이고 2계층은 데이터링크… 이런 내용은 따로 설명하지 않겠다. 이미 검색결과 상단의 링크에서 지겨울정도로 봤을테니까. 조금은 다른 방법으로 접근 해보자.

스위치는 L2 스위치 부터 존재한다.
여기서 ‘L’‘Layer’를 의미한다.
즉, L2 스위치는 Layer-2 를 처리할 수 있는 스위치라는 뜻이다.
L3 는 Layer-3, L4는 Layer-4. 당연히 L5, L6, L7 스위치도 존재한다.

Layer 1

하.지.만. L1 스위치란 단어는 생소하다. 마치 없는 것 같다.
이유를 알기 위해서는 Layer-1 에서의 역할을 이해야 한다.
Layer-1은 ‘물리’계층임을 이미 알고 있을 것이다. 이름 그대로 물리적으로 연결이 되고, 신호가 전달 되는 것이 1 계층이다.

그림에서처럼 ‘뭔지 모르지만 신호를 보내는 장비’는 ‘뭔지 모르지만 신호를 받고 싶은 장비’ 에게 빨간색 신호를 보내지만 거리가 멀어서 닿지 않는다.

이 중간에 ‘들어오는신호를 증폭 시켜서 밖으로 내보내는 장비’를 설치한다. 멀어서 닿지 않던 신호는 ‘뭔지 모르지만 신호를 받고 싶은 장비’까지 전달된다.
이런 역할을 하는 녀석이 바로 ‘리피터(Repeater)’3신호의 증폭에 초점을 두면 리피터, 단순 연결에 초점을 두면 브릿지(Bridge)가 된다. 결국 그놈이 그놈이다. 신호라고 해서 이해가 안되면 1.5v짜리 건전지를 1Km밖에 있는 전구에 연결한다고 생각해보자. 1Km까지 1.5v를 유지하려면 중간중간 전압을 높여주는 장비들을 설치 해야 할 것이다.이다.
즉 Layer 1 에 해당하는 무언가를 만들 때는 ‘신호의 온전한 전달’ 만 신경 쓰면 된다는 이야기이다.

[가.] 는 리피터(혹은 브릿지)이다.
[나.] 는 출력을 세 개로 늘린 장비이다.
여기서 기억 해야 하는 건, 들어온 신호는 나머지 모든 출력으로 ‘동일하게’ 출력된다는 점이다.

이제 이것들을 수도관이라고 생각해보자.
[가]의 경우 왼쪽 구멍에 물을 부으면 오른쪽으로 나간다. 당연히 오른쪽에서 물을 부으면 왼쪽으로 물이 나간다.
[나]의 경우 왼쪽 구멍에서 물을 부으면 오른쪽 모든 구멍으로 물이 나갈 것이다. 그럼 오른쪽 위의 구멍에 물을 부으면? 역시나 나머지 구멍에서 물이 나올 것이다.
왼쪽 구멍에도 물을 붓고, 오른쪽에서도 물을 부으면? 어디로도 물이 나가지 못한다. (물을 붓지 않는 구멍으로 나가겠지만 그렇다고 치자…)

이게 바로 ‘허브’4(Hub:(특정 장소·활동의) 중심지, 중추, Herb 아니다.)이다.
1. 어딘가에서 신호가 들어오면 자기 자신을 제외한 모든 포트호로 신호를 증폭시켜 내보낸다.
2. 동시에 여러 포트에서 신호가 들어오면 처리하지 못한다.

※ 이것을 브로드캐스트(Broadcast)라고 한다. 신호를

스위칭 ‘허브’

Layer 2

1. Layer 1에서의 장비에 스위칭 기능을 추가한다.
즉, 누군가 신호를 쏘려고 하면 나머지 녀석들은 대기 하게 한다.
2. 각각의 장비에 주소를 부여한다.
즉, 모든 포트에 동일한 신호를 쏘는 것이 아니라 ‘선택적으로’ 신호를 전달한다.
여기에서의 주소는 우리가 흔히 말하는 MAC adress라고 하는 하드웨어의 물리적 주소를 의미한다.

이쯤에서 눈치를 챈 사람들도 있겠지만 허브에 ‘스위칭’ 기능을 추가함으로써 비로소 우리가 아는 ‘스위칭 허브’ 가 된 것이다.

Layer 3

신호가 정상적으로 전달되고, 장비들을 MAC 주소로 식별하여 신호를 전송한다.
L3에서는 TCP 라는 프로토콜을 이용해 신뢰할 수 있는 연결을 만든다

경로 설정을 통해 가장 빠르고 안정적인 경로를 찾아 연결을 수립한다.
(TCP나 신뢰할 수 있는 연결 등이 무엇인지는 따로 포스팅 하도록 하겠다)

Layer 4

신뢰할 수 있는 연결위에 암호화 기능을 추가한다.

애초에 L1은 무엇이고 L5는 무엇이니 하는 설명을 할 것은 아니었으니 이제 데이터가 어떻게 이동하는지 살펴보자. 누군가 한국에서 미국으로 편지를 보낸다고 가정해보자.

  1. 사용자가 편지를 쓰고 – 메시지 생성
    누군가 볼 수 없게 자물쇠가 담긴 상자에 넣고 잠근다. – SSL 암호화 – Layer4
  2. 상자에 우표를 붙이고 주소를 적어서 배달부에게 전달한다. – Layer 3
  3. 우편배달부는 우편물센터로 편지상자를 이동한다. – Layer 2
  4. 우편물센터에서 비행기에 실어 보낸다. – Layer 1
    ~
  5. 미국 우편물 센터에 편지 상자가 도착한다. – Layer 1
  6. 우편배달부는 편지상자를 우편물 센터에서 꺼내온다. – Layer 2
  7. 우편배달부는 편지상자를 수신자에게 전달한다. – Layer 3
  8. 수신자는 열쇠로 편지상자를 연다. – Layer 4

편지에 빗대 설명하자면 위와 같다.
풀어 설명하자면 OSI 7 Layer 참조 모델은 ‘각 영역마다 해야 하는 일의 표준’을 정해 놓은 것이다.

만약 송신자가 편지를 보냈는데 수신자에 도착하지 않았을 경우 편지가 미국의 우편물 센터까지 갔다고 한다면, 내가 보낸 신호가 (L4-> L3-> L2-> L1-> L1) 수신측까지 물리적 연결은 문제가 없다는 이야기 일 것이다.
또 만약 내가 보낸 편지가 수신자에게 전달은 됐는데 편지의 내용을 수신자가 모른다면 자물쇠에 문제가 있거나, 수신자가 열쇠를 가지고 있지 않아서이기 때문일 것이다.

이제 결론.
거창할 것 없다. OSI 7 Layer 참조모델은 ‘네트워크를 통해 통신을 하거나, 하는 프로그램을 만들 때 참고해야 하는 하나의 참고모델‘ 일 뿐이다.
OSI 7 Layer 참조모델을 참고해 만들어진 프로그램과 장비를 이용한다면, 위 편지의 예처럼
– 각 레이어마다 고유한 일을 하므로 하위레이어의 프로그램을 만들지 않아도 되고,
– 만약 문제가 생겼을 경우 어느 Layer에서 문제가 생겼는지만 파악하기도 쉽다.

CentOS 7 네트워크 설정

CentOS 7 리눅스를 예시로 네트워크 설정 (IP관련)을 변경한다.

1. 네트워크 인터페이스 정보 확인
– ip addr 명령을 입력한다. 

[HOSTNAME:/root]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 32:1d:58:2b:56:ef brd ff:ff:ff:ff:ff:ff
    inet 192.168.103.253/24 brd 192.168.103.255 scope global eth0
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 6e:de:37:60:f8:1b brd ff:ff:ff:ff:ff:ff
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:ec:5a:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:ec:5a:ab brd ff:ff:ff:ff:ff:ff

– 또는 ifconfig 명령을 이용한다.

[HOSTNAME:/root]# ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.103.253  netmask 255.255.255.0  broadcast 192.168.103.255
        ether 32:1d:58:2b:56:ef  txqueuelen 1000  (Ethernet)
        RX packets 2882429  bytes 1896744621 (1.7 GiB)
        RX errors 0  dropped 50585  overruns 0  frame 0
        TX packets 694551  bytes 1768919562 (1.6 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
eth1: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 6e:de:37:60:f8:1b  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 406  bytes 32755 (31.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 406  bytes 32755 (31.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:ec:5a:ab  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
virbr0-nic: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 52:54:00:ec:5a:ab  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2. 설정 변경
– 예제에서는 eth0의 설정을 변경할 것이다.
※ 인터페이스의 이름은 시스템마다 다를 수 있다.

[HOSTNAME:/root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet
BOOTPROTO=static
 #static : 고정 IP를 사용할 경우 
 #dhcp : hdcp 서버가 있고 자동 설정을 할 경우.

NAME=eth0
DEVICE=eth0
ONBOOT=yes
 #이 값을 yes로 바꿔야 시스템이 시작될 때 인터페이스가 활성화 된다.
 #일반적으로 여기까지는 자동으로 생성되며 값만 변경한다.

 #dhcp를 사용할 경우 아래 값은 필요 없다.
IPADDR=192.168.103.123
 #사용할 IP 주소. 
NETMASK=255.255.255.0
 #subnet mask. 
 #PREFIX=24 처럼 prefix로 대체할 수 있다.
GATEWAY=192.168.103.1
 #Gateway.

3. 활성화

[HOSTNAME:/root]# service network restart
 # [HOSTNAME:/root]# service network stop
 # [HOSTNAME:/root]# service network start 
 # 정지 후 시작을 할 수 있지만 현재 연결 된 인터페이스일 경우 stop 이후 접속할 수 없다.
 # CentOS 6 이하의 명령어.
[HOSTNAME:/root]# systemctl restart network.service
  # CentOS7 이후. 
  # service network restart 형식으로 수행해도 리디렉션 된다.

4. 확인

[HOSTNAME:/root]# ping 192.168.103.1
PING 192.168.103.1 (192.168.103.1) 56(84) bytes of data.
64 bytes from 192.168.103.1: icmp_seq=1 ttl=117 time=33.2 ms
64 bytes from 192.168.103.1: icmp_seq=1 ttl=117 time=33.1 ms
--- 192.168.103.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 33.207/33.248/33.289/0.041 ms
 # 이 시도가 성공 했을 경우 gateway 까지 연결이 정상이라고 생각해도 된다.
 # 단 gateway에서 ICMP를 허용하지 않을 경우 응답이 없을 수 있다.
[HOSTNAME:/root]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=33.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=33.2 ms
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 33.207/33.248/33.289/0.041 ms
 # 8.8.8.8은 google의 DNS이다. 
 # 이 시도가 성공 했다면 네트워크 설정에는 문제가 없다고 여겨도 된다.

CentOS8의 경우 network.service를 사용할 수 없다.
NetworkManager 서비스를 이용하자.

[HOSTNAME:/root]# systemctl restart NetworkManager.service