본문 바로가기

CS BASIC/네트워크와 정보통신

[네트워크] OSI 7계층과 TCP/IP 모델

개요

오늘은 OSI 7계층과 함께 TCP/IP 모델에 대해서 알아보도록 하겠습니다.

OSI 7 계층은 컴퓨터 간의 정보를 주고 받는 작업을 위해 설계된 대규모 '통신용' 소프트웨어의 아키텍처입니다.

따라서, 이러한 거대한 규모의 프로그램의 '구조'를 설명하는 것이 OSI 7 계층이며, 

이는 곧 소프트웨어 디자인인 Layered 디자인의 한 종류라고 할 수 있습니다.

오늘은 이중에서도 현재 범용적으로 사용중인 TCP/IP 모델에 대해서 알아보도록 하겠습니다.

 


물리 계층, Physical layer

컴퓨터는 기본적으로 0과 1로 이루어진 데이터를 바탕으로 데이터를 생성하거나 해석합니다.
이때 약간의 물리학 지식을 더하자면,  컴퓨터에게 데이터를 보내기 위해서는 과거에는 구리선 오늘은 광케이블을 통해서 
멀리 떨어진 컴퓨터에 데이터를 보내야 합니다.

이미지 출처 : http://makeshare.org/bbs/board.php?bo_table=arduino&wr_id=83


전기 신호를 통해 데이터를 보낼 때, 아날로그 신호를 이용하게 되면 그 파형은 사인함수의 곡선을 닮습니다.

하지만, 실제로 아날로그 데이터를 생성해서 데이터를 보낸다면 그 파형은 정말 '이상적으로' 사인 곡선을 닮을까요?

 

정답은 아니다. 입니다.

 

실제로는 여러가지 물리학적인 법칙 및 환경 조건에 따라 결코 '이상적으로' 반듯한 사인 곡선은 생성하기 어렵습니다.

그리고 이렇게 '자연스럽게' 생성된 아날로그 곡선은 그 주파수의 범위가 다양하기 때문에

오늘날 사용되는 데이터 전송용 '케이블'에서 이를 수용하지 못할 수도 있습니다.

 

즉, 데이터를 아날로그 데이터로 만들어서 정성스레 보낸다고 해도 

데이터가 흘러가는 도중 어떤 '케이블'을 만나느냐에 따라 시그널이 손상될 수 있다는 것입니다.

 

극적인 예를 하나 들자면, 'ABCD' 라는 데이터를 한국에서 미국으로 보낸다고 했을 때, 

그 값은 미국에서 '1234'라는 데이터로 잘못 해석될 수 있다는 의미입니다.

따라서, 데이터를 보낼 때에는 그 신호를 비교적 범위가 명확한 '디지털 신호'로 변환하여 전송하게 됩니다.

신호를 보낼 때 여러가지 잡음과 섞여 원래의 데이터가 손상되는 경우를 방지하고자, 

이런 잡음보다 상대적으로 강력한 신호 세기를 바탕으로 신호를 생성하여 수신하려는 컴퓨터에 데이터를 보내게 됩니다.

그러면, 이토록 중요한 작업은 어디에서 일어나는 것일까요?
정답은 물리 계층(Physical layer)에서 이러한 작업을 전담하여 수행하게 됩니다.

이때, 디지털 및 아날로그 신호 간의 데이터의 변환 또는 해석에는 '소프트웨어'가 아닌 실재하는 '하드웨어'에 의해 이루어집니다.

구체적인 장치는 'PHY 칩'이라는 부품을 통하여 컴퓨터가 보내고자 하는 데이터를 아날로그 신호를 변환하여 전송하게 되고,

이러한 PHY 칩과 같은 하드웨어 부품이 데이터의 변환 및 해석을 하는 구간이 '물리계층'입니다.

 

컴퓨터 하드웨어의 PHY 칩


데이터 링크 계층, Data Link Layer

그런데 이러한 물리 계층만 컴퓨터에 존재하게 된다면, 컴퓨터간의 통신은 매우 복잡한 구조가 될 수 밖에 없습니다.

예컨데, 3개의 컴퓨터를 연결할 때 물리계층만이 존재하여 연결하게 된다면 아래와 같은 구조가 됩니다.

 

 

이는 곧 컴퓨터를 연결하기 위하여 많은 '케이블'이 필요하다는 것을 의미하고, 

즉 비용이 많이 발생한다는 사실을 방증합니다.

그렇다면 아래와 같은 구조로 컴퓨터를 연결하면 어떨까요?

 

이제 이전보다 컴퓨터 연결에 필요한 '케이블'의 수를 획기적으로 줄일 수 있게 되었습니다.

 

이때, 이렇게 연결된 회선을 통해 컴퓨터에 데이터를 보낸다면 어떻게 될까요?

아무래도 '어디에' 데이터를 보내려는지 명확히 할 필요가 있을 것입니다.

이러한 상황에서 어떤 컴퓨터로 데이터가 이동해야하는지 '흐름'을 조절해주는 장치를 '스위치'라고 하고,

우리가 일상 속에서 많이 사용하는 공유기는 이러한 '스위치'를 포함하고 있습니다.

위에서 그렸던 컴퓨터 네트워크의 구조에서 조금 더 확장해야 한다고 해보겠습니다.

