티스토리 뷰

Skill/Programming - Network

1. OSI 7계층

gyulee0220 2019. 2. 17. 21:24

 

  우리는 웹사이트에서 원하는 정보를 얻기 위해 웹브라우저에 주소를 쳐서 들어간다. 물론, 세상이 너무 좋아져서 도메인이라고 하는 주소를 치지 않더라도 원하는 정보를 쉽게 가져올 수 있다. 이 글을 읽기 위해 웹 브라우저 위에 있는 주소를 입력한 사람은 거의 없다. 우리가 인터넷이 연결된 환경에서 주소를 입력하면 총 7계의 단계를 거쳐 해당 정보가 있는 지점에 도달하게 된다. 이 각각의 계층을 OSI 7계층 이라고 하며, 앞으로 진행할 네트워크 프로그래밍을 알아가는데 있어 반드시 알아야 할 기본 정보와도 같다.

 

 

 

 

 

1. OSI 7계층이란?

  OSI는 Open Systems Interconnection 의 줄임말로, 국제 표준 기구 ISO에서 지정한 컴퓨터 프로토콜 네트워킹에 관한 표준이다. 즉 우리가 인터넷 환경 내에서 자기가 원하는 대로 데이터를 주고 받을 수 있을것이다. 하지만, 모든 사람들이 자신만의 방식으로 네트워킹을 진행한다면, 인터넷 환경은 복잡하고 느릴것이다. 또한, 우리는 원하는 정보를 얻기위해 나만의 프로토콜을 규정해야하는 불편함이 소요된다. 이는 우리가 상상하는것 이상으로 불편할 것이다.

  조금 이해가 안된다면, OSI 7계층에는 TCP/IP 프로토콜도 포함된다. 이 프로토콜이 존재하지 않는다면, 우리가 지금 사용하고 있는 IP 주소 체계가 없다는 것을 의미하고 원하는 정보를 얻기위해 도달할 방법도 존재하지 않는 것이다. 그냥 인터넷 세상을 목적없이 떠돌아가 운 좋게 원하는 정보를 오기를 기다려하 할 것이다. 현재 인터넷 체계에서 그런 방식으로 소통한다면 웹사이트 하나를 열떄까지 100년은 걸리지 않을까 추측해본다.

  그래서 우리는 인터넷 환경에서 통신하기 위해 많은 사람들과 통신 방식에 대한 약속을 해야 했다. 이것이 '프로토콜'이다. 그리고 이 프로토콜을 7개의 계층으로 묶어서 통신을 체계화 했고, 그에대한 표준이 바로 OSI 7 계층이다.

 

 

2. 각 OSI 7계층

  집에 새로 데스크탑 컴퓨터를 샀거나, 노트북을 들고 회사나 학교에서 인터넷에 접속하려고 한다. 이 상황에 빗대어 각각의 7계층이 어떻게 동작하는지는 살펴보자.

 

