CS/Network / / 2021. 2. 5. 16:27

OSI(Open Systems Inter-connection) 7 Layer

출처 http://blog.naver.com/PostView.nhn?blogId=pst8627&logNo=221670903384


Physical Layer(1 Layer): 두 대의 컴퓨터가 통신하려면?

  두 개의 컴퓨터가 전선을 통해서 통신을 한다고 가정해보자. 이 전선은 5Hz ~ 8Hz 범위의 전자기파만 통과시킬 수 있다. 그러나 전송하려는 전자기파의 주파수 범위는 1Hz ~ 10Hz 이다. 그러면 내가 보내고자 하는 데이터는 온전히 전송될 수 있을까? 아마, 5Hz ~ 8Hz 범위의 데이터는 제대로 전송될지 몰라도, 나머지 범위의 주파수는 반대편 컴퓨터에 제대로 전송이 되지 않을 것이다. 즉, 받은 데이터를 디코딩 해보면 아마 알 수 없는 값이 나와서 제대로된 통신을 했다고 할 수 없다. 그렇다면 어떻게 데이터를 안전하게 전송할 수 있을까? 전자기파의 주파수 범위는 0Hz ~ ∞Hz 이므로 어떤 전자기파는 필연적으로 데이터가 전송 중에 손실될 수밖에 없다. 그래서 두 대의 컴퓨터가 통신하기 위해서는 디지털 데이터를 아날로그 데이터로 인코딩해서 보내야 한다. 수신 컴퓨터는 받은 인코딩된 아날로그 데이터를 디코딩해서 디지털 데이터로 변환한 다음 데이터를 해석한다. Physical Layer의 기술은 하드웨어적(회로)로 구현되어 있다. 구체적인 모듈은 PHY 칩으로서 랜카드에 위치한다고 한다.


