[Network] 네트워크 정리

Hoon·2023년 1월 25일
2

Summary

목록 보기
4/5
post-thumbnail

네트워크 필수 지식을 정리한다.

면접을 위한 cs 전공지식노트를 중심으로 다양한 레퍼런스를 참고하여 정리했다.

Index

  1. 네트워크 기초
  2. TCP/IP 4계층 모델
  3. 네트워크 기기
  4. IP주소
  5. HTTP

네트워크 기초

네트워크: 노드들이 링크로 연결되어 있어서 리소스를 공유하는 집합. (노드: 서버, 라우터, 스위치 등. 링크: 유선 혹은 무선)

처리량과 지연시간

네트워크를 구축할 때는 많은 트래픽을 처리할 수 있고 지연시간이 짧으면 좋다.

처리량(Throughput): 성공적으로 전달된 데이터의 양. 네트워크 장치 간의 대역폭(주어진 시간동안 네트워크 연결을 통해 흐를 수 있는 최대 비트 수), 에러, 장치의 하드웨어 스펙 등에 영향을 받음. 단위로는 bps(bits per second)사용.

지연시간(Latency): 요청이 처리되는 시간. 메시지가 두 장치를 왕복하는데 걸린 시간. 지연 시간은 매체 타입(유/무선), 패킷 크기, 라우터의 패킷 처리 시간에 영향을 받는다.

네트워크 토폴로지와 병목 현상

네트워크 토폴로지란 노드와 링크가 배치되는 연결 형태를 의미한다.

트리 토폴로지: 트리형태로 배치. 노드의 추가 삭제가 쉬우며 특정 노드에 트래픽이 집중될 때 하위 노드에 영향을 미칠 수 있다.

버스 토폴로지: 중앙 통신 회선 하나에 여러개의 노드가 연결되어 공유하는 네트워크 구성을 말하며 LAN에서 사용한다. 설치 비용이 적고 신뢰성이 우수하며 노드를 추가하거나 삭제하기 쉽지만 스푸핑이 가능한 문제가 있다.

스타 토폴로지: 중앙에 있는 노드에 모두 연결된 네트워크 구성. 노드를 추가하거나 에러 탐지가 쉽고 패킷의 충돌 발생 가능성이 적다. 노드 장애시 에러 발견이 쉽고 다른 노드에 끼치는 영향이 적지만 중앙 노드에 장애가 발생하면 전체 네트워크 사용이 불가능하다. 설치 비용이 비싸다.

링형 토폴로지: 각 노드가 양 옆의 노드와 연결하여 고리형태를 띄는 토폴로지. 노드 수가 증가해도 네트워크상의 손실이 거의 없다. 노드 장애시 발견이 쉽지만 네트워크 구성 변경이 어렵고 회선에 장애가 발생하면 전체 네트워크에 영향을 크게 끼치는 문제가 있다.

메시 토폴로지: 그물망처럼 연결되는 토폴로지. 한 노드에 장애가 발생해도 여러개의 경로가 존재하므로 네트워크를 계속 사용할 수 있고 트래픽 분산 처리도 가능하다. 노드의 추가가 어렵고 구축 비용과 운용 비용이 고가이다.

병목 현상: 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한을 받는 현상을 말한다. 토폴로지가 중요한 이유는 병목 현상을 찾을 때 중요한 기준이 되기 때문이다.

네트워크 분류

규모를 기반으로 분류할 수 있다.

LAN(Local Area Network): 근거리 통신망. 전송 속도가 빠르고 혼잡하지 않다. ex) 건물 내부
MAN(Metropolitian Area Network): 도시 같은 넓은 지역 네트워크. LAN 보다는 혼잡하고 느리다.
WAN(Wide Area Network): 광역 네트워크로 국가 또는 대륙. 가장 느리며 혼잡하다.

네트워크 성능 분석 명령어

네트워크 병목 현상의 주된 원인은 다음과 같다.

  • 네트워크 대역폭
  • 네트워크 토폴로지
  • 서버 CPU, 메모리 사용량
  • 비효율적인 네트워크 구성

이때는 네트워크 문제인지 테스트 후 네트워크 문제라면 네트워크 성능 분석을 해야한다. 이때 사용되는 몇가지 명령어를 알아보자.

ping: ping(Packet INternet Groper)은 네트워크 상태를 확인하려는 대상 노드를 향해 일정 크기의 패킷을 전송하는 명령어. 핑을 통해 해당 노드의 패킷 수신 상태와 도달하기까지 시간등을 알 수 있으며 해당 노드까지 네트워크가 잘 연결되었는지 확인할 수 있다. TCP/IP 프로토콜중에 ICMP 프로토콜을 통해 동작한다.

