소프트웨어학/컴퓨터네트워크

[컴퓨터 네트워킹: 하향식 접근(8판)] 비전공자도 이해하는 네트워크 총 요약 (1)

진강이 2024. 11. 2. 19:54

컴퓨터 네트워크 수업을 듣다보면, 각 파트들의 내용이 너무 방대해 전체적으로 봤을 때 머리 속에 남는 게 없는 느낌이다...ㅋㅋ

 

이번 장에서는  네트워크의 전반적인 흐름을 이해할 수 있도록 숲을 그리며 컴퓨터 네트워크의 개요를 정리하고자 한다. 

 

네트워크의 각 레이어별로 중요한 개념들을 짚어가며, 레이어들이 어떻게 유기적으로 연결되어 있는지를 살펴봄으로써 전체적인 구조를 보다 명확하게 이해해보자!

 

필자 또한 학부생으로, 부족하거나 틀린 내용이 있을 수 있으니 비판 완전 환영

 

 

**본 포스팅은 OSI 7계층 부터 데이터가 전달되는 방식을 설명할 예정이다.

네트워크의 배경지식이 없으신 분들은 네트워크를 미시적, 거시적 관점에서 서술했던 기존의 포스팅을 참고하시길!

https://zingangyyy.tistory.com/17

 

 

⭕OSI 7계층

 

OSI 7계층(Open Systems Interconnection Model)은 네트워크 통신을 여러 계층으로 나누어 각 계층에서 수행해야 할 역할을 명확히 정의한 모델이다. 

 

이렇게 나눠놓은 이유는 계층별로 담당 구역을 정해 서로의 일에 집중 + 네트워크 문제가 생겼을 때 다 뜯어고치는 것이 아닌 특정 계층의 지점만 고칠 수 있게 하기 위함이다. 

 

이번 포스팅에서는 가장 왼쪽에 있는 'TCP/IP 모델 확장' 버전으로 설명하겠다. 

 

일단, 비유를 통해 데이터 전송 과정을 알아보자. 

 

데이터 통신 과정은 택배를 보내는 과정과 비슷하다. 

철수가 아버지에게 데이터(택배)를 보낸다고 생각해보자.

 

택배를 보낼 땐, 물간을 상자에 넣고 주소나 이름과 같은 정보를 붙여 포장하고 물류사로 보내는 과정이 필요하다.

컴퓨터도 마찬가지이다. 데이터를 전송할 때, 각 계층에서 필요한 정보들(헤더)를 붙이고 아래 계층으로 보낸다.

이 과정이 캡슐화(Encapsulation)다.

⭕ 캡슐화(Encapsulation)&역캡슐화(Decapsulation)

 

각 포장에는 전송 중의 안전과 정확한 목적지로의 전달을 위해 필요한 정보가 포함된다.(택배 보낼때도 송장 붙이는 것처럼)

이 정보를 헤더라고 부른다. (헤더 = 송장) 트레일러도 비슷한 역할이다.

참고로, 찐으로 보내려고 하는 데이터는 페이로드라고 부른다. (페이로드 = 택배 내용물)

 

반대로 역캡술화(Decapsulation)는 데이터가 목적지에 도착했을 때 각 계층에서 하나씩 포장을 풀어가며, 원래의 데이터를 복원하는 과정이다. 포장을 푸는 과정과 비슷하다. 

 

위 그림을 먼저 보여주고 들어가는 이유는 각 계층별로 하는 일을 정리할때, 송신 수신 측면에서의 역할이 다른데, 이를 모르고 공부하다보면 개념이 섞여 헷갈리기 떄문이다.. 

 

이제 각 계층별로 자세히 살펴보자. 

 

⭕#1 응용계층

 

 

위에서 데이터 전송이 택배를 보내는 것과 비슷하다고 비유했으므로 계속해서

응용계층은 택배 배송의 관점에서 데이터를 준비하거나(송신) 응답을 받는 단계(수신)라고 설명하겠다.

 