2-1. Physical Layer (물리 계층)

  어마어마하게 방대한 인터넷 환경 속에서 편리한 소통을 위해 우리는 네트워크 환경을 세분화 하게 된다. 우리가 집을 쉽게 찾기 위해 서울과 경기도, 그리고 서울시 중구, 성북구로 나누듯이 말이다. 그리고 중구의 행정 편의성을 위해 행정을 총괄하는 중구청이 있다. 물리 계층 역시 이와 비슷하다. 당신이 집에 있는 랜선을 연결하는 즉시 해당 랜선을 관리하는 통신사 (SKT, KT...)에서 나눈 네트워크 단위 안으로 들어갈 것이고, 해당 통신을 관리하는 기지국에 소속이 되는 것이다. 얼마전 발생한 KT 아현지사 화재로 인해 마포구 일대의 컴퓨터 망이 마비된 것도 이와 같은 원리이기 때문이다. 이렇게 나눈 통신망을 근거리 통신망이라는 의미로 LAN(Local Area Network)라고 하고, LAN에서 가장 많이 사용되는 규격이 바로 이더넷(Ethernet)이다. 대학교에서 교내 WI-FI를 키는 순간 바로 교내 이더넷이 접속하는 것이고 이 이더넷을 통해 당신은 인터넷 환경에 들어오게 된 것이다. 같은 핸드폰으로 학교 밖에 있는 카페에 접속하게 되었다면, 해당 카페에서 제공하고 있는 네트워크 제공사의 이더넷에 들어가게 되는 것이다.

 

  앞서 서울시 중구에는 중구청이 있었다면, 이더넷에는 허브가 있다. 이더넷으로 연결된 수많은 각각의 네트워크를 하나로 묶어주는 역할을 한다. 우리가 집에서 꽃아서 쓰게 되는 랜선이 바로 허브에 연결되어 있다. 이런 허브는 물리 계층에서 작동하는 대표적인 장비다. 허브의 또하나의 특징은 플로딩(Flooding) 작업이다. 하나의 PC에서 데이터를 전송해 허브로 흘러들어가게 된다면 이 허브는 목적지 조사를 하지 않고, 그냥 데이터를 모든 디바이스에 전송한다. 허브가 이렇게 작동 하는 이유는 빠른 송신을 위해서이다. 허브에서 만약 목적지에 대한 조사를 하고, 원하는 쪽으로만 데이터를 전달하게 되면 허브는 분명 과부화에 걸릴것이다. 그래서 그냥 모든 PC에 데이터를 흘리고, 해당 PC에서 자신에게 온 메세지가 맞다면 이를 받아들이고, 아니면 그냥 무시하게 되는 것이다.

 

  물리 계층에서 사용되는 또 하나의 장비는 바로 리피터이다. 데이터 송신 길이가 길어짐에 따라 우리가 보내는 물리적 신호는 점차 약해지게 된다. 데이터 전달을 위해 우리는 앞서 설명한 LAN선을 통해 데이터를 전기신호로 바꿔 전송하는데 이 물리적 전기 신호는 송신 길이가 길어지면 전기 저항에 의해 메세지가 약해지게 되어 최악의 경우 도달 시, 데이터를 받는 쪽에서 알아챌수 없을 정도의 약한 신호가 되어 우리가 원하는 데이터 전송이 안되는 경우도 간혹 발생한다. 이를 방지하기 위해 우리는 리피터(Repeater) 장비를 사용하나. 높은 산에 통신을 연결하기 위해 통신사에서 세워 놓은 증폭 장치도 일종의 리피터이다. 이 리피터 역시 플로딩으로 작동하기에 하나에 리피터에 연결된 모든 장비가 같은 데이터를 듣게 된다.

 

  물리적 계층의 단위는 Signal이다. 리피터나 허브에 데이터가 들어오게 된다면, 이는 전기 신호에 해당하기 떄문이다. 물리 계층에서는 네트워크 상에서 나중에 나올 데이터 링크 계층의 전송을 받아 어떤 물리적 연결로 설정하는 지를 정의하는 계층이다. 네트워크 송수신이 물리적 계층에서 문제가 발생했다면, 당신은 LAN선이 손상이 된건 아닌지 혹은 허브와 리피터의 문제가 있는 것은 아닌지 판단해보아야 한다.

 