Data-Link Layer(2 Layer): 여러 대의 컴퓨터를 통신하려면?

  2 계층인 Data-Link Layer를 이해하기 위해서는 네트워크란 권역에 대해서 이해할 필요가 있다. 위 상황을 연장해서 네트워크 권역에 대해서 우선 학습해보자. 이제는 한 대의 컴퓨터가 아니라 여러 대의 컴퓨터가 서로 통신을 하고 싶다. 두 대의 컴퓨터가 통신을 하기 위해서는 서로를 잇는 1개의 전선이 필요했다. 그렇다면 여러 대의 컴퓨터가 통신을 하기 위해서는 서로 서로를 연결하는 전선이 필요한 걸까? 그렇게 한다면 분명 서로서로 통신을 할 수 있을 것이다. 그러나, 두 대 당 하나의 전선이 필요하므로 100 대를 연결하기 위해서는 99+98+97+ ... + 1개의 전선일 필요할 것이다. 이렇게 하면 비용면에서 너무 비효율적이다. 차라리, 하나의 거대한 전선에 여러 대의 컴퓨터를 연결시키는 것이 낫지 않을까? 무슨 말이냐면, 앞서 말한 방식은 두 대의 컴퓨터씩 1개의 전선을 연결하는 방식이기 때문에 여러 명에게 데이터를 보낼 때는 각각의 컴퓨터에게 일일이 보내야 한다면, 후술한 방식은 모든 컴퓨터가 하나의 거대한 전선에 연결돼 있기 때문에 데이터를 전송하면, 의도하든 아니든 간에 전선에 연결된 모든 컴퓨터가 데이터를 수신하게 된다. 여기서 거대한 전선은 허브(Hub)에 대응된다.

  허브에 구역 내(하나의 네트워크, 여기서는 LAN이라고 이해하자)에 있는 100대의 컴퓨터가 연결되어 있기 때문에 컴퓨터 1이 컴퓨터 98에게 메시지를 전송했지만, 허브와 연결돼 있는 모든 컴퓨터는 이 메시지를 수신한다. 이것 역시 송신하는 컴퓨터 입장에서는 그리 달갑지 않은 상황이다. 허브는 의도하지 않은 상대방에게까지 데이터를 보내니 멍청하다. 그래서 등장한 것이 스위치이다. 스위치는 허브의 기능에서 한 가지 기능이 추가되었다. 그것은 바로, 같은 네트워크 안에서 원하는 상대방에게 데이터를 보낼 수 있는 기능이다. 이것을 가능하게 해주는 게 바로 MAC 주소이다.  MAC(Media Access Control Address주소는 LAN 카드에 기입돼 있는 물리적인 주소이다. 처음에 데이터를 보낼 때 컴퓨터 2는 스위치에게 컴퓨터 99에게 데이터를 보낸다는 의사와 함께 데이터를 스위치로 전송한다. 그러면 스위치는 컴퓨터 99에 해당하는 MAC 주소를 통해서 컴퓨터 99에게만 데이터를 전송한다. 즉, 스위치를 사용하면 하나의 네트워크 권역에 속해있는 컴퓨터들은 원하는 컴퓨터들에게만 데이터를 송수신할 수 있다.

  허브나 스위치는 하나의 네트워크 권역에 있는 PC들끼리만 통신할 수 있다. 그렇다면 다른 권역에 있는 네트워크랑 통신하려면 어떻게 해야할까? 예를 들어, 철수는 수원의 네트워크 권역에 속해있고, 영희는 서울의 네트워크 권역에 속해있다. 철수와 영희는 서로 다른 네트워크 권역에 속해서 허브나 스위치로는 통신할 수 없다. 그래서 필요한 게 라우터(Router)이다. 원리는 스위치와 별반 다르지 않다. 라우터는 서로 다른 네트워크 권역을 연결시켜 주는 장비이다. 네트워크 A 권역은 스위치로 연결되어 있고, 네트워크 B 권역 역시 스위치로 연결되어 있다. 이 네트워크 A와 네트워크 B는 라우터로 연결되어 있다. 네트워크 A에 속해있는 철수가 네트워크 B에 있는 영희에게 데이터를 보내려면 스위치 -> 라우터 -> 스위치 순서로 데이터가 전달된다. 여러 권역의 네트워크를 연결하기 위해서는 여러 개의 라우터가 필요할 것이다. 두 개의 권역을 하나의 라우터로 잇고, 이어진 두개의 권역과 또 다른 하나의 권역을 잇기 위해서는 또 라우터가 필요하다. 이렇게 여러 개의 라우터를 이용해서 전 세계의 네트워크가 연결된 것을 인터넷이라고 한다.

라우터 스위치 연결모습(가운데 있는 게 라우터고 라우터랑 연결되 있는 게 스위치다)

  지금까지 2번 째 계층인 Data-Link Layer를 이해하기 위한 사전지식을 학습했다. 다시 하나의 네트워크 안에 스위치로 여러 대의 컴퓨터가 연결되어 있는 상황으로 돌아가보자. 스위치의 기능 덕분에 각각의 컴퓨터들은 특정 컴퓨터에게로 데이터를 전송할 수 있다. 그런데 만약, 여러 대의 컴퓨터가 특정 컴퓨터로 동시에 데이터를 전송한다면 어떻게 될까? 예를 들어, 같은 네트워크에 속해있는 철수, 영희, 민수가 진영이에게 동시에 데이터를 보내는 것이다. 철수는 1101, 영희는 1011, 민수는 0001 라는 데이터를 진영이에게 보냈다고 가정해보자. 진영이는 110110110001 이라는 데이터를 받았지만 누가 누구의 데이터인지 알 방법이 없다. 그래서 철수, 영희, 민수가 데이터를 송신할 때, 수신자 측에서 데이터를 구분할 수 있도록 1101의 데이터 앞 뒤로 1111 1101 0000 이런 식으로 포장해서 보낸다면 진영이 측에서도 여러 개의 데이터가 동시에 와도 구분할 수 있지 않을까? 실제로 이런 방식으로 데이터 포장이 이뤄지지는 않지만, 데이터 간 서로 구분할 수 있도록 데이터는 포장돼서 전송된다. 이런 작업을 프레이밍(Framing)이라고 한다. 1계층과 2계층의 작업을 아울러서 기술해보자면, 먼저 보내고자 하는 송신자 측에서 데이터를 프레이밍(2 계층)한다. 프레이밍된 데이터는 1계층에서 encoder에서 아날로그 데이터로 변조되고 전선을 따라서 전송된다. 수신자는 우선 1계층 decoder에서 아날로그 데이터를 디지털로 디코딩하고 2계층에서 데이터를 감싸고 있는 프레이밍을 제거한다. 그렇다면 2계층 모듈은 어떤 방식으로 구현되어 있을까? 2계층 모듈 역시 1계층 모듈과 마찬가지로 하드웨어, 즉 랜카드에 구현되어 있다.


Network Layer(3 Layer)

  위 템플릿을 하나의 인터넷 생태계에 대응시키고, 철수가 영희에게 데이터를 보내고 싶다고 가정하자. 철수와 영희가 같은 네트워크 권역에 있었더라면 데이터를 보내기 위해서 영희의 MAC 주소만 알고 있었더라면 서로 통신을 할 수 있었을 것이다. 그러나 위 템플릿에서는 철수와 영희는 서로 다른 네트워크 권역에 있으므로 데이터를 보내기 위해서는 철수는 영희의 IP 주소를 반드시 알고 있어야 한다. 예를 들어, 우리가 네이버에 접속할 때는 주소창에 www.naver.com을 을 입력하는 행위가 사실은 IP를 입력하는 행위 (DNS에 의해서)와 마찬가지다. 이제 우리는 철수가 영희에게 보내고자 하는 데이터와 영희의 IP 주소를 결합하여 패킷이라고 부를 것이다. 이제 철수가 속해있는 라우터 1은 라우터 2에게 데이터 패킷을 보내야 할지, 라우터 3에게 데이터를 보내야 할지 판단하기가 어렵다. 결론부터 말하면 라우터는 어느 라우터에게 데이터를 전송할지를 라우터의 알고리즘에 의해서 결정한다. 이 부분은 해당 포스트의 주제에서 벗어나므로 궁금하면 라우팅에 대해서 구글링 해보길 바란다.

  데이터 전송 과정을 앞서 배운 1, 2계층과 함께 풀어보자면 다음과 같다.

1) 철수는 보내고자 하는 데이터를 IP와 함께 패킷으로 감싼다(3계층)  

