# 기본 지식
네트워크란 전세계의 기기들이 리소스나 데이터를 주고받기 위해 연결한 유무선의 통신 체계이다. 메일을 보낸다거나 SNS를 이용하는 등으로 네트워크 참여자들 간에 통신을 한다고 하면, 사용자들은 정상적인 네트워크 통신을 기대할 것이다.
정상적으로 이뤄진 네트워크 통신이란 무엇일까?
- 데이터를 교환하는 어플리케이션의 목적에 맞는 통신을 해야한다. 메일을 보낼거라면 메일에 맞는 형식의 통신을, 파일을 교환할거라면 파일 교환에 맞는 형식으로 통신이 이뤄져야 할 것이다.
- 데이터의 교환이 신뢰성있게 이뤄져야 한다. 여기서 신뢰성이라는 말은, 내가 보내고자 하는 내용이 순서대로, 오류 없이 전송된다는 의미이다.
- 내가 보내고자 하는 상대방에게 데이터가 잘 도착해야 할 것이다. A에게 보낸 데이터가 엉뚱한 B에게 전달된다면 네트워크가 제대로 이뤄졌다고 할 수 없을 것이다.
외에도 몇 가지 있지만, 가장 일반적으로 생각해볼 수 있는 정상적인 네트워크의 요구사항은 이정도일 것이다. 위 사항을 달성하기 위해선 '네트워크 프로토콜'이 필요하다.
네트워크 프로토콜이란, 네트워크 참여자들끼리 리소스를 주고받기 위해 정한 규칙 또는 규약이다. 프로토콜을 정해두지 않는다는 것은 대화를 할 때 사용하는 언어가 다른 것과 마찬가지이다. 목적에 맞는 방법과 경로로 제대로 된 리소스 통신을 하기 위해서 통신 참여자들간 "우리 데이터를 이렇게 교환하자!"하고 약속을 정해둬야 하는 것이다.
상기한 목적을 달성하기 위해 네트워크는 서로 다른 두 노드간 통신을 위한 과정을 7계층으로 나누고, 각 계층에서 해야할 일과 각각의 프로토콜을 정의했다. 신뢰성 있는 통신을 위한 과정의 계층과 그 프로토콜, 원하는 end point로 데이터를 보내기 위한 과정의 계층과 그 프로토콜... 같은 형식으로 말이다. 이렇게 계층을 나눔으로써 기능과 그 책임을 확실히 구분하고 각 단계에 알맞는 장비를 제작할 수 있게 되었다.
각각의 레이어(계층)는 하위 레이어가 제공하는 기능을 사용해서 통신한다. 데이터 링크 계층은 물리 계층이 제공하는 신호 변환 기능을, 네트워크 계층은 데이터 링크 계층이 제공하는 노드간 통신 기능을, 전송 계층은 네트워크 계층이 제공하는 라우팅 기능을 이용하는 것이다. 따라서 하위 레이어에서 문제가 일어나면 상위 레이어는 동작할 수 없다.
이제 7계층 각각의 구성과 해당 계층에서 일어나는 과정의 설명이다. 이와 관련되선 인터넷에 잘 정리된 문서들이 허다하다. 그러니 가볍게, 메세지 하나를 응용 프로그램에서 상대방에게 보내는 상황을 생각해보며 그 과정을 이해해보자.
7. Application Layer : 어플리케이션의 목적에 맞는 프로토콜을 정하자!
어플리케이션 계층은 응용 프로그램과 가장 가깝게 맞닿아있는 계층이다. 응용 프로그램이 어떤 목적으로 데이터를 교환할 것인지 확인하고 그 목적에 맞는 통신 프로토콜을 이용한다. 응용 프로그램에서 교환하고자 하는 데이터를 받아 통신을 구성하는 것이다. 메일 송수신을 하는 응용 프로그램을 위해 SMTP 프로토콜을, 웹 서버간 통신을 위해 HTTP 프로토콜을, DNS 요청 및 응답을 위한 DNS 프로토콜 등을 이용한다.
"안녕 J!"는 7계층을 거쳐, 어떤 어플리케이션 프로토콜을 사용하는지와 그 프로토콜에서 필요한 정보들이 담긴 헤더가 추가된다.
6. Presentation Layer : 주고받는 메세지의 포맷을 정하자!
표현 계층에선 어떤 형식으로 데이터를 주고받을 것인지 포맷을 정한다. 데이터 코드의 번역이 일어난다. 특정 파일 형식이나 charset으로 인코딩/디코딩을 하거나, 암호화/복호화를 하거나, 전송 과정에서 파일의 압축/압축풀기 등의 과정이 이에 해당한다.
"안녕 J!"는 text data이다. utf-8 charset 등으로 인코딩 된 후 presentation header가 붙은 채로 밑 계층으로 이동하게 된다.
5. Session Layer : 연결을 유지하자!
세션 계층에서 말하는 세션이란, 통신 참여자간 네트워크 연결이 유지되고 있는 상태를 말한다. 세션 레이어에선 '논리적인 연결'을 담당한다. 네트워크에 참여하는 양쪽의 연결 세션을 만들고 유지하고 중단하며, OS가 통신 과정상 오류가 있을 시에 이를 검출하고 복구하는 역할을 수행한다. 통신자간 동기화도 이 계층에서 관리한다.
소프트웨어 관점에서 보는 통신의 시작이라고 생각하면 좋을 것 같다.
해당 기능은 OS 소프트웨어에서 구현된다.
표현 계층을 거쳐 인코딩된 우리의 데이터는, session layer를 거쳐 동기화 작업을 거치고, H5 헤더가 추가된다.
4. Transport Layer : 어떤 애플리케이션에 어떤 방법으로 줄 것인지 정하자!
포트를 열어 프로그램간 통신을 활성화하는 계층이다. 물리적 관점에서 보는 통신의 시작이다.
전송 계층에선 일단, 어떤 애플리케이션에게 전송 데이터를 보낼 것인지 결정한다. 대상 컴퓨터에서 실행중인 특정 프로세스의 포트 번호를 헤더에 넣어 해당 프로세스에 보내고자 하는 데이터가 갈 수 있도록 한다. 예를들어 통신을 하고 있는 애플리케이션이 카카오톡이라면 카카오톡이 실행되고 있는 포트번호를 헤더에 넣는 것이다.
그리고 통신을 위해 사용할 프로토콜을 설정한다. 보통 신뢰성 있는 통신을 위해 TCP 프로토콜을 이용한다. 여기서 말하는 신뢰성 있는 연결이란, 송신 측에서 보내는 순서대로 수신측에 데이터가 도착하고, 그 데이터에 오류나 손실이 없다는 것을 의미한다.
여기서 유명한 TCP와 UDP 프로토콜이 등장한다. 이 글은 전송 프로토콜에 관한 글이 아니므로 간단하게만 짚고 넘어가겠다.
- TCP : 연결 지향형 프로토콜. 신뢰성 있는 연결을 보장하며, 이를 위해 통신 시작 전 3-way handshake, 끊기 전 4-way handshake를 실시한다. 패킷으로 나눠 전송된 데이터를 수신측에서 순서에 맞게 합치는 과정이 일어난다. 통신의 흐름과 혼잡을 제어하는 기능도 갖췄다.
- UDP : 비연결성 프로토콜. 패킷을 보낸 뒤 수신 확인을 하는 TCP와 다르게 별도의 확인 과정 없이 일방적으로 데이터그램을 보내기만 한다. 때문에 전송 데이터의 손실이 발생할 수도 있지만 TCP에 비해 빠른 속도를 가지고있어 실시간으로 데이터를 보내야 하는 상황에 적합하다.
전송 계층을 거친 데이터는 일정한 길이로 나뉜 뒤 4계층 헤더가 붙어 "세그먼트"라는 데이터 전송 단위가 된다.
3. Network Layer : 어디로 줄 것인지 정하자!
네트워크 레이어에서는 전달하고자 하는 데이터를 결국 어디로(목적지), 어떤 길을 통해 보낼 것인지(라우팅) 정의한다. 목적지까지 빠르게 전달하는 역할을 한다고 보면 된다. 이때 사용하는 것이 IP 프로토콜이다. IP 주소란 인터넷 세상에서 통신 참여자들이 가지는 논리적 주소이다. IP주소를 가지고 4계층에서 내려준 세그먼트의 목적지를 정하고, 해당 목적지까지 최적의 경로를 찾아 데이터를 전송하는 것이 3계층에서 하는 일이다.
해당 기능은 라우터를 통해 동작한다.
3계층을 거친 세그먼트는 IP주소가 포함된 헤더가 붙어 "패킷"이라는 데이터 전송 단위가 된다. 네트워크에 참여하는 라우터들은 전송 과정에서 패킷에 적힌 IP주소를 확인한 뒤 최적의 경로가 되는 다음 라우터 혹은 엔드포인트로 해당 패킷을 전송한다.
2. Data Link Layer : 직접 연결된 노드들 중에서 목적지를 찾자!
네트워크 계층에서의 라우팅 과정의 패킷은 직접 연결된 다음 라우터까지 잘 도착해야한다. 목적지 IP까지 도달한 우리의 패킷 역시 목적 기기까지 잘 도착해야한다. 이렇게 물리적으로 직접 연결된 노드들 사이의 통신을 데이터 링크 계층에서 담당한다.
이 계층에서 장치와 장치 사이의 통신을 위해 사용되는 주소가 MAC 주소인데, MAC 주소란 하드웨어가 가진 고유의 주소로, ARP라는 프로토콜로 IP -> MAC 주소의 변환이 일어난다.
IP는 네트워크 시작의 송신자와 끝의 수신자의 궁극적인 통신을 위한 주소를 제공하고, MAC은 그 중간중간 노드들의 통신 과정에서 데이터가 전송되어야할 다음 노드 주소를 제공한다. 이를 두고 "IP 주소의 통신은 각 라우터의 MAC 주소간 통신의 연속이다"라고 표현하기도 한다.
서로 연결된 장치간, 즉 point to point의 안전한 통신을 위해 데이터 링크 계층에선 3계층에서 내려온 패킷의 앞뒤에 프레임이라는 고유의 비트를 붙여 패킷을 "프레이밍"화 한다. 1계층에서 발생한 오류를 검출하고 수복하기 위함이다. 따라서 2계층을 거친 패킷은 앞뒤 고유 비트가 추가된 프레임이 된다.
해당 과정은 브리지, 스위치 등의 하드웨어에서 구현된다.
1. Physical Layer : 실제로 데이터를 보내자!
물리 계층에선 컴퓨터에서 사용하는 010101011101010.. 형태의 이진 데이터를 케이블을 통해 전해질 수 있는 아날로그 신호로 변환하는 작업이 이뤄진다. 케이블, 리피터, 허브 등을 통해 구현되며 다른건 신경쓰지 않고 상위 레이어에서 내려온 프레임을 전기 신호로 변환할 뿐이다.
해당 과정은 케이블, 리피터, 스위치 등 하드웨어에서 구현된다.
물리 계층을 거친 프레임은 파장을 가진 전기 신호로 변환되어, 유선 케이블을 따라 흐르게 된다.
위와같은 과정을 통해 전기 신호로 변환된 우리의 데이터는 여러개의 라우터를 거친다. 라우터에 도착한 전기 신호는 라우터에 의해 L3 패킷 단계까지 올라온다. 라우터는 패킷의 IP주소를 확인한 뒤 다시 물리 계층의 전기 신호까지 데이터를 내려보내고 다음 라우터로 데이터를 전송한다. 이와 같은 과정이 반복되어 데이터는 최종 목적지에 도착하게 되고, 다시 1계층부터 올라가 최종적으로 목적지 응용 프로그램까지 원하는 형태로 도착하게 된다.