WEEK 4-1: Spring 기본(1)

ensalada.de.pollo·2025년 5월 4일

be

목록 보기
13/44

인터넷

인터넷(Internet)은 Internet protocol suite(TCP/IP)를 기반으로 하여 전세계적으로 연결이 되어있는 컴퓨터 네트워크 통신망을 일컫는 말입니다.

물리적으로 연결이 되어 있기도 하고, 무선 인프라(인공위성 등)을 통해서도 연결이 되어있으며 이러한 방식으로 WWW(World Wide Web)과 같은 큰 네트워크가 구축되었습니다.

인터넷 프로토콜(Internet Protocol, IP)

인터넷 프로토콜은 네트워크 상에서 정보를 송수신하는 규칙을 의미합니다. IP라고 하면, 보통 숫자로 된 IP주소가 생각날 것인데, 이 IP 주소는 인터넷에서 서로를 식별하는 고유한 주소 역할을 합니다.

패킷(Packet)

인터넷에서는 데이터를 패킷(Packet)이라는 단위로 전송합니다. 패킷에는 출발지(src IP), 도착지(dest IP)가 포함되어 있어서 어떤 기기들이 데이터를 주고 받는지 알 수 있습니다. 패킷은 header, payload, trailer로 구성이 되어있으며, 데이터를 주고 받았는지는 수신을 확인하기 위한 목적 등의 응답이 오고갑니다.

IP의 한계

  • application 구분이 불가능하여 어떤 프로그램에 데이터를 전달할지 알 수가 없습니다.
  • 비연결성이기 때문에, 수신하는 대상의 상태와는 관계 없이 데이터를 전송합니다.
  • 비신뢰성이기 때문에, 패킷이 소실되거나 손상되어도 재전송하지 않고, 패킷의 순서를 보장하지 않습니다.

TCP(Transmission Control Protocol)

IP의 한계점을 보완하기 위한 프로토콜입니다.
서버와 클라이언트 간 데이터를 신뢰성있게 전달하기 위한 프로토콜입니다. 여기서 신뢰성을 보장하는 방법으로 3 Way Handshake라는 과정을 밟으며 논리적인 연결을 맺습니다.

3 Way Handshake

  1. 클라이언트가 서버에 SYN(접속 요청) 패킷을 보냅니다.
  2. 서버가 SYN/ACK(수락) 패킷을 클라이언트에 보냅니다.
  3. 클라이언트가 ACK(응답) 패킷을 서버에 보냅니다.

위 과정을 통해서 통신하는 양쪽 모두 데이터를 주고 받을 준비가 되었는지 확인하고 연결을 성립시킵니다. IP의 한계점을 보완하기 위한 프로토콜인 만큼, 신뢰성도 보장하고, 연결성도 보장합니다. 하지만 위와 같은 과정 때문에 통신에서 시간이 조금 더 오래 걸립니다.

UDP(User Datagram Protocol)

비연결성이고 신뢰성이 없는 프로토콜입니다. TCP와는 다르게 3 Way Handshake 없이 데이터를 빠르게 보낼 수 있습니다. 연결성을 보장하지 않고 신뢰성도 보장하지 않지만 빠르다는 장점이 있어 실시간성이 중요한 서비스(스트리밍, 게임 등)에서 많이 사용합니다.

그럼 IP랑 UDP의 차이는 무엇인가요?

IP는 어떤 application에 데이터를 전달해야하는지 모른다고 하였습니다. 네트워크 계층 구조에 따라서 IP는 3 계층인 네트워크 계층에 해당됩니다. 이는 출발지와 목적지 주소로만 패킷을 전달하게 됩니다.
이와 다르게 UDP는 4 계층인 전송 계층에 해당하여 어떤 application에 데이터를 전달해야 하는지 까지 구분할 수 있습니다. TCP도 마찬가지로 전송 계층에 해당합니다.

Port

TCP, UDP 모두에서 사용하는 개념입니다. 위에서 설명한 대로, IP는 주소만 구별을 할 수 있고, TCP와 UDP는 application까지 구분할 수 있다고 하였습니다.
여기서 application을 구분하는 방법으로 port를 사용하는 것입니다. IP가 아파트라면, PORT는 동, 호수를 의미합니다. 패킷에는 출발지 port와 도착지 port가 포함되어 있으므로, 이를 통해서 어떤 application으로 데이터를 전달할지 식별할 수 있습니다.

자주 사용하는 port

FTP: 20, 21(TCP)
SSH: 22(TCP)
HTTP: 80(TCP)
HTTPS: 443(TCP)
DNS: 53(TCP/UDP)
DHCP:67(UDP)

port는 0부터 65535까지 할당이 가능한데, 0부터 1023까지는 국제적으로 관리되는 예약 포트이기 때문에 이들은 주로 피해서 사용합니다.

Web

DNS(Domain Name System)

DNS는 도메인 이름과 IP 주소를 서로 변환하는 역할을 합니다.
도메인 이름이라는 것은 사람이 읽기 쉽고, IP 주소라는 것은 컴퓨터가 읽기 쉽습니다. 이 둘을 서로 변환해주기 때문에, IP 주소를 굳이 외우지 않아도 웹사이트에 접속할 수 있습니다.

DNS가 필요한 이유

  • IP는 외우기 쉽지 않고, 사이트마다 IP 주소가 바뀔 수 있습니다.
  • 유동 IP가 많기 때문에, IP 주소가 바뀌게 되면 직접 접근이 어렵습니다.
  • DNS는 IP가 바뀌더라도 DNS 서버에 등록된 IP 주소만 바꿔주면 그대로 사용하던 도메인 이름을 통해 접속할 수 있습니다.