2) 패킷에 구분자를 붙인다(2계층-랜카드)

3) 패킷을 아날로그 신호로 변조해서 전송한다.(1계층-랜카드 PHY)

4) 철수가 속해있는 네트워크의 스위치는 해당 주소가 현재 권역에 없으므로 라우터에게 전달한다.

5) 철수가 속해있는 네트워크의 라우터는 라우터 길찾기 알고리즘에 의해 영희가 속해있는 router 3으로 패킷을 보낸다.

6) 라우터 3은 받은 패킷을 영희가 속해있는 네트워크의 스위치에게 전송하고 스위치는 해당 패킷을 영희에게 전송한다.

7) 패킷를 받은 영희는 아날로그 신호를 디지털로 변조한다(1계층)

8) 구분자를 제외한 오리지널 패킷 데이터를 추출한다(2계층)

9) 패킷에서 IP 주소를 제외한 데이터를 추출한다.(3계층)

  네트워크 레이어(Network Layer)에서는 인터넷 환경에서 원하는 데이터를 목적지까지 전송하기 위해서 IP 주소를 이용해서 길을 찾고(Routing) 수신 받을 컴퓨터가 속해있는 라우터에게 데이터를 전송(Forwarding)한다. 그렇다면 네트워크 레이어는 어디에 구현되어 있을까? 1계층과 2계층은 하드웨어 단에서 구현되어 있었던 반면, 네트워크 레이어부터는 소프트웨어로 구현되어 있다. 즉, Network Layer는 OS의 커널에 소프트웨어로 구현되어 있다.


