국비 과정 교육 중에 CS에 관련하여 발표 프로젝트를 하게 되었다.
희망자만 프로젝트를 진행하였고 나는 CS에 대해 전혀 모르고 있어서 공부할 겸 지원하였다. 그렇게 5명이 모였고 발표주제는 OSI 7계층으로 정하였다.
조장 : 최영락
조원 : 문기연, 박종휘, 정송화, 정유섭
2022.04.14 ~ 2022.05.13
OSI 7계층이란 네트워크에서 통신이 일어나는 과정을 7단계로 나눈 것이다.
OSI 7계층이 생겨난 이유?
▶ 네트워크 통신 초기에 모든 네트워크 통신 장비 제조사가 참고할 수 있는 표준화된 모델이 필요했기 때문이다.
▶ 네트워크 흐름을 한눈에 알아보기 쉽고, 단계별로 잘 나누어져 있으므로 문제가 생겼을 때, 전체가 아닌 해당 층만 고쳐도 되어 유지보수에 용이하다.
그러나 사실 오늘날 인터넷은 OSI 모델이 아닌 TCP IP 모델을 사용 중이다.
왜?
▶ 기술의 가용성을 고려하지 않은 이론적인 모델로서 구현하는 데 제한되는 사항이 많다.
▶ 출시 시기가 TCP IP 모델보다 늦어 이미 TCP 모델이 장악하고 있는 네트워크 시장에 들어가기가 쉽지 않았기 때문이다.
근데 왜 배워야 할까?
👉 OSI 7계층은 각 계층 간 역할을 잘 분리해놔서 오늘날 네트워크 장치를 만들 때, 기본적으로 OSI 7계층을 참조해서 만든다.
👉 현재 사용 중인 모델은 OSI 모델과 기존 TCP 모델의 장점만 모아서 만들었으며, OSI 모델을 통해 꾸준히 업데이트가 되고 있다.
즉, OSI 7계층에 대해서 배워야 한다.
OSI 7계층의 제일 꼭대기에 있는 계층이다. 응용계층이라고 한다.
❗❗ 핸드폰이나 컴퓨터로 웹사이트를 들어가 봐라. 웹사이트가 보이면 이미 7계층을 통과한 것이다.
6계층 표현계층이다.
6계층에서 하는 역할은 인코딩과 디코딩이다.
그림처럼 JACK_DATA라는 데이터가 들어오면 변환하고 압축하고 최종적으로 암호화까지 시켜주는 것이 인코딩의 과정이며 그 반대 과정이 디코딩이다.
『 7단계는 사람의 언어 그대로 6계층에 데이터를 내려주는데 6계층은 다른 컴퓨터와 호환할 수 있도록 공통된 표준형식에 맞추어서 데이터를 인코딩과 디코딩을 해준다. 6계층은 코드 간의 번역을 담당하여 사용자 시스템에서 데이터의 형식상 차이를 다루는 부담을 응용 계층으로부터 덜어 주는 역할을 하는 것이다.
인코딩: 사람 언어 -> 컴퓨터언어
디코딩: 컴퓨터언어 -> 사람 언어
이러한 인코딩과 디코딩이 되는 원리를 저장하기 위해 매칭한 표가 존재하는데 그것이 “문자 집합”이며 테이블에는 한글 문자에 해당하는 UTF-8, Unicode 값과 매치해 놓은 표가 존재한다. 』
(참조 링크 : [TEAM PROJECT] OSI 7계층 발표 프로젝트)
5계층 세션계층으로 네트워크상 양쪽 연결을 관리하고 연결을 지속시켜주는 계층이다. 즉, 통신하는 데 큰 대문 같은 역할이라 생각하면 된다.
세션 (Session) : 사용자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보는 것
세션계층은 데이터가 오고 가는 흐름 내에서 동기화 지점을 제공한다. 동기화 지점은 쉽게 말해 체크 포인트라고 생각하면 된다.
예를 들어, 5MB마다 체크 포인트가 설정되는 50MB짜리 파일을 보낸다고 했을 때, 갑자기 어떤 오류로 인해 파일이 33MB까지 전송되고 중단되었다면 보통의 경우 처음부터 파일을 전송해야 하지만 세션계층에서 체크 포인트를 지정해주었기 때문에 30MB부터 재전송이 가능하다.
동기화 지점 설정은 이전까지의 통신은 처리되었으며 오류가 발생하였을 때는 그 이후 과정만 복구가 가능하다는 것이다.
4계층 전송계층이다.
데이터는 목적지의 상대 컴퓨터에서 포트 번호를 확인하고 가야 애플리케이션을 찾아갈 수 있다. 그래서 전송계층에서는 데이터가 상대 응용계층을 정확하게 찾아갈 수 있도록 포트 번호를 달아준다.
포트 번호는 일종의 보내는 이, 받는 이를 표시하는 번호이다.
같은 주소에 사는 가족 구성원 중에서도 정확히 받는 사람을 지정해 전달되도록 하는 것이다.
또한 패킷이 전송 과정에서 아무 문제 없이 제대로 수신지 컴퓨터에 도착할 수 있도록 패킷 전송을 제어하는 역할도 하며, 핵심 프로토콜로는 TCP와 UDP가 있다.
패킷 (Packet) : 컴퓨터 간에 데이터를 주고받을 때, 네트워크를 통해서 전송되는 데이터 조각 → 정보를 보낼 때 형태를 맞추어 보낸다.
TCP는 통신할 컴퓨터끼리 ‘보냈습니다’, ‘도착했습니다’라고 서로 확인 메시지를 보내면서 여러 번의 확인 과정을 거쳐 데이터를 정확하게 전달합니다. 그래서 UDP보다는 속도가 느립니다.
반대로 UDP는 데이터를 보내면 그것으로 끝이므로 데이터를 더 빠르게 전달할 수 있지만 그만큼 신뢰성은 보장할 수 없습니다.
택배에 비유하자면..!
택배 기사님이 일일이 정보를 확인하고 택배를 전달한다. → TCP
택배를 그냥 문 앞에 두고 간다. → UDP
전송계층의 또 다른 역할은 '세그멘테이션'이다.
쉽게 이야기하면 우리가 수산 시장에서 참치를 받아온다고 가정했을 때, 참치는 너무 커서 쉽게 운반하기 어렵다. 그 때문에 우리는 참치를 쉽고 편리하게 가져가기 위해서 분할을 해야한다. 이 과정을 세그멘테이션이라고 하며 나눈 것들을 세그먼트라고 합니다.
왜 세그멘테이션을 해야 하나?
예를 들어 전달받은 상위 계층 데이터를 그대로 전달한다고 하자.
100MB 동영상을 재생하기 위해서는 데이터 덩어리를 통째로 모두 전달받아야 재생할 수 있다.
하지만 세그멘테이션을 통해 패킷을 나눠서 전달한다면 어떻게 될까?
전달받은 데이터부터 우선 재생이 가능해진다. 즉, 다운로드 받으면서도 우리는 영상을 볼 수 있다.
또, 데이터를 받는 중간에 연결이 끊기게 되면 데이터 덩어리는 그대로 날아가게 된다. 그래서 분할된 데이터보다 손실률이 높아진다. 그래서 세그멘테이션을 하는 것이다.
3계층 네트워크계층이다.
실질적으로 우리가 데이터를 보내고 싶은 곳에 데이터를 전달하는 역할을 한다.
3계층의 첫번째, 라우팅이다. 라우팅은 쉽게 말하면 데이터를 보낼 최적의 경로를 찾는 것이라고 할 수 있다. 라우터라는 기기에서 담당한다.
라우팅엔 포워딩이 따라온다.
포워딩이란 한 라우터의 입력포트에서 출력포트로 데이터를 이동시키는 것이다.
쉽게 말해, 위 그림처럼 라우팅을 통해 선정된 최적의 경로로 데이터를 전달하는 것이다.
이때 라우터에서는 컴퓨터의 IP 주소를 이용해 데이터를 전달한다.
IP 주소 : 컴퓨터 네트워크에서 장치들이 서로를 인식하고 통신하기 위해 사용하는 특수한 번호
지금까지 우리는 많은 단계를 거쳐서 데이터를 보낼 ‘장소’까지 파악한 것이다. 그러나 우리는 아직 데이터의 정확한 목적지를 알지 못한다.
2계층을 지역 우체국이라고 예를 들어보자. 우체국에서 목적지를 파악해서 편지 또는 택배를 보낸다.
이렇듯 우리도 이제 데이터가 도착할 최종 목적지를 찾아야 한다. 그리고 이것을 MAC 주소를 통해 파악하며, 이 역할을 2계층에서 수행한다.
MAC 주소?
Media Access Control Address로 컴퓨터 고유의 정확한 번지수라고 생각하면 된다.
컴퓨터 역시 우리처럼 본인만이 가지고 있는 주소가 있는 것이다. 이 주소를 2계층에서 분석하면 데이터가 최종적으로 어느 곳으로 가는지 파악할 수 있다.
2계층은 데이터를 보낼 때 MAC 주소를 데이터에 붙여 데이터의 출처를 다른 PC에서도 알 수 있도록 한다. 그리고 그 데이터는 스위치라는 2계층 통신장비에 의해 분석된다.
2, 3계층에서 정보가 오고 가는 흐름을 설명하자면,
A 컴퓨터에서 B 컴퓨터로 데이터를 보낸다.
이 데이터의 3계층 헤더에는 A 컴퓨터의 IP주소와 도착지인 B 컴퓨터의 IP주소가 모두 적혀있지만, 2계층의 헤더에는 도착지인 B 컴퓨터의 MAC 주소를 모르기 때문에 A 컴퓨터에서 가장 가까운 라우터의 MAC 주소가 도착지로 적혀있다.
헤더 (Header) : 각 계층에서 데이터를 처리한 결과
이제 A에서 스위치로 데이터를 보낸다.
스위치는 데이터 도착지의 MAC 주소에 대한 정보를 살펴볼 것이다. 이때, MAC 주소는 라우터에 대한 MAC 주소가 적혀있으므로 라우터에 데이터를 보낸다.
라우터 또한 데이터 도착지에 대한 IP주소를 체크하여, 라우팅 테이블을 통해 라우팅시키면 데이터는 B 컴퓨터 네트워크 근처의 라우터에 도착한다.
그럼 그때 그 라우터가 MAC 주소 테이블을 통해 해당 데이터 도착지 MAC 주소를 파악하고 도착지 MAC 주소로 업데이트하여 스위치로 다시 데이터를 전달한다. 그리고 스위치는 MAC 주소를 파악하여 B 컴퓨터로 데이터를 정확하게 보낸다.
1계층 물리계층이다.
모아진 데이터를 다른 네트워크로 보내기 위해 데이터를 컴퓨터가 이해할 수 있는 01010이라는 전자신호로 바꿔준다.
이 신호를 아날로그 신호로 바꿔줌으로써 케이블로 이동할 수 있도록 한다.
마침내 우리는 다른 네트워크로 데이터를 보내기 위한 모든 준비를 마쳤다고 할 수 있다.
정리하자면, 7계층에서부터 계층마다 헤더를 붙여 1계층까지 내려준다.
다른 컴퓨터로 간 데이터는 계층마다 하나씩 까져서 최종적으로 우리의 컴퓨터에 도착하게 된다.
이것이 우리가 평소에 카톡을 하거나 메시지를 보낼 때 데이터가 전송되는 과정이라고 볼 수 있다.
실력 있는 개발자라면 코드만 잘 짜는 것이 아니라 이론적인 부분도 깊이 알아야 한다고 생각한다. 나는 전공자가 아니었기 때문에 이 프로젝트가 좋은 기회가 되었다.
일단 CS가 뭔지도 알게 되었고 평소에 핸드폰이나 컴퓨터를 사용할 때, 어떻게 데이터가 전송되는지에 대해 궁금증을 갖고 있었는데 이번 프로젝트를 통해 OSI 7계층을 조사하고 공부하면서 전체적인 흐름을 알게 되면서 궁금증이 풀렸다.
앞으로 다른 주제들도 공부하여 CS 이론을 탄탄히 정립할 것이다. 그 바탕으로 좋은 코드로 좋은 결과를 내는 실력 있는 개발자가 될 것이다.
OSI 7계층은 이론을 공부하는 것이라 딱딱하고 어려울 수밖에 없다. 그래서 프로젝트 발표 때 어떻게 하면 사람들에게 흥미를 주어 지루하지 않은 발표가 될 수 있을지 조원들과 정말 많은 이야기를 나누었다. 서로 조사해온 부분을 서로에게 쉽게 설명하는 연습도 하였고 머리를 맞대어 조금 더 쉽게 설명하고자 공감 가고 재밌는 예시를 찾아가며 발표 대본을 짜기도 하였다. 그 결과 많은 사람이 호응을 해주었고 만족스러운 발표가 되었다.