네트워크

2025. 6. 24. 15:34·Study

네트워크의 구조

네트워크는 노드와 간선의 구조로 이루어져 있고, 각 노드를 호스트라고 한다. 우리가 사용하는 네트워크 기기가 호스트이다.

요청을 보내는 호스트를 클라이언트 응답을 보내는 호스트를 서버라고 한다.

네트워크 연결 구조는 여러가지가 있고, 네트워크 토폴로지라고 부른다.

LAN(Local Area Network)

근거리 네트워크를 의미하며, 가까운 거리를 연결하는 한정된 공간에서의 네트워크를 의미한다.

WAN(Wide Area Network)

WAN을 통해서 LAN 간의 통신이 이루어진다. 일반적으로 ISP라는 인터넷 서비스 업체가 구축하고 관리한다.

패킷

네트워크를 통해서 송수신되는 데이터의 단위. 페이로드, 헤더, 트레일러 라는 정보가 포함되어 있음.

OSI 7계층

국제 표준화 기구에서 만든 네트워크 참조 모델, 통신 단계를 7계의 계층으로 나눔

  • 물리 계층 : 가장 최하위 계층으로 비트 신호를 주고 받는 계층
  • 데이터 링크 계층 : 같은 LAN에 속한 호스트끼리 올바르게 정보를 주고 받기 위한 계층
    • MAC 주소를 사용하고, 물리계층의 정보에 오류가 없는지 확인
  • 네트워크 계층 : LAN을 넘어 다른 네트워크와 통신을 주고 받기 위해 필요한 계층
  • 전송 계층 : 패킷의 신뢰성을 보장하기 위한 계층
    • 포트를 통해 특정 응용 프로그램과의 연결 다리 역할 수행하는 기능도 함
  • 세션 계층 : 응용 프로그램 간의 연결 상태를 의미하는 세션을 관리하기 위한 계층
  • 표현 계층 : 인코딩, 압축, 암호화 같은 작업 수행
  • 응용 계층 : 가장 상위 계층으로, 사용자와 직접 상호작용하는 계층

캡슐화 / 역캡슐화

캡슐화 패킷을 송신하기 위해서는 상위계층으로부터 내려받은 패킷을 페이로드로 만들어 각 계층에 포함된 프로토콜의 헤더나 트레일러를 덧붙여서 다음 하위 계층으로 전달하는 것이다. 다음 계층에서는 전달받은 데이터를 토대로 반복한다.

역 캡슐화는 위 과정을 반대로 진행하는 것으로, 전달받은 데이터에서 헤더를 확인한 뒤 제거하는 과정을 의미한다.

물리 계층 & 데이터 링크 계층

이더넷

국제 표준화된 기술로, 유선 LAN 대부분이 이더넷 표준을 따르기 때문에 대다수의 LAN 장비들이 특정 이더넷 표준을 따른다

이더넷 표준이 달라지면 신호 송수신 방법, 최대 지원 속도가 달라질 수 있다.

이더넷 프레임의 구조

MAC 주소는 네트워크 인터페이스마다 하나씩 부여되는 주소로, 물리적 주소라고도 한다.

 

통신 매체

통신 매체는 유선 매체와 무선 매체로 나눌 수가 있다. 유선매체로는 보통 랜선이라고 부루는 트위스티드 페어 케이블을 이용한다. 무선 매체로는 전파를 이용하는데, 우리가 흔히 사용하는 와이파이가 전파를 이용한 것이다.

와이파이에 주로 사용하는 주파수 대역은 2.4 / 5 GHz인데 같은 주파수 대역을 사용하는 무선 네트워크가 여러개 존재할 수 있다.
전파 통신을 주고 받을 때 주파수 대역이 겹치면 간섭이 일어날 수 있기 때문에 채널이라는 하위 주파수 대역을 사용하여 구별한다.

NIC(Network Interface Card)

NIC란 컴퓨터를 네트워크에 연결해주는 하드웨어 장치이다. 흔히 랜카드 라고 불리며 MAC 주소를 가지고 있다.

대부분의 pc에의 메인보드에 NIC가 내장되어 있고, 외장형으로 USB 타입도 존재한다.