Transport Layer(4 Layer)

  3계층까지는 데이터를 어떤 컴퓨터에게 전송해야 될지를 고민했다면, 4계층에서는 컴퓨터의 어떤 프로세스에게 데이터를 전송해야 하는지를 결정한다. 우리의 컴퓨터에는 카카오톡, Zoom, 크롬, 디스코드, 메모장같이 여러가지 프로세스가 실행되고 있다. 그렇다면 영희가 받은 데이터는 어느 프로세스에서 받아야 하는 데이터일까? 예를 들어, 철수와 영희가 카카오톡으로 채팅을 하고 있다고 가정해보자. 철수는 영희에게 Hello World 라는 메시지를 전송했고 스위치->라우터->라우터->스위치를 통해서 영희 PC의 카카오톡 창에 철수가 보낸 메시지가 도착했다. 왜 하필 많은 프로세스 중에 카카오톡에 도착했을까? 줌도 있고 메모장도 있고 많은 프로세스가 현재 영희 PC에서 실행되고 있는데 말이다. 결론부터 말하면 프로세스들은 데이터 통신을 할 때 포트번호(Port Number)라는 걸 가져야 한다. 포트 번호란 하나의 컴퓨터 내에서 동시에 실행되고 있는 프로세스들이 서로 겹치지 않게 가져야 하는 정수 값이다. 포트 번호의 범위는 0~65535의 값으로서 그 이상의 프로세스들은 하나의 컴퓨터 내에서 실행될 수 없다. 그러나 현실적으로 65535 이상의 프로세스들이 동시에 실행될 이유는 없으니 이 문제는 차치하도록 하자. 정리하자면, 데이터를 전송하는 철수는 영희의 IP 주소 뿐만 아니라 영희의 PC의 어떤 프로세스가 받을지를 결정하는 포트번호까지 알고 있어야 한다. 그래야 영희에게 데이터가 전송된 후에 포트번호를 이용해 특정 프로세스에게 데이터를 전달할 수 있다. 즉, Transport Layer는 포트 번호를 사용하여 도착지 컴퓨터의 최종 도착지인 프로세스까지 데이터를 도달하게 하는 모듈이다. Transport Layer도 3계층인 Network Layer와 마찬가지로 OS 커널에 소프트웨어적으로 구현되어 있다. 1계층에서 4계층까지 데이터를 송수신 하는 과정은 다음과 같다.

 

1) 보내고자 하는 데이터를 목적지 프로세스의 포트 번호와 함께 감싼다(인코딩). (4계층)

2) <포트 + 데이터>에 IP주소를 첨가해서 <IP주소 + <포트 + 데이터>> 패킷을 만든다(인코딩).(3계층)

3) 3계층에서 만들어진 데이터를 구분자를 붙여서 프레이밍(Framing)한다(인코딩). (2계층)

4) 전송할 패킷을 디지털에서 아날로그로 변조한다(인코딩). (1계층)

5) 스위치는 전송할 패킷의 목적지가 현 네트워크 상에 없으므로 라우터에게 전달한다.

6) 라우터는 데이터 패킷을 목적지 라우터에 전달한다.

7) 라우터는 목적지 컴퓨터가 속해있는 네트워크 스위치에게 해당 데이터를 전달한다.

8) 스위치는 목적지 컴퓨터에게 데이터를 전달한다.

9) 영희의 컴퓨터는 도착한 데이터를 아날로그에서 디지털로 변조한다(디코딩). (1계층-PHY)

10) 디지털로 변조한 데이터에서 앞 뒤 구분자를 제거한다(디코딩). (2계층-랜카드)

11) 패킷에서 IP 주소 제거(디코딩). (3계층)

12) 데이터 패킷에서 포트번호를 추출하여 해당 포트번호와 대응되는 프로세스에게 데이터를 전달한다(디코딩).


Application Layer(Seesion Layer(5)+ Presentation Layer(6)+ Application Layer(7))