netstat: 접속되있는 서비스들의 네트워크 상태를 표시하는데 사용되며 네트워크 접속, 라우팅 테이블, 네트워크 프로토콜 등 리스트를 보여준다. 주로 서비스의 포트가 열려있는지 확인할 때 쓴다.

nslookup: DNS에 관련된 내용을 확인할 때 쓴다. 특정 도메인에 매핑된 IP를 확인하기 위해 사용한다.

traceroute: 목적지 노드까지 네트워크 경로를 확인할 때 쓴다. 목적지 노드까지 도달할 때 어느 구간에서 느려지는지 확인하기 위해 사용.

ifconfig: IP 주소, 서브넷 마스크와 같은 정보 확인

TCP/IP 4계층 모델

인터넷 프로토콜 스위트는 인터넷에서 컴퓨터들이 정보를 주고받기 위한 프로토콜 집합으로 OSI 7계층이나 TCP/IP 4계층 모델을 중심으로 설명한다. TCP/IP 4계층은 애플리케이션 계층, 전송 계층, 인터넷 계층, 링크 계층으로 나뉜다. 각 계층은 서로 독립적이며 하위 계층의 기능만을 이용할 수 있고 상위 계층에게 기능을 제공한다.

이 계층들은 특정 계층이 변경되었을 때 다른 계층에 영향을 미치지 않도록 설계되었다. 예를들어 TCP에서 UDP로 전송 프로토콜을 변경했다고 해서 브라우저를 재설치해야하는 것은 아니다.

애플리케이션 계층

애플리케이션 계층은 HTTP, SSH, FTP, SMTP, DNS 등 응용프로그램이 사용되는 프로토콜 계층으로 웹 서비스, 이메일 등 서비스를 실질적으로 사람들에게 제공하는 계층.

전송 계층

전송계층은 송신자와 수신자를 연결해주는 통신 서비스를 제공하며 연결 지향 데이터 스트림 지원, 신뢰성, 흐름 제어를 제공할 수 있으며 애플리케이션과 인터넷 계층 사이의 데이터가 전달될 때 중계 역할을 한다. 포트 번호로 애플리케이션을 구분한다. 대표적인 프로토콜로 TCP와 UDP가 있다.

📌 컴퓨터 네트워크는 데이터를 패킷이라는 작은 단위로 분할 한 후 주고 받는다. 이 패킷 교환 방식은 데이터를 작게 쪼개 전송하므로 기존의 하나의 통신을 점유하는 회선 교환 방식에 비해 여러 상대와 통신할 때 효과적이라는 장점이 있다.

이런 패킷 교환 방식 때문에 데이터의 신뢰성과 순차성을 보장해야한다. 그래서 TCP가 필요하다.

TCP vs UDP

대부분은 신뢰성과 순차적인 전달이 필요하다. TCP(Trasmission Control Protocol) 는 이를 지원한다. TCP는 송신자와 수신자에 소켓이라는 EndPoint를 생성한다. TCP 연결 수립에는 3-way handshake를 통해 수립된다. 모든 TCP 연결은 Point to Point(각 연결이 정확이 2개의 엔드포인트를 가짐)와 Full-duplex(양방향 전송) 방식이다.

UDP(User Datagram Protocol) 는 비연결형 프로토콜이다. TCP와 달리 흐름제어, 오류제어 및 손상된 세그먼트에 대한 재전송을 지원하지 않는다. 종종 클라이언트는 서버로 짧은 요청을 보내고, 짧은 응답을 기대한다. 만약 요청 또는 응답이 손실된다면, 클라이언트는 time out 되고 다시 시도할 수 있으면 된다. TCP보다 간단하다.

UDP는 브로드캐스트와 멀티캐스트 기능이 있다.

게임 같은 경우 전송속도가 중요하여 UDP를 사용하지만, 데이터의 신뢰성 또한 중요하다. 이런 경우에는 애플리케이션 계층에서 흐름 제어나 혼잡 제어를 구현한다.

UDP를 사용한 것들에는 DNS가 있다. 어떤 호스트 네임의 IP 주소를 찾을 필요가 있는 프로그램은, DNS 서버로 호스트 네임을 포함한 UDP 패킷을 보낸다. 이 서버는 호스트의 IP 주소를 포함한 UDP 패킷으로 응답한다. 사전에 설정이 필요하지 않으며 그 후에 해제가 필요하지 않다.