여러 물리적 NIC를 하나의 고속 NIC 처럼 구성하는 것도 가능하다. => 티밍 OR 본딩 이라고 부름

허브

여러 대의 호스트를 연결하는 장치이다. 허브는 전달 받은 신호를 모든 포트로 내보내고, 반이중 모드로 통신한다는 특징이 있다.

반이중 모드란?
송신과 수신을 동시에 할 수 없는 모드. 한번에 하나밖에 못함

스위치

허브의 한계를 보완하기 위해서 만들어진 네트워크 장비이다. 스위치는 허브와 달리 전달받은 신호를 목적지 호스트가 연결된 포트에만 전달하고, 전이중 모드를 지원한다.

스위치가 목적지 포트에만 신호를 전달할 수 있는 이유는 스위치에 어떤 포트에 어떤 MAC 주소를 가진 호스트가 연결되어 있는지에 대한 정보가 있기 때문이다. 이 정보는 테이블 형태로 저장되어 있는데 MAC 주소 테이블 이라고 한다.

스위치에 한가지 기능이 더 있는데, 이것은 VLAN이라는 기능이다. VLAN은 가상 LAN을 의미하고, 스위치에 연결된 호스트를 하나의 네트워크로 간주하고 싶지 않을 때 사용한다. VLAN으로 네트워크를 나누면 브로드캐스트 메시지가 다른 네트워크에 도달하지 않는다.

전이중 모드란?
송신과 수신을 동시에 할 수 있는 모드

네트워크 계층

IP(Internet Protocol)

IP는 통신 과정에서 호스트를 특정하고, 데이터를 여러 패킷으로 올바르게 쪼개어 보내기 위해 만들어진 프로토콜이다.

IP 주소는 총 4바이트의 크기로 구성되고, 숫자당 8비트로 표현된다. 점으로 구분된 하나의 10진수를 옥텟이라고 한다.

IP 패킷의 크기가 MTU보다 클 경우에는 여러 패킷으로 쪼개서 전송한다.

MUT란?
최대 전송 단위로,
프레임을 통해서 주고받을 수 있는 최대 페이로드 크기이다. 일반적인 MTU 크기는 1500바이트이다. 

 

IP 패킷 헤더에는 식별자, 플래그 ,단편화 오프셋이 있다.

  • 식별자 : 패킷을 식별하기 위해서 사용되는 필드. 같은 정보에서 쪼개진 패킷은 같은 식별자 공유 -> 단편화된 패킷 식별 가능
  • 플래그 : 단편화를 수행하지 말라/ 단편화된 패킷이 더 있다 는 표시를 남기기 위한 필드
  • 단편화 오프셋 : 이 패킷이 초기 데이터에서 얼마나 멀리 떨어져 있는지에 대한 필드. 단편화 된 패킷 재조합할 때 사용
IP는 신뢰할 수 없는 프로토콜이자, 비연결형 프로토콜이다.

클래스풀 주소 체계

IP 주소는 네트워크 주소와 호스트 주소로 나눌 수 있는데, 이 크기를 유동적으로 선택할 수 있다.

a처럼 호스트 주소의 크기를 크게 할 수도 있고 c처럼 네트워크 주소의 크기를 크게 할 수도 있다.

 

해당 네트워크 자체를 의미하는 주소는 호스트 주소가 전부 0이고 브로드 캐스트를 위한 주소는 호스트 주소가 모두 1이다.
특수 목적을 위해서 예약된 IP 주소도 있고, 루프백 주소라는 자기 자신을 가리키는 주소도 존재한다.(로컬호스트)

 

A,B,C 클래스는 하나의 옥텟 전체를 호스트로 쓰거나 네트워크 주소로 써야하기 때문에 애매한 수의 호스트를 만들기 위해서는 낭비되는 호스트 수가 많아진다. 이 때 서브네팅을 사용하여 원하는 만큼 호스트를 더 만들 수 있다.

공인 IP/사설 IP

공인 IP 주소는 전세계에 하나밖에 없는 고유한 주소로, 우리집의 공유기의 주소가 공인 IP이다. 주로 ISP나 공인 IP 주소 할당 기관을 통해 할당받을 수 있다. 사설 IP는 공유기 내에 여러 네트워크가 연결되어 있는데 LAN으로 통신하기 위해 공유기에서 기기에 DHCP를 통해서 할당해 준다. 사설 IP는 특정 네트워크 내에서만 인식하기 때문에 다른 네트워크에서 사용하는 주소와 동일해도 무방하다.