OSI 7 Layer vs TCP/IP Layer (왼쪽 그림) / OSI 모델 -> (구)TCP/IP 모델 -> (현)TCP/IP 모델 (오른쪽 그림)

  앞선 설명에서 우리는 1 ~ 4 Layer까지 이해했다. 그런데 갑자기 왜 7 Layer인 Application Layer가 등장하는지 의아할 수 있다. 네트워크 통신을 체계적으로 다루고 있는 ISO 표준은 개방시스템 상호연결 (OSI) 모델 이다. OSI 모델은 1984년에 정의 되었지만 현재 사용되는 네트워크 프로토콜은 TCP/IP 모델이다. OSI 모델이 표준이 되기는 하지만 실제로 구현된 예는 없다. 현대의 인터넷이 OSI 7 Layer 모델을 따르지 않고 TCP/IP 모델을 채택한 이유는 OSI 모델이 TCP/IP 모델과의 시장 점유율에서 뒤졌기 때문이다. 그러나 위 템플릿에서도 알 수 있듯이, 1~4 계층은 OSI 모델과 TCP/IP 모델이 완전히 동일함(Network Access Layer도 Data-Link와 Physical Layer로 이루어져 있다)을 알 수 있다. 그래서 1~4 계층은 OSI 모델로 설명한 것이고 Application Layer는 3개의 레이어 단을 합친 Session + Presentation + Application Layer = Application Layer 로 설명하겠다.

  그래도 3개 계층이 무엇인지는 알고 넘어가는 게 좋으니 간단히 짚고 넘어가자. 5계층인 Session Layer는 연결에 대해서 관장한다. 예를 들어, 전화처럼 쌍방이 동시에 데이터를 주고 받을 것인지, 아니면 무전기처럼 한쪽씩 서로 번갈아서 통신할 건지, 아니면 일방적으로 데이터를 받기만 할 건지 같은 방법을 결정하는 계층이다.

  6계층인 Presentation Layer데이터를 표현하는 방식을 정하는 계층이다. 서로 다른 시스템이 통신을 하는 데, 수신 측에서도 문제없이 데이터를 받아야 하기 때문에, 공통된 표준 형식에 맞춰 데이터를 변형하여 전송한다. 그래야 상대방도 표준 형식에 따라서 구조를 확인하고 수신자 측의 시스템 환경에 맞춰 디코딩해서 해석할 수 있다. Application 계층에서 Data를 이해할 수 있게 응용프로그램에 맞춰 변환하는 것이다. 예를 들어, 상대방으로부터 jpg 형태의 사진 데이터를 수신받았는데, txt 파일로 해석하면 Application 계층에서 사진 데이터를 해석할 수가 없다. 다시 정리하자면, 표현 계층은 응용 계층으로부터 전달받거나 전송하는 데이터의 인코딩 및 디코딩이 이루어지는 계층이다. JPEG, TIFF, GIF, MPEG 같은 매우 다양한 포맷으로 구분된다.

  마지막 7계층인 Application Layer는 사용자와 직접적으로 소통하는 계층이다. 데이터가 표시될 UI라고 생각하면 편하다. 4계층인 전송 계층에서 예에서 철수가 보낸 데이터는 영희 PC의 카카오톡 프로세스에 전달됐다. 여기서 카카오톡은 Application 계층에 해당된다. 

  5, 6, 7 계층의 개략적인 내용을 알았으니 TCP/IP Layer에서 사용되는 Application 계층(Session + Presentation + Application)에 대해서 알아보자서버나 클라이언트 응용 프로그램이 이 계층에서 동작한다. 우리가 알고 있는 브라우저나 텔넷같은 서비스가 이 계층에 동작하며, 동작하기 위해서는 전송계층의 포트번호를 사용한다. 가장 많이 사용되는 예가 TCP/IP 소켓 프로그래밍이다. TCP/IP 소켓 프로그래밍이란 운영체제의 전송 계층에서 제공하는 API를 활요해서 통신 가능한 프로그램을 만드는 것을 말한다. 대표적인 프로토콜인 HTTP 프로토콜로 다음 예를 보자. 

1) HTTP 인코더가 보내고자 하는 데이터에 아래와 같은 데이터(실제로는 더 많다)를 함께 인코딩한다. (5~7계층)

       프로토콜과 응답코드 : ( HTTP/1.1 200 OK )

          날짜 : ( Date: Sun, 12 Aug 2018 11:30:00 GMT )

          서버 프로그램및 스크립트 정보 : ( Apache/2.2.4 (Unix) PHP/5.2.0 ) 

          컨텐츠의 마지막 수정일

          캐쉬 제어 방식.

          컨텐츠 길이.

2) 위 데이터에 포트 번호를 붙여서 인코딩한다. <<http data + data> + port> (4계층)

3) 어드레스 번호를 붙여서 다시 인코딩한다. <<<http data + data> + port> + address> (3계층)

4) 프레이밍(Framing)을 한다. (2계층)

5) 패킷 데이터를 아날로그 데이터로 변조하고 전송한다 (1계층)

  

 

'CS > Network' 카테고리의 다른 글

DNS란? (Domain Name System)  (0) 2021.02.01
File upload from local to aws ec2 instance  (0) 2020.12.13
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유