TCP 3-way handshake

TCP는 신뢰성을 확보한 연결을 위해 3-way handshake 로 연결을 수립한다. 클라이언트와 서버가 통신할 때 다음과 같은 3단계를 거친다.

  1. SYN 단계: 클라이언트는 서버에 ISN(Initial Sequence Number; 초기 네트워크 연결을 할 때 할당된 고유 시퀀스 번호)을 담아 SYN(연결 요청 플래그)를 보낸다.
  2. SYN+ACK 단계: 서버는 클라이언트의 SYN를 수신하고 서버의 ISN을 담아 SYN를 보내며 동시에 ACK(응답 플래그)로 클라이언트의 ISN+1을 담아 보낸다.
  3. ACK 단계: 클라이언트는 서버의 SYN에서 ISN+1 한 값을 ACK로 서버에 보낸다.

이렇게 3-way handshake 과정 이후 신뢰성이 구축되고 데이터 전송을 시작한다. seq number가 필요한 이유는 보안을 위해서이다.

TCP 4-way handshake

TCP가 연결을 해제할 때는 4-way handshake 과정이 발생한다.

  1. 클라이언트가 FIN으로 설정된 세그먼트를 서버에 보낸다. 그리고 클라이언트는 FIN_WAIT_1 상태로 들어가고 서버의 응답을 기다린다.
  2. FIN을 받은 서버는 ACK를 클라이언트에게 보내며 CLOSE_WAIT 상태로 들어간다. 이 때, 클라이언트는 ACK를 받으면 FIN_WAIT_2 상태로 들어간다.
  3. 일정 시간 이후에 서버는 클라이언트에 FIN 세그먼트를 보낸다.
  4. 클라이언트는 TIME_WAIT(소켓이 바로 소멸되지 않고 일정 시간 유지되는 상태를 말하며 패킷 지연등의 문제를 해결하기 위해 사용된다.) 상태가 되고 다시 서버로 ACK를 보내서 서버는 CLOSED 상태가 된다. 이후 클라이언트는 어느 정도 시간을 대기한 후 CLOSED 된다.

Port

  • Well Known Port: 0~1023
  • Registerd Port: 1024~49151
  • Dynamic Port: 49152~65535 (Client program)

Well Knwon Port example

  • FTP: 20
  • SSH: 22
  • SMTP: 25
  • HTTP: 80
  • HTTPS: 443

클라이언트와 서버가 통신할 때 클라이언트는 다이나믹하게 포트를 할당받는다. 서버는 같은 포트로 서비스하며 클라이언트의 포트와 어드레스의 조합으로 클라이언트를 식별한다.

인터넷 계층

인터넷 계층은 장치로부터 받은 네트워크 패킷을 IP 주소로 지정된 목적지로 전송하기 위해 사용되는 계층이다. IP, ARP, ICMP 등이 있으며 패킷을 수신해야할 상대 주소를 지정하여 데이터를 전달한다. 주소를 찾을 때 라우터를 사용한다. 비연결형적인 특징을 가지고 있다.

링크 계층

링크 계층은 전선, 광섬유, 무선 등으로 데이터를 전달하며 장치간에 신호를 주고받는 규칙을 정하는 계층. 물리 계층과 데이터 링크 계층으로 나누기도 하는데, 물리 계층은 0,1로 이루어진 데이터를 보내는 계층을 말하며 데이터 링크 계층은 '이더넷 프레임'을 통해 에러 확인, 흐름 제어, 접근 제어를 담당하는 계층을 말한다.

유선랜

전이중화 통신(양쪽 장치가 동시에 송수신할 수 있는 방식)을 사용한다.

무선랜

반이중화(양쪽 장치는 서로 통신할 수 있지만, 동시에는 불가능) 통신을 사용한다.

이더넷 프레임

데이터 링크 계층은 이더넷 프레임을 통해 전달 받은 데이터의 에러를 검출하고 캡슐화하며 다음과 같은 구조를 가진다.

  • Preamble: 이더넷 프레임이 시작임을 알림
  • SFD(Start Frame Delimiter): 다음 바이트부터 MAC 주소 필드가 시작됨을 알림
  • DMAC, SMAC: 수신, 송신 MAC 주소
  • EtherType: 데이터 계층 위의 계층인 IP 프로토콜을 정의. 예를 들어 IPv4, IPv6
  • Payload: 전달받은 데이터
  • CRC: 에러 확인 비트

계층 간 데이터 송수신 과정