2-2. Data Link Layer (데이터 링크 계층)

  앞서 허브에서 전기 신호를 플로딩으로 전송한다고 말했고, 신호를 받는 측에서 자신에게 온 정보가 맞는지 확인해 맞는 경우 해당 신호를 받아 들일 지 결정한다. 그렇다면, 자신에게 온 데이터인지 어떻게 판단 할 수 있을까? 이 작업을 수행하는 계층이 바로 데이터 링크 계층이다. 물리계층에서는 신호의 내용을 전혀 확인하지 않는다. 데이터 링크에서는 앞서 온 신호를 Frame으로 변환할 수 있다. 이 Frame에는 MAC Address라는 고유의 주소가 존재한다. 우리는 컴퓨터를 사거나 서버를 사게 되면 고유의 네트워크 카드가 존재한다. 이 네트워크 카드가 가지고 있는 물리적 주소가 바로 MAC Address이다.

 

  물리적 계층의 역할이 전기 신호의 내용은 관심 없고 그냥 잘 전달했다면, 데이터 링크는 이와 다르게 2가지 역할을 수할 할 수 있어야 한다. 첫번쨰가 앞서 말한 MAC Address를 통해 주소 할당이 가능해야 한다. 물리적 계층에서 온 신호를 우리가 원하는 MAC Address에 제대로 전달 해줄 수 있어야 데이터 링크 계층의 역할을 한 것이다. 이 기능을 수행하는 대표적 장치가 '스위치(Switch)'이다. 스위치의 역할은 전기적 신호를 받아 MAC Address를 살펴보게 되고 제대로 데이터가 원하는 네트워크 카드에 안착 할 수 있도록 지정해주는 작업을 수행한다.

 

  데이터 링크 계층의 두번쨰 역할을 물리 계층에서 발생한 오류를 감지할 수 있어야 한다. 앞서 말해듯이 물리 계층에서는 신호 내용에 대한 체크를 하지 않으므로, 만일 신호 증폭에 실패해 데이터를 받지 못하게 된다해도 이를 알 방법이 었다. 그렇기에 물리적 계층에서 데이터의 오류가 발생한다면 이를 데이터 링크 계층에서 알아차리고 MAC Address에 써있는 주소에게 말해 데이터를 다시 보내라고 안내를 해주어야 한다.

 

  P2P (Peer-to-Peer) 방식 역시 데이터 링크 계층에 해당된다. 직관적으로 생각 해보면 당연하다. Peer to Peer에는 두개의 네트워크만 존재 하고, 데이터를 직접 연결하면 된다. 네트워크 카드의 주소만 알면 얼마든지 데이터를 전송할 수 있기 떄문이다.

2-3. Network Layer (네트워크 계층)

  P2P 처럼 단순한 네트워크라면 데이터 전송 작업은 간단하겠지만, 네트워크 환경은 완전 다르다. 서울역에 있는 당신이 용산역에 가기 위해서는 1호선을 타면 끝난다. 이것이 P2P라면 네트워크 계층은 상계역에서 목동역까지 이동하는 작업을 정의하는 것이다. 4호선 상계역의 지하철을 탄 당신은 5호선 목동역에 도달하기 위해 몇번의 환승을 해야하며, 어느 정거장에서 환승 할지도 결정해야 한다. 이더넷을 통해 인터넷에 들어온 당신을 이제 목적지 네트워크가 존재하는 곳까지 어떤 노드를 거쳐 도달할 지 정해야 한다. 이 흐름 제어 역할을 하는 장비가 바로 '라우터(Router)'이다. 라우터에 도달한 정보 들은 라우터가 정해주는 방향으로 움직이게 된다. 라우터는 네트워크 상황을 판단해 데이터를 어느 곳에 전달 할지 결정한다. 물론, 라우터 역시 모든 네트워크 정보를 알 수 없다. 자신이 바라보고 있는 데이터 쪽만 어느정도 추측해서 아는 것 뿐이다. 이에 대한 자세한 방법은 다음기회에 설명 해보도록 하겠다. 우리가 집에서 사용하고 있는 WI-FI 공유기 역시 일종의 라우터다.

 

  라우터가 하는 라우팅을 위해 모든 네트워크 접속자는 일종의 주소를 가지고 있어야한다. 이 주소가 바로 IP Address이다. 사실상 우리가 현재 사용하고 있는 인터넷 모델은 TCP/IP 모델이고, 네트워크 사용자 모두가 고유로 가지는 주소이다. MAC Address는 네트워크에 접속 가능한 디바이스가 가지고 있는 네트워크 카드가 가지고 있는 주소라면 IP 주소는 유동적이다. 당신이 노트북을 들고 어디를 가서 접속을 하든 MAC Address는 바뀌지 않는다. 하지만 노트북을 집에서 LAN 선에 연결 할 수도 있고, 카페에가 WI-FI에 접속을 할 수도 있다. IP 주소는 네트워크에 접속하게 되는 순간 부여 받게 되는 유동적 주소이다. MAC Address는 디바이스에 부여 받게 되는 주소고 IP 주소는 네트워크에 부여받는 주소다.

 

  네트워크 계층에서 수행하는 작업들은 다음과 같다.

 