ICMP

IP 패킷의 전송 과정에 대한 피드백 메시지를 얻을 수 있는 프로토콜.

ARP

IP주소는 알고 MAC 주소는 모를 때 사용, 네트워크에 있는 모든 호스트에게 메시지를 보내고 해당 IP 주소를 가진 호스트로 부터 응답이 왔을 때 MAC 주소를 찾아서 ARP 테이블에 저장한다. 이후에 같은 주소에 요청을 보내면 ARP 테이블에서 가지고 옴. (캐싱)

ARP는 같은 네트워크에서만 동작한다. 공인 IP나 다른 네트워크의 MAC는 ARP로 알 수 없고 라우터를 이용해야 

전송 계층

포트를 통한 프로세스 식별

패킷이 최종적으로 도착해야 하는 곳은 호스트가 아니라 호스트가 실행하는 프로세스이다. 네트워크 상에서 호스트가 실행하는 프로세스는 포트 번호를 통해서 식별할 수 있다.

전송계층에는 TCP와 UDP가 있는데 이 프로토콜 헤더에 송신지 포트와 수신지 포트 정보가 담겨있다.

포트의 개수는 2^16 개이고 범위에 따라 3가지 종류로 나눠진다.

  • 잘 알려진 포트 : 0 ~ 1023
  • 등록된 포트 : 1024 ~ 49151
  • 동적 포트 : 49152 ~ 65535

잘 알려진 포트는 범용적으로 상요하는 프로토콜이 사용하는 포트 번호 목록이다. 등록된 포트는 잘 알려진 포트보다는 덜 범용적이지만 흔하게 사용되는 프로토콜이다. 동적포트는 자유롭게 사용 가능한 포트로, 우리가 실행하는 프로그램이 이 범위의 포트를 할당받는다.

우리가 외부 네트워크와 통신을 할 때 공유기에서 NAT 기능을 활용해 사설 IP -> 공인 IP로 변환해 주는 작업을 하는데 이렇게 하면 사설 IP 하나에 공인 IP 하나가 할당되어야 하기 때문에 IP 부족 현상이 일어난다.
이를 방지하기 위해 NAPT라는 것을 활용하는데 다른 사설 IP를 같은 공인 IP로 변환하면서 포트를 통해서 구분하는 방법이다. 이렇게하면 공인 IP 주소 부족 문제를 해결할 수 있다.

 

TCP 과정

TCP의 수립

TCP는 3-way-handshake를 이용하여 연결을 수립한다.

  1. [A -> B] SYN 세그먼트 전송
  2. [B -> A] SYN + ACK 세그먼트 전송
  3. [A -> ACK] 세그먼트 전송

TCP의 기능

TCP는 송수신 과정에서 잘못된 세그먼트가 있을 경우, 같은 세그먼트를 재전송한다. 잘못되었는지 인지하는 방법은 중복된 ACK 세그먼트가 도착했을 때, 타임아웃이 발생했을 때이다.

TCP는 하나의 요청을 보내고 그에 해당하는 ACK가 올 때까지 기다려야 하는데 그렇게 되면 대기하는 시간이 발생한다. 이를 방지하기 위해서 파이프라이닝 기법을 사용하는데 파이프라이닝은 요청에 해당하는 응답이 오지 않아도 다음 요청을 보낼 수 있다.

 

수신 호스트가 한번에 N개의 바이트를 전송할 수 있어도 송신 호스트가 N개의 바이트를 처리할 수 없으면 소용이 없다. TCP의 연결 과정에서 수신 호스트는 윈도우 필드에 처리 가능한 양을 알려주고 , 송신 호스트가 전달받은 값을 토대로 세그먼트를 전송한다.

 

송신 호스트가 주체적으로 얼마나 네트워크가 혼잡한지 판단하고, 혼잡 정도에 따라 세그먼트의 전송량을 조절하는 역할을 해준다.