데이터 송수신 과정은 데이터를 캡슐화 한 뒤 링크 계층을 통해 해당 서버와 통신을하고 비캡슐화 과정을 통해 데이터가 전송된다.

캡슐화 과정

캡슐화 과정은 상위계층의 헤더와 데이터를 하위 계층의 데이터부분에 포함시키고 해당 계층의 헤더를 삽입하는 과정을 말한다.

애플리케이션 계층의 데이터가 전송 계층으로 전달되면서 '세그먼트' 혹은 '데이터그램'화 되며 TCP(L4)헤더가 붙는다. 다음으로 인터넷 계층으로 가면서 IP(L3)헤더가 붙으며 '패킷'화 되고, 이후 링크 계층으로 전달되면서 프레임 헤더와 프레임 트레일러가 붙어 '프레임'화 된다.

비캡슐화 과정은 반대 순서로 발생한다.

PDU

계층에서 계층으로 데이터가 전달될 때 단위를 PDU(Protocol Data Unit)이라고 한다. PDU는 제어 관련 정보들이 포함된 헤더와 데이터를 의미하는 페이로드로 구성되어 있으며 계층마다 명칭이 다르다.

애플리케이션 계층: 메시지

전송 계층: 세그먼트(TCP), 데이터그램(UDP)

전송계층의 헤더는 데이터의 결합 순서와 이 데이터를 받을 프로그램을 식별할 수 있는 번호(포트)를 포함한다.

TCP 헤더에는 포트번호나 일련번호와 같은 정보가 포함되어있다.

TCP 헤더 중 컨트롤 비트는 현재의 통신 상태를 표현하는 플래그 역할을 하며, 통신상대에게 이 정보를 전달하여 TCP 통신을 제어하는 용도로 사용한다. 컨트롤 비트는 1bit를 차지하며 ON/OFF 두 가지 상태를 표현한다.

  • SYN: 접속을 시작할 때 ON
  • ACK: 이전 동작을 확인했다는 것. 확인 응답 번호와 조합해서 사용
  • RST: 이상 상황이 발생하여 접속이 강제 중단되었음.
  • CWR: 통신 경로가 혼잡해서 전송량을 줄여줄 것을 알려준다.
  • FIN: 데이터 송신이 완료되어 통신을 종료하고 싶다는 것.

커넥션을 맺을 때 송신 측과 수신측은 원활한 통신을 위해 일렬번호와 최대 세그먼트 크기를 서로 합의하고 조율하는 과정을 거친다.

인터넷 계층: 패킷

인터넷 계층의 헤더는 목적지의 컴퓨터를 식별할 수 있는 번호(IP)가 들어 있다.

링크 계층: 프레임(데이터 링크 계층), 비트(물리 계층)

네트워크 기기

네트워크 기기의 처리 범위

네트워크 기기는 계층별로 처리 범위를 나눌 수 있다. 상위 계층을 처리하는 기기는 하위 계층을 처리할 수 있지만 반대는 불가능하다.

  • 애플리케이션 계층: L7 스위치
  • 인터넷 계층: 라우터, L3 스위치
  • 데이터 링크 계층: 브리지, L2 스위치
  • 물리 계층: NIC, 리피터, AP

애플리케이션 계층을 처리하는 기기

L7 스위치

스위치: 네트워크 상에서 여러 장비를 연결하여 통신과 리소스 공유를 가능하게 해주는 장치

L7스위치는 로드밸런서라고도 하며, 서버의 부하를 분산하는 기기이다. URL, 서버, 캐시, 쿠키들을 기반으로 트래픽을 분산한다. 만약, 장애가 발생한 서버가 있다면 이를 트래픽 분산 대상에서 제외해야 하는데, 이는 정기적으로 헬스 체크를 이용하여 감시하면서 이루어진다.

L4 스위치와 L7 스위치 차이: 로드밸런서로는 L4, L7 스위치가 있다. L4 스위치는 전송 계층을 처리하는 기기로 IP와 포트를 기반으로(특히 포트를 기반으로) 트래픽을 분산한다. 반면 L7 로드밸런서는 포트 외에도 URL, HTTP 헤더, 쿠키 등을 기반으로 트래픽을 분산한다.

Health Check: 헬스 체크는 전송 주기와 재전송 횟수 등을 설정한 이후 반복적으로 서버에 요청을 보내는 것. 부하가 일어나지 않게 적절한 횟수로 요청을 보내야한다. TCP, HTTP 등 다양한 방법으로 요청을 보내는데 이 요청이 정상적으로 일어난다면 정상적인 서버라고 판별한다.