- 라우팅 : 라우팅 테이블을 통해 Packet의 다음 경로를 어디로 할지 정해주는 작업

- 포워딩 : 라우팅 작업을 통해 결정 된 경로로 데이터를 Packet 구조를 만들어 다음 라우터로 Packet으로 전달하는 작업

 

 네트워크 계층에서는 앞서 Data Link에서 받은 Frame을 Packet으로 관리한다. Data Link에서 MAC를 보고 데이터를 전달하고 수신 되었다면 MAC 주소는 이제 쓸모 없어 졌다. 다음 라우터 혹은 디바이스를 위한 MAC 주소가 중요하기 떄문에 이를 위해 새로운 Packet을 만들어 내야 하는 데 Frame을 Packet으로 나누고, IP 주소를 확인한다. 라우터의 라우팅 테이블은 IP 주소에 따라 어떤 MAC 주소를 부여해야 할지가 정의 되어 있다. 이렇게 만들어진 새로운 Packet을 네트워크 카드에 전달해주는 것이 네트워크 계층의 역할이다.

 

2-4. Transport Layer (전송계층)

  전송계층에 주 목적은 양 끝에 있는 두 사용자간에 데이터를 정확하게 전달할 수 있는가이다. 네트워크 계층을 통해 내가 전송한 데이터가 네트워크 속에서 수많은 노드를 거치더라도 보내려는 데이터의 정확성을 반드시 보장 되어야 할 것이다. 네트워크 계층에서 전송한 Packet이 IP 주소를 통해 원하는 네트워크에 도달 했다면, Packet에서 IP 부분을 제외한 Segment의 적합성을 봐야 할 것이다. 즉, 전송계층에서의 데이터 단위는 '세그먼트(Segment)'이다.

 

  과거에 송신은 '회선 교환 (Circuit Switching)' 방식 에서는 전송계층이 굳이 필요하지 않았다. 회선 교환 방식에서는 우리가 데이터 전송을 원하는 두 지점의 회선 경로가 미리 정해진 방식이다. 그렇기 때문에 데이터가 중간에 바뀔 염려는 없지만, 해당 회선에 손상이 생기면 데이터를 주고받지 못하는 문제가 발생 했다. 하지만, 지금 인터넷 환경은 '패킷 교환 (Packet Switching)' 방식으로 바뀌었다. 경로가 정해지지 않은채로 데이터를 전송하면 네트워크 환경 안에서 임의의 경로에 따라(정확히 라우터에 존재하는 라우팅 테이블에서 결정해주는 정보에 따라) 움직이게 되었다. 일부 회선이 손상 되더라도 데이터가 송신된다는 장점은 존재했지만, Packet의 정확성이 문제였다. 따라서 Packet의 정보 명확성을 입증할 프로토콜의 필요성이 대두 되었고, 이로 인해 생겨난 프로토콜이 바로 TCP와 UDP이다.

 

  우선 TCP (전송 제어 프로토콜, Transport Control Protocol)에 대해 알아보도록 하자. 우리가 네트워크를 어렵다고 생각하는 이유는 용어가 어려워서이다. 네트워크를 실생활에 비유한다면 정말 이렇게 쉬운 이론이 아닐 수가 없다. 우리가 누군가에게 메세지를 전달하고 싶어 전화를 이용하곤 한다. 누군가에게 전화를 거는 상황에 TCP를 비유해보자. 우리는 실제로 얼굴을 보면서 말을 하는 것이 아닌데 내가 정보를 전달하고자 하는 상대방을 어떻게 아는가? 연락처에 저장된 그 사람의 전화번호를 누르는 작업으로 시작된다. 이 과정을 웹 브라우저에 정보를 입력하는 작업이라고 생각하자. 하지만, 이것만으로 그사람이라고 우리가 확신하는가? 그렇다고 느낄지 모르겠지만 사실은 아니다. 왜나하면 전화를 받는사람이 내가 연락을 하고자 하는 그 사람이라고 정확히 알 수는 없다. 그래서 우린 목소리를 듣고 내가 원하는 사람이 맞는지 확인한다. 때론, 전화기에 뻔히 이름이 나오는데도 "나 누군데, 누구 맞지?" 혹은 "여보세요?" 같은 말을 통해 그사람이 맞는지 한차례 더 확인을 한다. 네트워크 상에서 이런 작업을 TCP라고 한다.

 

  TCP는 Three Way Handshake로 이를 정의한다.

 