예를들어, 사용자가 이메일을 작성하거나 웹 페이지를 요청하는 경우가 이에 해당한다.

 

응용 계층에서는 어떤 프로토콜로 전송되는지에 따라 각각의 헤더가 추가된다. 이 헤더는 데이터를 목적지에 올바르게 전달하고, 응답을 받을 수 있도록 필요한 정보를 담고 있다. 예를 들어, 응용계층에는 HTTP, FTP, SMTP 등의 프로토콜이 있는데, 각 프로토콜에 맞는 헤더가 추가된다. 

 

이런 헤더들은 수신 측이 데이터를 이해하고, 처리할 수 있도록 필요한 설명서 같은 역할을 한다.

프로토콜에 따라 헤더가 페이로드와 결합된다면, 이들은 하나의 데이터 블록이 되어 다음 계층(전송계층)으로 전달된다. (예를 들어, 웹 요청을 보낼 때, 헤더 + 웹 페이지 요청 내용이 결합되어 HTTP 요청이 된다.) 

GET / HTTP/1.1 
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

-> HTTP 요청의 예시 (GET 요청:서버에 데이터 요청) // 페이로드 포함 X

(요청 메서드와 경로) : 웹 서버에서 리소스를 가져올 거고(GET / ) HTTP 1.1 버전을 사용할거야(HTTP/1.1)
(헤더) -  내 이름은 example이고(Host : ~),  나의 브라우저 종류, 버전, 운영 체제 정보 등은 이래(User-Agent : ~), 내가 수용할 수 있는 콘텐츠 유형은 HTML 문서, XML, 이미지 등이고 내가 선호하는 언어는 영어고, 서버가 지원하는 인코딩 방식은 GZIP이야. (Accept : ~), 여러 요청을 동일한 TCP 연결에서 처리해줘(Connection : ~)

 

위 예는 GET 요청의 특성상 서버에서 정보를 가져오는 요청으로, 단순히 웹 페이지나 리소스를 요청할 뿐, 추가적인 데이터를 보낼 필요는 없다. 그래서 헤더만 포함되고 페이로드는 따로 존재하지는 않는데, 페이로드가 포함되는 경우를 살펴보자면 다음과 같다. 

POST /login HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Content-Type: application/x-www-form-urlencoded
Content-Length: 29

username=user123&password=pass

-> HTTP 요청의 예시 (POST 요청:서버로 데이터 전송) // 페이로드 포함 

 

웨 예시는 사용자가 로그인 폼을 제출할 때의 POST 요청이다. 

 

Host, User-Agent, Content-Type, Content-Length 등의 정보가 헤더에 포함된다. 

Content-Type은 페이로드의 데이터 형식을 지정하고, Content-Length는 페이로드의 길이를 알려준다. 여기까지가 헤더고

<username=user123&password=pass> 얘가 실제로 서버에 전송하고자 하는 페이로드 부분이다. 

 

 

 

 

 

요약하자면,

응용 계층은 사용자가 보낸 요청(Request)을 서버에 전달하고, 서버의 응답(Response)을 사용자에게 보여주는 역할을 한다.  이 과정에서 요청, 응답 오류가 발생하면 사용자에게 알리기만 한다. (웹 페이지 열었을때, 404 Not Found 화면을 본 적 있을 것이다..) 해결은 다른 계층에서.. 또한, 요청 데이터에 헤더를 붙여 전송 계층으로 전달한다. 

 

추가로 응용계층의 프로토콜을 자세히 살펴보겠다.

 

1) HTTP 

 

 

 

HTTP는 클라이언트/서버 방식으로 작동한다. 이는 클라이언트가 요청(Request) 메시지를 보내면 서버가 응답(Response) 메시지로 답하는 구조를 말한다. 이 구조는 전송/네트워크 계층에서  TCP/IP를 기반으로 하여 안정적인 데이터 전송과 네트워크 계층에서의 패킷 라우팅을 보장한다. (이 부분은 각각 전송 계층과 네트워크 계층에서 구체적으로 설명하겠다.)

 

