네트워크는 개발자가 갖추어야 할 웹(web)지식의 베이스가 됩니다.
하지만 네트워크는 워낙 그 개념이 방대하고 복잡하여
입문자들은 어디서부터 시작해야 하는지조차 감을 잡기 어렵습니다.
분명 저처럼 걸음마는 단계인 분들이 있을거라는 생각에
그분들에게 조금이나마 도움이 되었으면 하는 마음으로
쉽고 간단하게 제가 공부해본 내용을 공유하고자 합니다.
1. 인터넷 망
1-1. 이더넷
2. IP
2-1. 라우터
2-1-1. 공인 IP (WAN)
2-1-2. 사설 IP (LAN)
3. TCP, UDT
3-1. 포트 번호(PORT)
3-1. TCP
3-1-1. 연결 보장 (3-way handshake)
3-1-2. 순서 보장 (SEQ, ACK)
3-2. UDP
4. 애플리케이션 (HTTP, DNS 등)
4-1. HTTP
4-1-1. connectionless (비연결성)
4-1-2. stateless
4-2. DNS
5. TCP / IP 프로토콜 스택
5-1. 캡슐화 과정
한국에 있는 컴퓨터가 지구 반대편 영국의 컴퓨터와 데이터를 주고받으려 합니다.
우리는 어떻게 영국까지 데이터를 요청하고 또 데이터를 받아올 수 있을까요?
이때 데이터들은 인터넷이라는 네트워크를 통해 교환됩니다.
그리고 이 네트워크는 굉장히 추상적이고도 하늘 위의 뜬구름같은 느낌의 단어지만
그 작동도 결국엔 물리적인 기반이 있어야 가능합니다.
한국컴퓨터가 영국컴퓨터까지 통신하기 위해서는
정말 케이블을 타고 산넘고 바다건너 데이터를 전달해야 할 수도 있습니다!
기술이 빠른 속도로 발전하고 점점 인터넷망에 연결되는 컴퓨터가 늘자
이 컴퓨터들을 연결하는 다양한 방법이 생겨났습니다.
여기서 데이터링크라는 개념이 등장합니다.
이름 그대로 데이터(data) + 연결(link) 의 모습을 상상해볼까요.
데이터링크란 동일한 방법으로 연결된 한 덩어리의 기기를 칭하며
인터넷은 데이터링크의 모음이라고 볼 수 있습니다.
이 데이터링크를 만들기 위해 수많은 규격들이 탄생했습니다.
하지만 그 중 대부분의 규격들을 제치고 가장 보편화된 규격이 있는데,
그것이 바로 이더넷입니다.
데이터를 주고받을때, 단순히 그 데이터만을 다루면 복잡할 것 없겠지만
그렇게 되면 데이터를 보내는 자와 데이터를 받아야 할 자가 누군지 알 수 없습니다.
보내는 이와 받는 이에 대한 정보는 통신에 있어서 가장 중요한 정보입니다.
이를 위해 우리는 각 네트워크에 논리 주소인 IP 주소를 부여해 사용합니다.
그리고 이 IP 주소 정보를 덧붙인 데이터 전송물을 IP 패킷이라 합니다.
( 패킷(Packet) = Package(화물) + Bucket(덩어리) )
요즘 이사가면 다들 인터넷 설치를 먼저 서두릅니다.
각자 사용하는 인터넷 서비스 provider (즉 ISP, 한국에서는 SK, LG, KT)에
인터넷을 신청하면 기사님이 라우터를 집에 설치해줍니다.
2-1-1. 공인 IP (WAN)
해당 라우터에는 고유한 논리적 주소, 즉 IP 주소가 배정이 됩니다.
이러한 IP 주소를 공인 IP (public IP)라고 부릅니다.
라우터를 이용하려면 WAN에 케이블을 먼저 꽂아야 합니다.
WAN은 Wide Area Network의 줄임말로
지역 네트워크들을 연결해주는 광범위한 네트워크입니다.
광역 통신망이라는 단어 많이들 들어보셨을텐데,
그 광역 통신망이 바로 이 WAN을 의미합니다.
2-1-2. 사설 IP (LAN)
LAN은 Local Area Network의 줄임말로
하나의 라우터를 중심으로 연결된 네트워크를 의미합니다.
예를 들자면, 우리집 라우터로 연결된 컴퓨터, 핸드폰, 복사기 등의 연결을 LAN이라고 할 수 있죠.
LAN 내부의 기기들도 각자의 IP 주소를 가지고 있습니다.
이 IP 주소를 사설 IP (가상 IP) 라고 부릅니다.
LAN 내의 기기들은 라우터의 공인 IP를 통해 외부의 인터넷과 통신합니다.
공인 IP와 달리 사설 IP는 다른 네트워크에서는 통용되지 않으며,
별개의 네트워크라면, 같은 사설 IP를 가져도(중복) 상관이 없습니다.
따라서 부족한 IP 주소 pool을 효율적으로 쓸 수 있습니다.
(인터넷 산업이 엄청나게 발전하며 옛날의 IP 주소 체계로는 전 세계 기기들을 포용하지 못하게 됨)
하지만 IP만으로는 완벽한 통신을 하기는 어렵습니다.
주소에 맞게 찾아간 컴퓨터가 여러 서버를 구동중이라면?
중간에 데이터가 소실되었다면??
내가 보낸 데이터의 순서가 뒤죽박죽으로 보내진다면??? (데이터는 잘게 잘라서 전송됨)
수신자의 컴퓨터가 꺼져있다면?????
위와 같은 문제를 보완해주는 것이 TCP와 UDP 프로토콜입니다.
(프로토콜: 통신 규약)
데이터의 전송과정에서 문제가 발생했을때 처리하는 역할을 하며
TCP는 신뢰성을, UDP는 속도를 중요시한다는 차이가 있습니다.
두 프로토콜은 헤더 포맷 구성도 다른 모습을 하고 있지만
공통점이 있다면 바로 포트 번호를 내포하고 있다는 점입니다.
하나의 컴퓨터는 여러개의 프로세스를 동시에 구동합니다.
(게임, 음성채팅, 파일 다운로드, 메일 수신 등등의 작업은 동시에 발생 가능)
따라서 전송되는 데이터의 서비스유형을 명시해야 합니다.
IP 주소는 컴퓨터를 찾기 위한 주소라면
포트는 컴퓨터 내 프로세스를 찾아가는 주소라고 할 수 있습니다.
그리고 0번부터 1023번까지의 포트는 well-known 포트라 하여
어플리케이션을 개발할때 사용하지 않는 것이 좋습니다.
(WWW 서비스의 80번 포트, 메일 송수신 서비스의 25번, 110번 포트 등)
TCP 프로토콜은 정보유실 없는 통신을 보장하는 것과
분할된 데이터(패킷)가 잘 전송되었는지 확인하는 것이 주된 목표입니다.
이렇게 신뢰성이 우선시되는 TCP이기 때문에 송수신자는 일 대 일로 통신합니다.
3-2-1. 연결 보장 (3-way Handshake)
TCP 프로토콜은 서로의 통신 상태를 먼저 체크한 뒤 데이터를 주고받습니다.
이때 사용되는 것이 컨트롤 플래그(control flag)입니다.
여섯가지의 항목이 있는데, 해당되는 항목에 1을 표기해 전송합니다.
URG | ACK | PSH | RST | SYN | FIN |
긴급 데이터 | 통신 개시 확인 | 어플리케이션에 전달 | 통신 강제 해제 | 통신 개시 요청 | 통신 종료 요청 |
0 | 1 | 0 | 0 | 1 | 0 |
3-2-2. 순서 보장 (SEQ, ACK)
데이터는 통째로 전송되지 않고 일정한 단위로 분할되어 전송되는데,
시퀀스 번호, ACK 번호가 이 데이터 조각들이 손실되거나 순서가 바뀌는 일을 방지합니다.
시퀀스 번호(SEQ)는 데이터의 순서를 나타내고
ACK 번호는 데이터를 순서에 맞게 받았을 때 보내는 신호입니다.
(예: 1번을 잘 받았다면 2번을 달라는 의미로 ACK = 2 를 전달)
송신 도중에 데이터가 유실되는 경우도 있는데
이럴때는 수신자 측에서 확인 응답을 보낼 수 없습니다.
이때 발신자 측은 확인 응답을 받을때까지 데이터를 재전송하며
일정 횟수 이상 재전송해도 응답이 없을시 발신자 측에서 강제로 통신을 해제합니다. (RST = 1)
(+추가, 윈도 사이즈)
이렇게 하나씩 주고받는 것은 효율이 떨어지기 때문에
통신을 시작할 때 윈도 사이즈를 설정하여 그 사이즈만큼을 모아 보낼 수도 있습니다.
UDP는 앞서 말한 TCP의 기능들을 전혀 가지고 있지 않습니다.
이렇듯 데이터 전송을 보장하지 않는 UDP는 특수한 용도로만 사용됩니다.
속도가 중요한 실시간 스트리밍, 음성데이터와 같이
응답 시간에 예민한 청각적, 시각적인 정보를 전달할 때 UDP 프로토콜을 따릅니다.
지금까지의 과정을 거친 데이터를
사람이 이해할 수 있는 형태로 보여주는 것이 애플리케이션(층)입니다.
클라이언트(보통 웹 브라우저)와 서버의 명칭이 생겨나는 것도 바로 이 시점입니다.
지금까지의 데이터들은 비트 기반으로 처리가 되었는데,
애플리케이션(층)으로 오면 프로토콜 기반이 문자로 전환됩니다.
애플리케이션의 프로토콜은 엄청나게 많은 종류가 있습니다.
HTTP, HTTPS같은 일반 사용자들도 친숙한 데이터 프로토콜이나
DNS, NAT과 같은 네트워크 관리자용 컨트롤 프로토콜이 이에 포함됩니다.
그 중 가장 대표적인 HTTP와 DNS에 대해서 아주! 간단하게 설명하고자 합니다.
HTML, TEXT, IMG, JSON, XML 등등 우리가 개발을 하면서
한번쯤은 써봤을법한 데이터들은 모두 HTTP를 통해 전송됩니다.
4-1-1. connectionless (비연결성)
HTTP는 하나의 요청(request)에 하나의 응답(response)을 반환하는 간단한 프로토콜입니다.
요청이 있을때만 연결을 주고받으니 서버의 자원을 최소한으로 유지할 수 있습니다.
4-1-2. stateless
이렇게 한 번 데이터를 주고 받고 완결된 통신의 내용은 기억되지 않습니다.
이런 상태를 stateless라고 합니다.
데이터를 빠르고 확실하게 넘기기 위해 선택된 방안입니다.
한 서버에 문제가 생겨도 다른 서버로 넘기면 되니
서버관리자 입장에서도 매우 효율적입니다.
하지만 매번 새로운 통신을 할때마다 과거의 정보가 잊혀진다면
인터넷 사용은 여간 불편한 게 아닐 것입니다.
예를 들어, 로그인 여부에 대한 정보는 통신이 바뀌어도 유지가 되어야합니다.
이를 보완하기 위해 세션이나 쿠키를 이용해 교환되는 정보를 저장할 수 있습니다.
DNS는 도메인 주소를 IP 주소로 변환하는 역할을 합니다.
구글에 접속할때 우리는 구글 서버 컴퓨터의 IP 주소를 직접 치지 않습니다.
그저 www.naver.com 이라는 도메인만 주소창에 치면 구글과 연결됩니다.
이 도메인이 필요한 이유는,
1. 일반 이용자에게 더 익숙한 형태이며
2. IP 주소가 변경되어도 서비스를 이용하는데 무리가 없다
정도로 이해할 수 있습니다.
지금까지 본 물리적인 인터넷 연결, IP, TCP/UDP, 애플리케이션,
이 모든 일련의 과정은 TCP/IP 프로토콜 스택에 담겨 있습니다.
현대 네트워크는 대부분 TCP/IP 프로토콜을 따르는데,
작업 단계를 크게 4가지로 나눈 것을 TCP/IP 4계층이라 합니다.
(어떤 곳은 5계층으로 구분하기도 함)
TCP/IP 프로토콜 스택이 나타내는 것은 아래와 같습니다.
1. 데이터를 전기 신호로 바꾸기 (인캡슐레이션)
2. 수신자에게 보내기
3. 전기 신호를 데이터로 변환하기 (디캡슐레이션)
요청받은 데이터를 전송할 때 인캡슐레이션 과정을 거칩니다.
4계층 중 가장 위에서부터 아래로 진행되며
각 계층에서 처리된 작업 정보 (예: IP 주소 표기)를
데이터의 header에 계속 덧붙여 캡슐화합니다.
디캡슐레이션은 그 반대입니다.
4계층 중 가장 아래에서 위로 진행되며
각 계층에서 해당 계층에 대한 header 정보를 읽고 처리하며
작업이 끝나면 header를 버립니다.
아래 캡슐화 과정을 잘 표현한 것 같은 gif 이미지가 있어서 출처 남기고 공유합니다.
https://itexamanswers.net/cyberops-associate-module-5-network-protocols.html
참고
m.yes24.com/Goods/Detail/1401800
www.yes24.com/Product/Goods/93997435
www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
www.youtube.com/playlist?list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi
[인증/인가]Session(세션)과 Token(토큰)(JWT)의 차이점 (5) | 2021.04.07 |
---|---|
url 요소 이해하기 (0) | 2020.06.30 |
댓글 영역