1) 내가 통신을 원하는 대상에게 통신을 원한다는 메세지를 보낸다. (SYN)

2) SYN을 받은 대상이 통신 준비가 되었다는 정보를 송신자에게 보낸다. (SYN-ACK)

3) SYN-ACK 를 잘 받았다고 다시 한번 수신자에게 확인을 한다. (ACK)

 

  이렇게 두 네트워크가 연결이 되었다면 이제 데이터를 서로 주고 받으며 정확성이 보장된 데이터를 주고 받게 된다. TCP 방식에 대한 이야기는 분명 나중에 또 할 기회가 있을 테니 그 떄 더 자세하게 살펴보도록 하자. 즉, TCP의 가장 큰 특징은 데이터의 정확성 보장이다. TCP에서는 내가 보낸 데이터가 얼마나 전송 되었고, 어느부분이 누락 되었는지 까지 판단해 양자간의 정확한 전송이 보장된다. TCP로 송신한다면 오류 복구는 물론이고, 흐름 복귀와 중복 제어까지 가능하다.

 

  반면 UDP (사용자 데이터그램 프로토콜, User Datagram Protocol)은 신뢰성 보다는 신속함이다. 앞서 설명한 과정 다 필요없이 그냥 IP 주소 보고 데이터를 마구잡이로 보내는 과정이라고 생각하면 된다. 굉장히 쓸모없는 프로토콜처럼 보이지만, UDP는 미디어 전송에서 빛이 발한다. 우리가 스트리밍 서비스를 이용하고 있는데, TCP로 송신한다고 하자. 일단, TCP의 경우 헤더의 길이가 UDP에 비해 월등히 크다. 양자간 주소 뿐만 아니라. 내가 보내는 데이터의 부분 등 헤더의 정보가 많다. UDP의 헤더에는 목적지 주소와 실데이터만 존재한다. (체크섬 제외) TCP로 미디어 송신 했다간 넷플릿스 가격 지금의 3배 이상 뛸지도 모른다. 또한, 미디어 정보는 중간에 몇개 누락되도 대중 화면 잔상 이용해서 늘여도 사용자 입장에선 데이터 누락이 발생 되었는지 눈치도 못 챌 정도로 잘 보여주게 된다.

 

2-5. Session Layer (세션 계층)

  앞서 전송 계층을 통해 두 네트워크간의 연결이 성립되었다면, 우리는 이를 네트워크 세션이 생성되었다고 표현한다. 만약 TCP로 연결이 성립되면 TCP세션이라고 한다. 이제 형성된 세션간의 데이터 송수신을 어떻게 관리 할지에 대해 정의해야 하고 이것이 세션 계층에서의 역할이다. 한번 연결된 세션에서 향후 표현 계층과 응용 계층에서 어떻게 사용자에게 정보를 보여줄 것인지, 형성된 세션이 끊기지 않도록 어떻게 관리할 것인지 정의하는 것이 세션 계층의 역할이다.

 

  세션 계층의 역할은 아래와 같다.

 