로드밸런서를 이용한 서버 이중화 가능하다.

인터넷 계층을 처리하는 기기

라우터, L3스위치가 있다.

라우터: 라우터는 여러 개의 네트워크를 연결, 분할, 구분해주는 역할을 하며, 다른 네트워크에 존재하는 장치끼리 데이터를 주고 받을 때 경로를 최적화하여 최소 경로로 패킷을 포워딩하는 역할을 하는 장비다.

L3 스위치: L2 스위치의 기능과 라우팅 기능을 갖춘 장비.

구분L2 스위치L3 스위치
참조 테이블MAC 주소 테이블라우팅 테이블
PDU이더넷 프레임IP 패킷
주소MAC 주소IP 주소

데이터 링크 계층을 처리하는 기기

L2 스위치와 브리지가 있다.

L2 스위치: L2 스위치는 장치들의 맥주소를 MAC 주소 테이블을 통해 관리하고, 연결된 장비로부터 패킷이 왔을 때 패킷 전송을 담당한다. IP 주소를 이해하지 못하며 단순히 패킷의 MAC 주소를 읽어 스위칭하는 역할을 한다. 목적지가 MAC 주소 테이블에 없다면 전체 포트에 전달하고 MAC 주소 테이블의 주소는 일정 시간 뒤에 삭제하는 기능도 있다.

브리지: 브리지는 두 개의 LAN 을 상호 접속할 수 있도록 하는 통신망 연결 장치로, 포트와 포트 사이의 다리 역할을 하며 장치에서 받아온 MAC 주소를 MAC 주소 테이블로 관리한다. 브리지는 통신망 범위를 확장하고 서로 다른 LAN 등으로 이루어진 하나의 통신망을 구축할 때 쓰인다.

물리 계층을 처리하는 기기

NIC: 네트워크 인터페이스 카드. 네트워크와 빠른 속도로 데이터를 송수신할 수 있도록 컴퓨터 내에 설치하는 확장 카드. 고유 MAC 주소가 있다.

IP 주소

ARP(Address Resolution Protocol)

컴퓨터간의 통신은 엄밀히 말하면 IP 주소에서 ARP를 통해 MAC 주소를 찾아 MAC 주소 기반으로 통신한다. ARP란 IP와 MAC 주소의 다리역할을 하는 프로토콜이다.

ARP를 통해 IP 주소(논리 주소)를 MAC 주소(물리 주소)로 변환하고, RARP를 통해 MAC 주소를 IP 주소로 변환해준다.

Hop by Hop 통신

IP 주소를 통해 통신하는 과정을 홉바이홉 통신이라고 한다. 통신망에서 각 패킷이 여러 개의 라우터를 건너가는 모습을 비유적으로 표현한 것. 수많은 서브네트워크 내에 있는 라우터의 라우팅 테이블을 기반으로 라우팅을 수행하며 최종 목적지까지 패킷을 전달한다.

라우팅 테이블: 라우터에 들어가있는 목적지 정보들과 그 목적지로 가기위한 방법이 있는 테이블. 게이트웨이와 모든 목적지에 도달하기 위해 거쳐야 할 다음 라우터의 정보를 가지고 있다.

게이트웨이: 게이트웨이는 서로 다른 통신망, 프로토콜을 사용하는 네트워크 간의 통신을 가능하게 해주는 관문 역할을 하는 컴퓨터나 소프트웨어.

Q. 게이트웨이와 라우터의 차이가 뭘까?

A. 라우터는 장비(물리)이고 게이트웨이는 IP(논리)이다.

IP 주소 체계

IP 주소체계로는 32비트를 8비트 단위로 표현하는 IPv4와 64비트를 16비트 단위로 표현하는 IPv6가 있다.

IP 주소의 앞부분은 네트워크 구별 주소(네트워크 대역주소)로 쓰이고 뒷 부분은 호스트 주소(해당 네트워크 안에서 식별가능한 주소)이다.

DHCP(Dynamic Host Configuration Protocol)

DHCP는 IP 및 기타 통신 매개변수를 자동으로 할당해주는 프로토콜이다.

NAT(Network Address Translation)