DNS 동작 순서

  1. 웹 브라우저에 도메인 이름을 입력합니다.
  2. 브라우저는 PC나 네트워크에 저장된 캐시를 먼저 확인하고, 없다면 Local DNS에 IP 주소를 요청합니다.
  3. Local DNS에 정보가 없으면, Root DNS 서버, TLD 서버, Authoritative DNS 서버로 쿼리를 전달하고, 최종적으로 입력한 도메인의 IP 주소를 가져옵니다.
  4. IP 주소가 반환되면 브라우저는 해당 IP로 접속하여 웹사이트를 보여줍니다.

DNS의 장점

  • 숫자가 아닌, 도메인 이름만 외우면 되므로 이용이 편합니다.
  • IP가 바뀌어도 도메인은 그대로이기 때문에 혼동이 줄어듧니다.
  • 분산 구조로 되어 있기 때문에, 어디서나 빠르고 안정적으로 작동합니다.

URI vs. URL vs. URN

URI(Uniform Resource Identifier)는 인터넷 자원을 식별하는 고유 문자열입니다. URL과 URN은 URI의 하위 개념에 속합니다.

  • URL(Uniform Resource Locator): 자원의 위치를 나타냅니다. 계층 구조로 웹에서 리소스가 어디에 있는지 알려줍니다.
  • URN(Uniform Resource Name): 자원의 이름을 나타냅니다. 위치와 상관없이 고유하게 자원을 식별할 수 있습니다.

보통 URL을 많이 사용하고, URN은 많이 사용되지는 않습니다.

URL의 구조

scheme://user(:password)@host(:port)(/path)(?query)(#fragment)

  • scheme: 프로토콜을 명시합니다(http, https, ftp 등)
  • user(:password): host에 접속하는 사용자의 정보입니다
  • host: 도메인 이름 또는 IP 주소
  • port: 포트 번호(생략시 scheme의 기본값을 따라갑니다)
  • /path: 서버 내의 자원 경로
  • ?query: 추가 정보
  • #fragment: 문서 내 특정 위치(클라이언트에서만 사용합니다)

용어 정리

프로그램 명명규칙(casing)

  • snake_case: 단어와 단어 사리를 언더바(_)로 이어주고, 모든 글자를 소문자 또는 대문자로만 작성합니다.
  • camelCase: 첫 단어는 소문자로 시작하고, 이후 이어지는 단어는 첫 글자가 대문자로 시작하게끔 작성합니다.
  • PascalCase: 모든 단어의 첫 글자를 대문자로 시작합니다.
  • kebab-case: 단어와 단어 사이를 대시(-)로 이어주고, 모든 글자를 소문자로만 작성합니다.

JSON(JavaScript Object Notation)

클라이언트와 서버가 통신할 때 사용하는 데이터 형식입니다. 언어와 플랫폼에 상관없이 데이터를 주고받을 수 있게 해줍니다.

특징

  • snake_case, camelCase 모두 사용이 가능합니다.
  • 사람이 읽고 쓰기도 쉽고, 기계가 파싱하기에도 쉽습니다. 이전에 사용하던 XML보다 더 간결하고 용량이 작으면서 웹에서는 표준처럼 사용됩니다.
  • key-value 구조로 데이터를 표현하고, null, number, string, array, object, boolean 타입을 지원합니다.
  • MSA(MicroService Architecture) 환경에서도 서로 다른 언어를 사용하는 서비스들이 JSON으로 데이터를 주고 받으면서 통신합니다.

Scale Up, Scale Out

Scale Up(수직 확장)

서버를 한 대의 CPU, 메모리 등 하드웨어 성능을 높여서 처리력을 상승시키는 방법입니다. 단일 서버의 성능을 업그레이드 하는데, 성능이 좋아질 수록 비용이 기하급수적으로 증가합니다.

Scale out(수평 확장)

서버를 같은 사양의 서버들로 구성하는 방식입니다. 여러 대로 늘려 부하를 분산시킬 수 있어 동시에 더 많은 요청을 처리할 수 있습니다.

Stateful, Stateless

Stateful(상태 유지)

서버가 클라이언트의 상태 정보를 기억하는 것을 의미합니다.

Stateless(무상태)

서버가 클라이언트의 상태 정보를 기억하지 않는 것을 의미합니다.

Stateful vs. Stateless

Stateful의 방식은 서버가 클라이언트의 정보를 기억해야하기 때문에 서버가 종료되면 문제가 생기고, 리소스 또한 많이 차지하게 될 것입니다.
Stateless의 방식은 이와 다르게 클라이언트 측에서 필요한 상태 정보를 서버에게 보내야합니다. Scale out이 쉽고, 서버를 추가하거나 교체하여도 큰 문제가 없습니다. 다만, 클라이언트 측에서 보내는 데이터 전송량이 많아질 것입니다.

Connection vs. Connectionless

Connection(연결형)

클라이언트와 서버가 연결을 유지하면서 통신합니다. 연결을 계속 유지하지 때문에 응답 속도가 빠르지만, 서버 자원이 지속적으로 소모됩니다.

Connectionless(비연결형)

요청마다 연결을 새로 하고, 응답 후에는 연결을 종료합니다. 서버 자원을 효율적으로 사용한다는 장점이 있지만, 요청이 많아지는 경우에는 연결/해제 과정이 반복해서 발생하므로 overhead가 발생할 수 있습니다.

어떤 걸 사용하는가?

HTTP는 기본적으로 Connectionless 방식을 사용하지만, HTTP/1.1부터는 Persistent Connection(지속 연결)을 도입하여 여러 요청을 한 번의 연결로 처리하여 속도를 개선하였습니다.

자료 및 코드 출처: 스파르타 코딩클럽

0개의 댓글