전송량은 혼잡 제어 알고리즘을 통해 결정하는데 대표적으로는 AIMD라는 알고리즘을 사용한다. AIMD는 응답이 오기까지 혼잡이 감지 되지 않으면 혼잡 윈도우를 1씩 선형적으로 증가시키고, 혼잡이 감지되면 혼잡 윈도우를 절반으로 떨어뜨리는 동작을 반복하는 것이다.

Q. TCP가 지금 상태가 혼잡이라고 판단하는 기준이 뭘까?

A. 주요 기준은 패킷의 손실이며 타임아웃이 발생했을 때와 3개 이상의 중복된 ACK가 수신되었을 때이다.

혼잡 윈도우란?
혼잡 없이 전송할 수 있을 정도의 양. 혼잡 윈도우가 작으면 네트워크가 현재 혼잡한 상황이고 크면 안정적인 상황.

TCP의 종료

TCP는 4-way-hanshake를 이용하여 연결을 종료한다

  1. [A -> B] FIN 세그먼트 전송
  2. [B -> A]  ACK 세그먼트 전송
  3. [B- - >A] FIN 세그먼트 전송
  4. [A -> B] ACK 세그먼트 전송

TCP의 특징은 상태를 유지하고 관리하는 스테이트풀 프로토콜이라는 것이다. TCP의 헤더에 있는 상태 정보를 통해서 현재 TCP의 상황을 판단할 수 있다.

Q. TCP가 스테이트풀 프로토콜로 만들어진 이유가 뭘까?

A. TCP는 데이터의 전송부터 끝까지 각 통신의 맥락을 기억하고 이를 기반으로 데이터의 신뢰성, 순서보장, 효율적인 전송을 보장해야 하기 때문이다.

응용 계층

DNS

네트워크 상에서 호스트를 식별하기 위해서는 IP주소를 사용해야 하는데, 이 IP 주소는 바뀔 수도 있고, 기억하기도 어렵기 때문에 도메인 네임이라는 것을 사용한다. 우리가 주로 쓰는 google.com, naver.com 등이 도메인 네임이다.

도메인 네임은 여러개로 쪼갤 수 있는데 전체를 나타내는 것이 전체 주소 도메인 네임(FQDN)이다.

도메인 네임은 다음과 같이 쪼갤 수 있다.

우리가 위와 같은 도메인 네임에 요청을 보내면 사용자 장치에서 DNS 쿼리가 발생하고, DNS 쿼리가 로컬 네임 서버로 전송된다. 로컬 네임서버는 자신이 가지고 있는 캐시에 해당 도메인 네임에 대한 IP가 있는 지 확인하고 있으면 해당 IP를 응답한다. 만약에 캐시에 해당 정보가 없다면 루트네임 서버부터 시작하여 권한이 있는 네임 서버들에게 IP를 알아낼 때 까지 질의한다. IP 주소를 알아내면 캐시에 저장하고 사용자에게 응답해준다.

URI/URL

URI는 웹 상에서 자원을 식별하기 위한 정보를 의미한다. URI는 URN과 URL로 나눌 수 있는데 URN은 이름을 기준으로 자원을 식별하는 방식이고 URL은 위치를 기준으로 자원을 식별하는 방식이다. 요즘은 거의 URL을 사용한다.

URL의 구조

  • scheme : 자원에 접근하는 방법. 프로토콜.
  • authority : 호스트를 특정할 수 있는 ip주소나 도메인 네임 : 뒤에 포트번호 명시
  • path : 자원이 위치하고 있는 경로
  • query : url에 대한 매개변수 역할
  • fragment : 자원의 일부분, 자원의 한 조각을 가리키기 위한 정보. 일반적으로 html 파일에서 특정 부분을 가리키는데 쓰임

HTTP