- 세션 설정 및 해제 방법 정의 (인증 및 허가도 포함)

- 세션 다중화 / 단일화 : 통신 효율을 위해 세션을 다중화 할지 단일화 할지 결정

- 송수신 방식(duplex), 반이중 방식(half-duplex), 전이중 방식(Full Duplex) 결정

- 세션 회복

 

  운영체제를 공부한적이 있는 사람이라면 리눅스를 사용할 떄 원격 접속을 위해 SSH를 사용하게 되는데 SSH가 세션계층에서 작동하는 대표적인 프로토콜이다.

 

2-6. Presentation Layer (표현 계층)

  표현계층에서는 전달 받은 네트워크 메세지를 사용자가 볼 수 있도록 만드는 기능을 한다. 지금까지 누군가가 보낸 메시지를 Frame, Packet, Segment로 포장되어서 전달이 되었다면 이제 이 포장지를 뜯어 사용자에게 전달하는 기능을 한다. 표현계층에서 진행하는 3가지 기능을 다음과 같다.


- 수신자 장치(노트북, 모바일...) 에 적합한 어플리케이션으로 노출 시킬 수 있도록 데이터를 해석

- 데이터 압축

- 데이터 암호화 / 복호화


  응용계층에서 우리는 자연어 혹은 상용 어플리케이션에서 제작 된 데이터를 받게 되거나 이에 맞게 전송을 해주어야 한다. 표현계층은 우리가 응용계층에서 메세지를 볼 수 있도록 진행하는 사전 작업이자, 네트워크 환경으로 데이터를 넘기기 위해 진행하는 사전 작업으로 불 수 있다. 대표적으로 MIME(Multipurpose Internet Mail Extensions)가 표현계층에서 작동한다. 

 

2-7. Application Layer (응용 계층)

  응용계층은 우리에게 친숙하다. 네트워크 기능을 작동하는 모든 프로그램이 응용 계층에서 하는 작동이다. 우리가 쓴 웹 브라우저는 물론이고, 지금 글을 인터넷에 올리는 행위, 멀티 게임을 하기위해 접속하는 행위 모두 응용 계층이다. 사용자가 원하는 정보를 얻거나 보내기 위해 메세지를 만들어 보내는 작업을 의미한다. 결국 간단히 표현하면 우리가 네트워크로 접속하기 위한 사용자 인터페이스를 의미한다. 


  응용계층에는 많은 프로토콜이 존재한다. 아래가 대표적은 응용계층의 프로토콜이다.


- 텔넷(TELNET) : 원격지의 호스트 컴퓨터에 접속하기 위해 사용하는 인터넷 프로토콜

- DNS (Domain Name System) : 호스트의 도메인 이름을 호스트의 네트워크 주소로 바꾸거나 반대의 변환을 수행하는 프로토콜

- FTP (File Transfer Protocol) : 서버/클라이언트 사이의 파일 전송을 위한 프로토콜

- HTTP (Hyper Text Transfer Protocol) : WWW 상에서 정보를 주고받을 수 있는 프로토콜, HTML 문서를 주고 받는 역할

- SMTP (Simple Mail Transfer Protocol) : 인터넷에서 이메일을 보내기 위해 사용하는 프로토콜



'Skill > Programming - Network' 카테고리의 다른 글

6. 스레드 폴링, 콜백  (0) 2019.05.07
5. 스레드(Thread)  (0) 2019.04.27
4. 프로세스 관리 (Process Control)  (1) 2019.04.07
3. 프로세스(Process)  (0) 2019.03.27
2. 스트림 (Stream)  (0) 2019.03.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
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
글 보관함