라우팅을 할 때 패킷의 IP 주소를 다른 IP 주소로 매핑하는 방법이다. IPv4의 한정된 IP 자원 때문에, IP를 Public IP 와 Private IP 로 나눠서 많은 주소를 처리한다. 사설 네트워크에서 외부 네트워크로 나갈 때 NAT를 통해 사설 아이피를 공인 아이피로 바꾼 뒤 통신을 한다.

  • 공유기와 NAT: 나트를 쓰는 이유는 하나의 공인 IP를 사용해서 인터넷에 접속하기 위함이다.
  • NAT와 보안: 내부 네트워크 주소를 변환하기 때문에 보안에 좋다.
  • NAT의 단점: 호스트의 숫자에 따라 속도가 느려질 수 있다.

✔ NAT 후 서버에서 클라이언트에게 응답을 보낼 때 어떻게 라우터가 Public IP 에서 Private IP를 변환하는가? -> Port로 구분한다. 포트포워딩과 같이 생각하면 좋다.

Proxy

프록시: 대리라는 의미로 프록시 서버란 클라이언트와 서버 사이에 위치하여 서버의 역할을 대리 해주는 서버. 캐시/보안/트래픽 분산 등의 장점을 가진다.

Forward Poxy

캐싱: 클라이언트가 요청한 내용을 캐싱해두어 서버의 부하를 줄여준다.
익명성: 클라이언트가 보낸 요청을 감춤. 서버에게 보내는 요청을 누가 보냈는지 알지 못하게 한다. 서버에게는 프록시 IP가 보여지기 때문.

Reverse Proxy

보안: 서버 정보를 클라이언트에게 숨길 수 있다. 실제 서버의 IP가 노출되지 않음.

로드밸런싱을 해준다.

HTTP

HyperText Transfer Protocol의 약자로 서버-클라이언트 모델을 따르고 request/response 를 통해 웹 상에서 리소스를 주고 받는 애플리케이션 계층 프로토콜이다. TCP/IP 기반으로 작동하며 ConnectionLess, StateLess 라는 특징을 가진다.

HTTP/1.0 부터 시작해서 HTTP/1.1, HTTP/2, HTTP/3 으로 발전 했다.

HTTP Connection less, State less

비연결형이라는 특징을 가진다. 이로써 서버 입장에서는 클라이언트의 동시 접속을 최소화하여 많은 요청을 처리할 수 있게 한다. 연결을 끊기 때문에 클라이언트를 상태를 알 수 없는 State less 특성을 가진다. 이전 상태를 알기 위해 session, cookie, jwt 등을 사용한다.

🤷‍♂️ HTTP는 TCP 기반인데 비연결형이고 TCP는 연결형?

HTTP 통신은 비연결형이라 데이터 송수신 후 연결을 끊는다. TCP는 연결형이라 의문이 들었다. HTTP 연결만 끊고 TCP 연결이 유지되어 있으면 서버 리소스는 마찬가지로 낭비되는거 아닌가?

-> HTTP 연결을 끊을 때 TCP 연결도 같이 끊는다. 매번 끊지않고 일정 시간 유지하려면 Keep-alive 를 사용하면 된다.

HTTP request, HTTP response

클라이언트가 http request를 서버로 보내면 서버에서 http response를 클라이언트로 보내는 방식이다.

  • request message는 startLine(Method, Path, HTTP Version), headers, body로 이루어져 있다.
  • response message는 statusLine(HTTP Version, Status Code, Status Message), headers, body로 이루어져 있다.

HTTP Method

GET VS POST

GET은 클라이언트가 서버에게 리소스를 요청할 때 주로 사용. POST는 데이터를 처리할 때 사용.
GET은 특정 정보를 요청할 때 URL 뒤에 Key-value 형태로 Query String을 붙여 요청한다. POST는 Body 부분에 포함하여 통신한다.
GET은 Query String으로 인해 브라우저에 남게되어 캐시가 되지만 POST는 안된다.

PUT, PATCH

리소스를 수정할 때 쓰인다. PUT은 모든 리소스, PATCH는 일부 리소스

HTTP Status Code

클라이언트가 보낸 요청에대한 서버의 응답 코드로, 요청의 상태에 대한 여부를 알 수 있다. 1xx 번 대 부터 5xx 번대로 나뉜다.

200번대는 성공, 400번대는 클라이언트 오류, 500번대는 서버 오류이다.

자주 쓰이는 Status Code

Status CodeMessageDescription
200OK요청 성공
201Created리소스 생성 성공
400Bad Request서버가 요청을 이해할 수 없음(데이터 형식 에러 등)
401Unauthorized인증이 필요한 리소스에 인증되지 않은 접근
403Forbidden인증된 상태에서 권한이 없는 리소스에 접근
404Not Found요청한 루트가 없음. 리소스가 없음
502Bad Gateway서버에서 예상하지 못한 에러 발생