HTTP의 4가지 특징

  • 요청 응답 기반 프로토콜 : 요청과 응답을 기반으로 동작
  • 미디어 독립적 프로토콜 : 미디어 독립적
    • 여러가지 미디어 타입에 제한을 두지 않고, 독립적으로 작동 가능
  • 스테이트리스 프로토콜 : 상태를 유지하지 않음
    • 서버는 HTTP 요청을 보낸 클라이언트 관련 상태를 기억하지 않음
    • 동시에 처리해야 할 요청 메시지의 수가 너무 많이 때문에 모든 상태를 관리하기 어려움
    • HTTP는 확장성과 견고성을 설계 목표로 하기 때문에 특정 클라이언트가 특정 서버에 종속되면 안됨
  • 지속 연결 프로토콜 : 지속 연결 지원
    • HTTP 1.1 버전 이상부터 지속 연결 (킵 얼라이브) 지원
    • 하나의 TCP 연결에서 여러개의 HTTP 요청과 응답 가능
    • HTTP 2.0 버전부터는 멀티 플렉싱을 지원 - 여러개의 독립적인 스트림으로 병렬적으로 요청-응답 주고 받는 기술
      • HOL 블로킹 문제를 완화한 버
HTTP 3.0 부터는 TCP가 아니라 UDP를 기반으로 한 QUIC라는 프로토콜을 사용한다.
QUIC는 단 한번의 왕복으로 연결하고 이전에 연결했던 서버의 경우 0-RTT 연결을 지원하여 즉시 데이터 전송 가능.
QUIC는 특히 웹, 스트리밍 서비스, 모바일 등 지연 시간에 민감하고 동시 요청이 많은 환경에서 TCP보다 뛰어난 성능.

HTTP 구조

 

HTTP 메시지가 요청 메시지일 경우 시작라인은 요청 라인이 되고 HTTP 메시지가 응답 메시지일 경우 시작 라인이 상태라인이 된다.

요청 라인은 메서드, 요청 대상, HTTP 버전으로 이루어져 있고, 응답 라인은 상태 코드, 이유 구문, HTTP 버전으로 이루어져 있다.

요청 라인의 메서드는 GET, POST, PATCH 등을 말하고, 응답라인의 상태코드는 200,404,500 과 같은 코드를 말한다.

 

HTTP 메시지의 필드라인은 헤더를 뜻하는데 요청 라인은 주로 Host, User-Agent, Referer가 있다.

  • Host : 요청을 보낼 호스트가 명시되는 헤더. 도메인 네임이나 IP 주소
  • User-Agent : 클라이언트 측의 프로그램. 브라우저의 종류, 운영체제, 아키텍처, 렌더링 엔진 등의 정보 명시
  • Referer : 클라이언트가 요청을 보낼 때 머무르던 URL
  •  

응답 라인은 주로 Server, Allow, Location이 있다.

  • Server : 서버 호스트와 관련된 정보
  • Allow : 처리 가능한 http 헤더 목록
  • Location : 클라이언트에게 자원의 위치를 알려주기 위해 사용. 리아이렉션

둘다 사용하는 헤더

  • Date : 메시지 생성 날짜와 시각
  • Content-Length : 본문의 바이트 단위 크기
  • Content-Type, Content-Language, Content-Encoding : 미디어 타입, 언어, 인코딩 방식
  • Connection : 메시지를 송신하는 호스트가 어떤 방식의 연결을 원하는지

쿠키

HTTP의 스테이트리스한 특성을 보완하기 위한 대표적인 수단으로, 서버에서 생성되어 클라이언트 측에 저장되는 데이터.

클라이언트는 서버로부터 받은 쿠키를 주로 브라우저에 저장해 두었다가 추후 같은 서버에 요청을 보낼 때 자동으로 요청 메시지에 쿠키를 포함하여 전송함.

하지만, XSS 공격이나 CSRF 공격에 취약하고, 쿠키의 용량이 4KB라는 제한이 있다. 

세션

세션은 서버측에서 사용자 정보를 저장하고 관리하는 방식이다. 클라이언트는 서버에 저장된 세션 정보를 식별할 수 있는 고유한 세션ID를 가지고 있고, 이 세션 ID를 통해 자신의 세션 정보를 조회한다.

사용자 정보가 노출되지 않기 때문에 쿠키보다 보안성이 높고, 서버에 저장되기 때문에 클라이언트의 용량 제한을 받지 않음

하지만, 여러 서버로 구성된 시스템에서 사용자가 로그인 할 떄 마다 다른 서버로 요청이 분산된 경우, 해당 세션 정보가 다른 서버에 없는 문제가 발생하고, CORS 문제가 있다.

토큰