HTTP 서버는 많은 수의 클라이언트의 Request를 처리해야 하기 때문에 다음과 같은 두 가지 특징을 가진다. 

 

첫째, HTTP는 비연결성(Connectionless) 프로토콜이다. 이는 서버가 응답을 마친 후 클라이언트와의 연결을 즉시 끊는 것을 의미한다. 연결을 계속 유지하게 되면 불필요한 리소스가 낭비되고 다른 클라이언트의 요청 처리 속도도 느려지기 때문이다. (다만, 상황에 따라 연결 비용 절감을 위해 keep-alive 옵션을 사용하여 연결을 재활용할 수 있다.)

둘째, HTTP는 상태 비유지(Stateless) 프로토콜다. 서버도 하나의 호스트(디바이스)로서 많은 클라이언트의 정보를 개별적으로 저장할 수 없으므로 각 요청 간의 상태를 유지하지 않는다.

 

그렇다면 자동 로그인 기능과 같은 사용자 정보는 어떻게 유지될까?

이를 위해 보통 쿠키(Cookie)세션(Session)을 사용하여 클라이언트 측에서 정보를 저장하도록 한다.

 

2) DNS

 

다음으로 살펴볼 프로토콜(시스템은) DNS이다. 이 친구는 쉽게 인터넷의 전화번호부 역할을 한다고 이해하면 쉽다. 

예를들어 192.168.1.0 와 같은 IP 주소를 www.example.com  과 같이 우리가 알기 쉬운 도메인 이름으로 변환해준다.

 

DNS는 도메인 이름과 IP 주소 간의 변환만을 담당하고, port 번호와는 무관한데(port번호에 대해선 나중에 학습할 예정) 대부분의 웹 서비스는 기본적으로 80번 포트에서 동작하므로, 80번 포트를 통해 실행되는 것이 일반적인 관례이다. 

 

 

3) 소켓

자 이제 응용계층 프로토콜 (HTTP, SMTP 등)에서 필요한 헤더가 포함된 데이터(메시지)가 전송계층으로 전달이 되었다 하자.

 

그 전에, Socket이라는 개념을 알아야 하는데, 자 어려운 내용 나오니 집중해보자. 

Socket은 네트워크 통신을 위해 프로세스 간의 데이터 전송 통로를 만드는 인터페이스이다. 

 

?? 말이 너무.. 어렵다. 차근차근 이해해보자. 

 

앞전에서 응용계층에서 전송계층으로 메시지를 전달한다고 했다.(HTTP에서 데이터 단위 : 메시지)

하지만 실제로 통신은 각 호스트 내의 프로세스 간 데이터 전송을 통해 이루어진다. 

프로세스는 OS에서 실행 중인 프로그램을 의미하는데, 한 호스트(디바이스) 안에서 여러 프로세스가 독립적으로 실행될 수 있다. 

(한 사람이 컴퓨터를 해도 웹 쇼핑을 할 수도, 아니면 스트리밍을 하고 있을 수도 있다.)

한 디바이스에 여러 프로세스 실행중

그렇다면 프로세스가 메시지를 어떻게 목적지로 보내는 걸까? port 넘버만 보고 알 수 있는 것일까?

참고로 포트(Port)번호는 네트워크 통신에서 프로세스가 할당받는 고유한 번호이다. (예, HTTP : 80번)

 

하지만 DNS는 IP 변환 기능 뿐이며, HTTP는 80번 포트를 디폴트로 한다고 하였다. 

그렇다면 하나의 서버가 80번 포트에서 HTTP 요청을 처리할 때, 여러 클라이언트가 동시에 요청하게 되면 어떻게 되는걸까? 한 번에 한 프로세스 간의 통신밖에 안 되는 것일까?

 

그럴리가 없다... 