HTTP/1.0

HTTP/1.0은 한 연결당 하나의 요청을 처리하도록 설계 되었다. 3-way handshake를 계속해서 해야하기 때문에 RTT(Round Trip Time) 증가를 불러오게 되었다.

RTT 증가를 해결하기 위해 이미지 스플리팅, 코드 압축, 이미지 Base64 인코딩을 사용했다.

HTTP/1.1

매번 TCP 연결을 수립하는 것이 아니라 한 번 연결 후 keep-alive를 통해 여러 개의 파일을 송수신 할 수 있도록 바뀌었다. 하지만 문서안에 포함된 다수의 리소스를 처리하려면 요청할 리소스 개수에 비례해서 대기 시간이 길어지는 단점이 있었다.

HOL Blocking

홀 블로킹은 네트워크에서 같은 큐에 있는 패킷이 그 첫 번째 패킷에 의해 지연될 때 발생하는 성능 저하 현상을 말한다.

무거운 헤더 구조

쿠키 등 많은 메타데이터가 들어 있고 압축 되지 않아 무거웠따.

HTTP/2

HTTP/1.x 보다 지연시간을 줄이고 응답 시간을 더 빠르게 할 수 있으며 멀티플렉싱, 헤더 압축, 서버 푸시, 요청의 우서순위 처리를 지원하는 프로토콜이다.

멀티플렉싱

여러 개의 스트림을 사용하여 송수신 하는 것. 이를 통해 특정 스트림의 패킷이 손실되었다고 하더라도 해당 스트림에만 영향을 미치고 나머지 스트림은 멀쩡하게 동작할 수 있다. 병렬 스트림을 통해 데이터를 서빙한다. 이를 통해 단일 연결을 사용하여 병렬로 여러 요청을 받을 수 있고 응답을 줄일 수 있다. 이로써 HOL Blocking 문제를 해결 할 수 있다.

헤더 압축

허프만 코딩 압축 알고리즘을 사용하여 헤더를 압축한다.

서버 푸시

서버가 클라리언트 요청 없이 리소스를 푸시할 수 있다. HTML은 css나 js 파일과 같이 사용하는데, 클라이언트가 HTML 파일을 요청할 때 서버가 그 안에 있는 css 파일을 푸시하여 클라이언트에게 먼저 줄 수 있다.

HTTPS

HTTP/2는 HTTPS 위에서 동작한다. HTTPS는 애플리케이션 계층과 전송 계층 사이에 신뢰 계층인 SSL/TLS 계층을 넣은 신뢰할 수 있는 HTTP 요청을 말한다.

SSL/TLS

전송 계층에서 보안을 제공하는 프로토콜이다. 클라이언트와 서버가 통신할 때 제 3자가 메시지를 도청하거나 변조하지 못하도록 한다.
보안 세션을 기반으로 데이터를 암호화 하며 보안 세션이 만들어질 때 인증 매커니즘, 키 교환 암호화 알고리즘, 해싱 알고리즘이 사용된다.

  • 보안 세션: 보안이 시작되고 끝나는 동안 유지되는 세션
  • 인증 매커니즘
    • 인증 매커니즘은 CA에서 발급한 인증서를 기반으로 이루어진다. CA에서 발급한 인증서는 안전한 연결을 시작하는 데 있어 필요한 '공개키'를 클라이언트에게 제공하고 사용자가 접속한 '서버가 신뢰'할 수 있는 서버임을 보장한다. 인증서는 서비스 정보, 공개키, 지문, 디지털 서명 등으로 이루어져 있다.
    • CA 발급과정: 자신의 서비스가 CA 인증서를 발급 받으려면 자신의 사이트 정보와 공개키를 CA 에 제출해야 한다. 이후 CA는 공개키를 해시한 값인 지문을 사용하는 CA 의 비밀키 등을 기반으로 CA 인증서를 발급한다.
  • 암호화 알고리즘
    • 디피 헬만 키 교환 알고리즘
    • 해싱 알고리즘

HTTPS 구축 방법

  • HTTPS 구축 방법은 크게 세 가지이다. 직접 CA 에서 구매한 인증서를 기반으로 HTTPS 서비스를 구축하거나, 서버 앞단의 HTTPS를 제공하는 로드밸런서를 두거나, 서버 앞단에 HTTPS를 제공하는 CDN을 둬서 구축한다.

HTTP/3