사용자의 정보를 암호화해서 클라이언트와 서버간 통신을 하는 것이다. 각 요청마다 토큰만 검증하면 되므로 분산 시스템에 적합하고, 토큰은 요청 헤더에 포함되므로 쿠키와 달리 도메인 제한 없이 다른 도메인으로 요청을 보낼 수 있어 CORS 문제에서 자유롭다.

모바일 앱에서는 쿠키를 사용하기 어렵거나 복잡한데 토큰은 이러한 제약이 없다.

캐시

응답받은 자원의 사본을 임시 저장하여 불필요한 대역폭 낭비와 응답 지연을 방지하는 기술. 캐시는 임시 저장하고 있는 정보기 때문에 중간에 원본 데이터가 변경 될 수 있다. 캐시는 유효 기간이 있는데 이 유효기간이 만료되면 서버에게 원본 자원이 변경된 적이 있는지를 물어보고 새로운 자원을 받아오거나 유효기간을 연장한다.

캐시를 사용할 때 먼저 이 자원이 변경되었는지 서버에게 물어보는 작업을 해야하는데 이 작업을 '조건부 요청'이라고 한다.

HTTPS

HTTPS는 HTTP에 SSL 또는 TLS가 추가된 프로토콜이다. TLS는 SSL을 계승한 프로토콜이고 최근에는 TLS 1.3버전을 사용한다. TLS 핸드셰이크의 핵심 기능은 암호화 통신을 위한 키를 생성하고 교환할 수 있다는 점이고, 또 하나는 인증서 송수신과 검증이 이루어질 수 있다는 점이다.

TLS 핸드셰이크 과정은 먼저 클라이언트가 ClientHello 메시지에 암호스위트를 포함해서 전송하고, 서버는 응답으로 ServerHello를 전송한다. ClientHello가 메시지가 암호화 이전에 맞춰야 할 정보들을 제시하는 메시지라면, ServerHello는 제시된 정보를 선택하는 메시지이다. 

포워드 프록시와 리버스 프록시

클라이언트와 서버 사이에는 수많은 네트워크 장비와 중간 서버들이 있다. 대표적인 중간 서버에는 프록시와 게이트웨이가 있다. 프록시는 포워드 프록시, 게이트웨이를 리버스 프록시 라고 부른다.

프록시는 클라이언트가 선택한 메시지 전달의 대리자로, 주로 캐시 저장, 클라이언트 암호화 및 접근 제한 등의 기능을 한다.

게이트웨이는 오리진 서버로 향하는 요청 메시지를 받아서 오리진 서버들에 전달하는 문지기 역할을 수행한다.

Q. 포워드 프록시 서버는 어디서 설정하는 걸까?

ISP에서 포워드 프록시로 이동시키고 자세한 내용은 ISP에서 알고 있지만 일반 사용자는 알 수 없음.

로드 밸런싱

서버의 고가용성을 보장하기 위해서 스케일 아웃을 했을 때 각 서버의 분배를 고르게 하고 특정 서버가 원하는 요청을 받을 수 있도록 하는 기술이다. 고른 분배를 위해서 사용하는 알고리즘으로 라운드 로빈 알고리즘, 최소 연결 알고리즘 등이 있다.

필요할때마다 시스템을 동적으로 확장하고 축소할 수 있는 오토스케일링 이라는 기능이 있다.

'Study' 카테고리의 다른 글

데이터베이스  (1) 2025.07.01
데이터베이스 성능 최적화  (0) 2025.06.20
RDBMS VS NO SQL  (2) 2025.06.06
해시 테이블 & 트리  (0) 2025.06.03
컴퓨터 구조  (0) 2025.05.20
'Study' 카테고리의 다른 글
  • 데이터베이스
  • 데이터베이스 성능 최적화
  • RDBMS VS NO SQL
  • 해시 테이블 & 트리
onetaek
onetaek
finding-scholarship.vercel.app
  • onetaek
    원택투택
    onetaek
  • 전체
    오늘
    어제
    • 전체 (23)
      • Spring (13)
      • Docker (1)
      • Redis (3)
      • Study (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 숨은 장학금 찾기 사이트
  • 공지사항

  • 인기 글

  • 태그

    RDMBS
    Spring
    컴퓨터 구조
    No SQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
onetaek
네트워크
상단으로

티스토리툴바