하나의 프로세스는 하나의 포트 넘버를 지정받지만 여러 개의 소켓을 가질 수 있다.

  • 서버는 각 클라이언트와의 연결마다 별도의 소켓을 생성해서, 같은 포트를 통해 들어온 요청을 독립적으로 처리할 수 있게 한다.
  • 이렇게 각 연결마다 별도의 소켓을 생성함으로써, 여러 클라이언트가 동시에 서버와 통신할 수 있게 한다..

이런 이유 때문에 하나의 프로세스는 하나의 포트만으로 여러 호스트들의 요청을 처리할 수 있게 되는 것이다. 

예를들어, 위 그림에서 서버는 두 개의 프로세스를 갖고 있으며 각각의 프로세스의 포트 넘버는 10, 11이다. 각각의 포트는 다른 클라이언트와 연결을 처리하기 위한 각각의 소켓을 가지고 있다. 클라이언트 1은 포트 100을 통해 서버의 포트 10에 연결되고, 클라이언트2는 포트 200을 통해 서버의 포트 11에 연결되고 있다. 이렇게 하나의 서버가 서로 다른 두 클라이언트와 독립적으로 통신 가능하다. 

 

요약하자면

소켓은 프로세스 간의 데이터를 주고받는 '문'역할을 하는 연결 지점이다.

소켓 = ip 주소 + 포트 번호 + 프로토콜

소켓을 통해 프로세스는 네트워크 상의 다른 프로세스와 통신할 수 있다. 소켓은 프로토콜(TCP/UDP)에 따라 다르게 동작하며, IP 주소 포트 번호를 이용해 특정 프로세스 간의 연결을 담당하고, 데이터를 주고받는 통로 역할을 한다. 

 

 

실제로 cmd 켜고

netstat -a

위 명령어로 현재 시스템에서 활성화된 모든 네트워크 연결과 소켓 상태를 보면 

현재 컴퓨터에서 실행중인 프로세스가 주루룩 나온다. 

127.0.0.1이 ip 주소고 그 뒤에 숫자들이 포트 넘버다.

IP 주소는 동일하지만, 각기 다른 포트를 사용해 서로 다른 프로세스들이 통신하고 있다는 것을 알 수 있다. 즉, 같은 컴퓨터에서 여러 서버나 서비스가 동시에 실행되더라도 충돌 없이 독립적으로 동작할 수 있는 것이다. 

 

여기서 잠깐, 내 컴퓨터 ip주소가 왜 127.0.0.1?? 내가 알던 거( 192.168.x.x )랑 다른데? 

 

참고로 나두 이거 헷갈렸는데
cmd 창에서 ipconfig 라고 명령어 쳤을때 나오는 IPv4 주소인 192.168.x.x도 내 컴퓨터 ip 주소다. 
127.0.0.1은 '루프백 주소'라고 하는데, 컴퓨터의 네트워크 기능을 시험하기 위해 가상으로 인터넷망에 연결되어 있는 것처럼 할당한 인터넷 주소라고 한다. 한 마디로, 내가 나를 가르킬 때의 ip주소다. 

어찌됐건 둘 다 내 컴퓨터 지칭하는 거 맞음. (제 3자가 나를 부를 때 : 예림아~ / 내가 나를 부를 때 : 나는~ -> 이 차이)

 

 

자 그러면, 각 프로세스는 ip 주소와 포트번호만으로 구별 할 수 있는것일까?

 

정확히는 소켓으로 구별한다. 

네트워크 통신에서 프로세스를 구별하는 가장 확실한 단위는 소켓이다. 

소켓 = IP 주소 + 포트 번호 + 프로토콜 (TCP/UDP) 라고 했는데, 

 

이제 저 끝에 있는 TCP/UDP의 차이를 알아볼 차례다.

이를 알려면 전송계층으로 넘어가야 한다! 

 

 

⭕#2 전송계층

 

전송 계층은 송신 시 메시지를 올바른 소켓으로 전송하며,
수신 시에는 하위 계층에서 올라온 패킷의 오류와 손실을 감지하고, TCP인 경우에 이를 복구하는 역할을 담당한다.

 

전송계층에 대해선 다음 시간에 이어서 포스팅 하겠다.