TCP 위에서 돌아가는 HTTP/2와 달리 HTTP/3은 QUIC라는 계층 위에서 돌아가며, TCP 기반이 아닌 UDP 기반으로 돌아간다.

HTTP/2의 장점인 멀티플렉싱을 가지고 있으며 초기 연결 설정 시 지연 시간 감소라는 장점이 있다.

초기 연결 설정 시 지연 시간 감소

QUIC는 TCP를 사용하지 않기 때문에 3-way handshake를 거치지 않아도 된다. 첫 연결 설정에 1-RTT만 소요 된다. 또한, 순방향 오류 수정 매커니즘이 적용되어 전송한 패킷이 손실되었다면 수신 측에서 에러를 검출하고 수정하는 방식이며 열악한 네트워크 환경에서도 낮은 패킷 손실률을 자랑한다.

www.naver.com 을 주소창에 입력했을 때 발생하는 일

  1. 전송할 HTTP request message를 생성한다.
  2. 메시지의 목적지인 URL 에 입력한 도메인주소의 IP를 찾는다. 이 IP를 찾기 위해 DNS 서버에 질의한다. DNS 서버는 계층화 되어있다. 루트 DNS 서버, 통신사 DNS 서버 등 계층화 되어있는 DNS 서버들을 통해 해당 Domain과 매칭되는 목적지 IP를 찾는다.
  3. 목적지 IP로 HTTP request message를 전달한다.
  4. 캡슐화 과정을 통해 메시지는 패킷이 되고 랜선과 라우터를 거쳐가며 목적지 IP에 패킷이 도달합니다.
  5. 서버에 도착한 패킷이 메시지로 역캡슐화 된다.
  6. HTTP request message를 기반으로 HTTP response message를 생성한다.
  7. 클라이언트가 서버에 메시지를 전송했던 방식 그대로 서버에서 클라이언트로 메시지를 전송한다.
  8. 클라이언트에서 수신된 HTTP response message를 기반으로 브라우저가 렌더링하여 화면에 출력한다.

쿠키, 세션

쿠키와 세션은 앞서 언급한 HTTP 프로토콜의 Stateless 특징 때문에 필요하다. 클라이언트에 대한 이전 정보를 가지고 있지 않기때문에 로그인을 했음에도 HTTP 요청마다 다시 로그인을 해야하는 등의 불편함이 있는데 이를 쿠키와 세션으로 해결한다.

쿠키

쿠키의 생성 과정

  1. 서버가 클라이언트에 요청을 받았을 때, 서버가 클라이언트에 대한 정보를 쿠키에 담는다.
  2. 서버가 response message의 header에 쿠키를 담아서 클라이언트에게 전송한다.
  3. 클라이언트가 메시지를 수신하면, 브라우저가 쿠키를 쿠키 디렉토리에 저장한다.

쿠키는 key-value 쌍으로 로컬에 저장되는 데이터이다. 유효시간 내에는 브라우저가 종료되도 유효하다. 클라이언트가 request message를 보낼 때, 브라우저가 쿠키를 헤더에 담아서 저장한다.

웹 브라우저가 쿠키 보안을 위해 하는 일 예시

1. 쿠키가 생성된 웹 서버와 동일한 도메인을 사용하는 웹 사이트에만 쿠키를 전송
2. 저장된 쿠키의 유효시간 체크 후 만료 시 폐기

세션

세션은 쿠키를 기반으로 구현된다. 서버는 클라이언트를 구분하기 위해 Session ID(식별 정보)를 부여하고 이를 쿠키에 저장한다. 사용자 정보를 쿠키에 저장하지 않고 서버에 저장한다. 세션은 유효기간이 있고, 브라우저가 종료되면 세션이 끊긴다.

쿠키와 세션의 차이

쿠키와 세션의 가장 큰 차이는 사용자 데이터를 클라이언트에 저장하는지(쿠키), 서버에 저장하는지(세션)이다.

세션은 서버에 저장하기 때문에 보안상 이점이 있지만, 서버 부하가 커진다는 단점이 있다.

또한 쿠키는 브라우저가 종료되도 유지되지만 세션은 끊기는 차이가 있다.

기타 알면 좋은 것들

  • NAT 를 사용하여 클라이언트의 주소를 변환한 뒤 서버와 통신을 한다면 수신할 때는 어떻게 다시 프라이빗 IP로

  • 이메일은 수신(POP)과 송신(SMTP) 프로토콜이 다르다.

Reference

1개의 댓글

comment-user-thumbnail
2023년 1월 26일

잘보고 갑니다!

답글 달기