그렇다면 아래와 같이 네트워크 구조도를 그려볼 수 있을 것입니다.

 

 

위 그림에서 볼 수 있는 컴퓨터 간의 '케이블'을 감싸는 사각형의 장치는 

'스위치'라는 장치를 포함하기에 이를 바탕으로 자신과 연결된 컴퓨터 간의 통신을 제어할 수 있습니다.

 



그런데, 자신과 직접적으로 연결되지 않은 컴퓨터도 이러한 사각형의 장치를 통해 연결되어 있으므로

이들 사이에 연결된 회선을 바탕으로 데이터를 주고 받을 수 있게 되는데,

 

이처럼 직접적으로 연결되지 않은 컴퓨터 네트워크 사이의 연결을 제어하는 작업을 '라우팅'이라고 하고, 

이러한 작업을 수행하는 장치를 '라우터'라고 합니다.

 

 

우리가 평소에 사용하는 공유기가 대표적인 '라우터'의 예시 중 하나입니다.

라우터는 대체로 앞서 설명한 '스위치'의 기능을 포함하고 있는 경우가 많습니다.


네트워크 계층, Network Layer

컴퓨터 네트워크의 규모가 그리 크지 않다면, 서로 다른 컴퓨터 사이의 통신은 비교적 간단할 것입니다.

하지만, 오늘날에는 전 세계의 사람들이 컴퓨터를 사용하고 있기 때문에, 

글로벌한 통신을 위해서는 전 세계의 컴퓨터를 구분할 '체계'가 필요합니다.

이때 사용하는 국제적인 약속이 바로 'IP 주소'입니다.

 

예컨데, 우리가 네이버라는 웹 사이트를 방문한다고 한다면,

이는 사실 네이버의 주소 xx.xx.xx.xx와 통신하는 것과 같습니다.

 

웹브라우저 주소창에 영문명으로 http://www.naver.com이라고만 입력하지만, 

사실은 이러한 주소는 DNS 라는 서버를 통해 실제 주소로 바꾸는 작업을 통해 데이터를 주고 받게 됩니다.

 

따라서 이러한 서로 다른 컴퓨터 간의 '주소'를 명확히 구분하고 

어떤 컴퓨터로 데이터가 이동해야할 지 결정해주는 곳이 '네트워크 계층'입니다.

 

 

네트워크 계층은 컴퓨터 운영체제 상의 '커널(kernel)'에서 소프트웨어적으로 구현되어 있습니다.


전송 계층, Transport layer

하나의 컴퓨터 안에 하나의 프로그램만 동작한다면 이는 굉장한 자원의 낭비일 것입니다.

그런데, 앞서 설명한 IP 주소는 컴퓨터당 하나의 주소만을 부여받기 때문에 

사용하는 프로그램마다 주소가 붙는다면 이 IP주소는 금새 소진될 것입니다.

그렇다면, 같은 컴퓨터 안에서 같은 IP주소를 사용하면서도 여러 프로그램을 구분하는 방법은 없을까요?

 

오늘날 네트워크 시스템에서 이러한 작업에는 바로 '포트번호, Port Number'를 통해 구분합니다.

우리가 네이버에 접속을 시도했을 때 http://www.naver.com라는 주소를 입력하지만, 
사실 엄연히 구분하자면 이는 http://www.naver.com:80이라는 주소를 입력하는 것과 같습니다.

 

왜냐하면 웹브라우저에서는 HTTP 프로토콜을 의미하는 80 포트를 생략해도 알아서 할당해주기 때문입니다.

이외에도 프로그램마다 고유한 포트번호를 갖게 할 수 있는데,

이는 HTTP 처럼 대중적으로 약속된 번호를 사용할 수도 있고 개발자가 별도로 세팅한 번호를 사용할 수도 있습니다.

전송 계층은 이렇게 구분되는 '포트 번호'를 구분하여

최종적으로 어떤 프로그램에 데이터가 도착할 지  결정하게 해줍니다.

 

만약 내 컴퓨터 IP주소에 8081로 끝나는 포트번호를 가진 신호가 도착했다면 

내 컴퓨터의 운영체제는 커널 상에서 이미 구현된 프로그램을 통해 8081이라는 

포트번호를 수신할 프로세스(=실행중인 프로그램)를 찾게 되고 해당 프로세스에 데이터를 전달해주게 됩니다.

그렇기 때문에 하나의 컴퓨터에서 각각의 실행중인 프로세스들은 서로 포트번호가 중복될 수 없습니다.


응용 계층, Application Layer 

응용계층부터는 거의 프로그램을 만드는 '개발자'를 위한 영역이 된다.

응용계층의 대표적인 사례로는 HTTP 를 들 수 있는데,

 

이미지 출처 : https://dev.to/m__mdy__m/http-status-codes-a-guide-for-developers-822



웹 프로그래밍 분야에서 요청과 응답을 위한 STATUS 코드 등이 이에 해당한다.

STATUS를 포함한 HTTP 프로토콜 체계에서 개발자는 경우에 따라 다양한 상태 값을 관리할 수 있다.

 

이때 각 프로그램마다 별도로 설계한 프로토콜 체계에 따라 응용 계층에서 변환 또는 해석될 수 있습니다.