라우터나 방화벽 등 네트워크 장치를 식별하기 위한 서버의 주소로 패킷을 전송하는 등 네트워크 간의 통신을 가능하게 한다. 패킷은 노드에서 노드로 전송된다.
L3 IP 패킷
: 패킷은 네트워크에서 전송되는 L3 수준에서 정의되는 데이터의 단위로 헤더(머리) + 페이로드(내용/데이터) + 트레일러(꼬리)로 구성된다.노드
: 유선 또는 무선으로 연결되어 네트워크 상 통신이 가능한 장치를 말한다.프로토콜
: 네트워크에서 통신하기 위해 정의된 규칙과 규약을 말한다. (ex) HTTPS, SMTP, SSLOSI 7 Layer / TCP/IP 모델
컴퓨터간의 데이터 통신을 단계적으로 처리하기 위해 표준화한 구조로 7개의 계층으로 나누어져 있고 각 계층마다 새로운 Header가 붙는다 실제로 이런 구조로 사용되지는 않는다
Application - presentation - session - transport - network - data link - physical
물리계층 : 데이터를 전기 신호
로 변환하여 송수신하는 역할을 한다.
데이터링크 계층 : 물리 계층에서 전송된 데이터를 프레임
(frame) 단위로 분할하고 데이터의 흐름과 접근을 관리한다. 프레임은 데이터링크 계층에서 정의되는 데이터 단위이다.
네트워크 계층 : 라우팅과 네트워크 간의 패킷 전달을 담당한다. 라우팅
은 목적지까지 데이터를 전송하는데 적절한 경로를 선택하는 과정을 의미한다.
전송 계층 : 서버와 클라이언트 간의 데이터 전송, 데이터의 분할, 오류 검출 및 복구, 흐름 제어 등을 담당합니다. 포트번호로 어떤 프로그램에 데이터를 전달해야하는지 식별한다.
세션 계층 : 세션을 설정, 유지 및 종료하는 역할을 한다.
표현 계층 : 데이터의 형식 변환, 암호화, 압축 등의 기능을 수행하여 데이터 호환성
을 제공한다.
응용 계층 : 사용자와 응용 프로그램 간의 인터페이스를 제공한다.
LAN카드
까지(NIC)까지는 하드웨어이고, MAC 주소(48bit)를 가진다.
TCP/IP
는 소프트웨어 중 커널모드이다.
TCP/IP
를 추상화 한 인터페이스 파일을 SOCKET
이라고 한다. USER MODE에서 KENEL MODE로 파일이나 메시지를 넘겨주기 위해 커널에 있는 tcp/ip를 추상화한 인터페이스로, 이 SOCKET을 열고 닫는 것이 중요하다.
L1
L2 : Ethernet , 식별자는 MAC주소 (랜카드를 식별한다 / LAN Card = NIC), 데이터 단위는 Frame
L3 : Internet , 식별자는 IP주소 (HOST를 식별한다. -> HOST는 네트워크에 연결된 컴퓨터를 의미한다.), 데이터 단위는 Packet
L4 : Tcp, Udp , 식별자는 port번호 (프로세스 또는 L2인터페이스 또는 네트워크 서비스), 데이터 단위는 Tcp는Segment
Udp는 datagram
세그먼트 순서가 1씩 증가하는 것이 아니라 byte 만큼 증가한다.
1 -> 2 -> 3 x
첫번째 세그먼트의 byte가 400이라면 두번째 세그먼트는 401
1 -> 401
L5 : SSL (TLS)
L6
L7 : HTTP
3 way handshake
: TCP 연결을 위해 클라이언트와 서버 간에 세 개의 패킷을 교환하는 과정이다. 연결된 것을 확인하고 전송 (연결형 프로토콜)
응답을 주고 받는 형태, 순서보장(1) 클라이언트가 연결 요청 시, 임의의 숫자인 시퀀스 번호(SYN)를 패킷에 넣어 보낸다.
(2) 서버가 요청을 수락 할 때는 서버가 임의의 숫자를 시퀀스 번호(SYN)와 클라이언트가 보낸 시퀀스 번호에 +1을 한 값인 ACK 2개의 번호를 패킷에 넣어서 클라이언트에게 보낸다
(3) 클라이언트가 수락응답할 때는 서버가 보낸 SYN번호에 +1을 한 ACK로 응답한다.
(4) 처음에 연결을 할 때만 syn 번호를 교환하고, 연결을 유지하며 데이터를 전달할 때는 ack 번호만 주고 받는다.
(5) 연결과정에 정책을 교환하는 과정이 있다. 그 중 가장 중요한 것이 MSS(최대 세그먼트 사이즈) 결정이다.
데이터 전달 보증 : 패킷이 전달되었는지, 아닌지 확인가능, 전송 받는 쪽에서 ACK번호를 어디까지 받았는지 ACK넘버를 상대방에게 전송
패킷 순서 보장 : 패킷에 포함된 시퀀스 번호와 ACK 번호는 연결을 유지하는동안 숫자가 증가하기 때문에, 이를 확인하여 패킷의 순서를 보장받을 수 있다. 이 번호들을 확인해서 올바른 패킷의 순서를 확인하거나, 데이터의 손실이과 중복을 파악할 수 있다.
비연결형 프로토콜 : 논리적인 연결 설정 과정과 해제과정 없이 데이터를 전송한다. 그래서 TCP보다 오버헤드도 낮다.
단방향 통신 : 데이터를 전송하는 송신자와 데이터를 수신하는 수신자 간의 단방향 흐름이 있다.
신뢰도가 낮음 : SYN과 ACK를 주고 받지 않기 때문에 데이터의 순서나 데이터의 손실을 확인할 수 없다.
UDP 헤더 = IP + Port + 체크섬
도메인
: 네트워크 상에서 컴퓨터를 식별하는 호스트명 VIP
: 다수의 서버 IP 중 대표 서버 IP로 로드밸런싱 역할을 한다. 대표 IP로 들어온 요청을 하위 서버에 분산하는 것이다. 로드밸런싱이란 네트워크나 서버 환경에서 트래픽이나 작업 부하를 여러 대의 서버에 균등하게 분산시켜주는 기술을 말한다.GSLB
: DNS 기반이라서 IP가 아닌 도메인을 가진다. 로드밸런싱을 할 때, 서버의 위치를 고려하고, 문제가 생긴 서버에는 밸런싱을 하지 않는 기능을 제공한다.FQDN
: 클라이언트의 상태를 고려하여 데이터 전송량이나 전송 속도를 조절하기 위한 메커니즘이다.
슬라이딩 윈도우 : 패킷을 하나씩 주고 받으며 ACK를 기다리는 것이 아닌, 수신자의 윈도우 사이즈
를 확인해서 사이즈만큼 ACK 없이 연속해서 송신한다. 윈도우의 앞부분이 ACK를 받으면 윈도우가 뒤로 이동하고 추가된 뒷부분의 전송이 시작된다.
윈도우 사이즈는 SYN과 SYN/ACK 사이의 시간인 RTT(Round Trip Time)
을 측정해서, 이를 기반으로 윈도우사이즈를 재설정한다.
윈도우 내의 데이터만을 전송하므로 데이터의 혼잡을 방지하고, 수신 측은 윈도우 외의 데이터를 무시함으로써 데이터의 순서를 보장한다. 또하 ACK를 주고받기 때문에 데이터의 손실도 파악할 수 있다.
단점은 윈도우 사이즈를 동적으로 조절하기 위해서는 적절한 알고리즘이 필요한데 알고리즘이나 네트워크 상태에 따라 흐름제어가 제대로 작동하지 않을 수 있다는 점이다.
수신자 윈도우(RWND)
: 수신자 측이 처리할 수 있는 데이터의 양을 고려하여 정한 윈도우 크기로 이 값을 송신자에게 전달한다.혼잡 윈도우(CWND)
: 송신자 측이 네트워크 혼잡상태를 고려하여 정한 윈도우 크기AIMD
: 송신 측의 전송 속도를 조절하는 방식으로 CWND를 1로 설정하고 패킷이 성공적으로 도착하여 ACK를 받으면 CWND의 윈도우 크기를 1개씩 늘린다. 전송에 실패하여 일정시간 내에 ACK를 받지 못하면 CWND / 2
윈도우 크기를 너무 조금씩 늘리기 때문에 제대로 된 속도로 통신하기까지 시간이 오래 걸린다.
SLOW START
: 윈도우 사이즈를 초기값으로 설정, ACK를 받으면 기존의 윈도우 사이즈의 2배, 받지 못하면 CWND = 1 (초기값)
TCP
양방향 통신
으로 클라이언트와 서버가 데이터를 주고 받을 수 있다.UDP
여기서 리소스는 웹에서 접근하고 식별할 수 있는 모든 객체나 정보를 말한다.
HTTP
는 따로 암호화 과정을 거치지 않기 때문에 중간에 패킷을 가로챌 수 있고, 수정할 수 있어 보안이 취약하다.HTTPS
이고, 중간에 암호화 계층을 거쳐서 패킷을 암호화한다.자원을 URI로 표현하고, 자원에 대한 행위를 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
GET
: 서버로부터 데이터를 요청합니다. 주로 정보를 조회하는 용도로 사용합니다. GET 요청은 캐시될 수 있으며 서버에 요청 데이터를 전달하고 싶을 때는 key-value 형태의 쿼리 파라미터로 전달합니다.
POST
: HTTP 메시지 바디로 요청 데이터 전달해서 처리를 요청, 새로운 데이터를 생성하거나 서버의 상태를 변경
POST는 멱등하지 않기 때문에 동일한 요청을 보낼 때마다 새로운 데이터를 생성한다.
PUT
: 서버에 데이터를 전송해서 전체 데이터를 완전히 대체하고 해당 데이터가 없으면 생성한다. 클라이언트가 전체 데이터를 보내야 하기 때문에, 누락된 필드가 있으면 기본값으로 설정되거나 빈 값으로 업데이트될 수 있습니다.
PUT은 멱등하기 때문에 동일한 요청을 보내면 매번 동일한 데이터를 반환한다.
PATCH
: 서버에 데이터를 전송하여 해당 데이터를 부분적으로 수정하는 업데이트를 수행합니다.
HEAD: GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
OPTIONS: 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
CONNECT: 대상 자원으로 식별되는 서버에 대한 터널을 설정
TRACE: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
200
: OK 요청 성공201
Created : 요청 성공해서 새로운 리소스가 생성됨, 생성된 리소스는 응답의 Location 헤더 필드로 식별202
Accepted : 요청이 접수되었으나 처리가 완료되지 않았음, 배치 처리 같은 곳에서 사용204
No Content : 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음, 웹 문서 편집기에서 save 버튼요청을 완료하기 위해 유저 에이전트의 추가 조치 필요
웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동
301, 308
)301
Moved Permanently : 리다이렉트시 요청 메서드가 GET
으로 변하고, 본문이 제거될 수 있음308
Permanent Redirect : 301과 기능은 같음리소스의 URI가 일시적으로 변경, 따라서 검색 엔진 등에서 URL을 변경하면 안됨
302
Found : 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음(MAY) 307
Temporary Redirect : 302와 기능은 같음 ,리다이렉트시 요청 메서드와 본문 유지(요청 메서드를 변경하면 안된다. MUST NOT) 303
See Other : 302와 기능은 같음, 리다이렉트시 요청 메서드가 반드시 GET으로 변경304
Not Modified : 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 클라이언트는 로컬PC에 저장된 캐시를 재사용한다. (캐시로 리다이렉트)PRG: Post/Redirect/Get : 응답코드를 200이 아닌 302나 303으로 줌
@PostMapping("/add")
public String addItemV6(Item item, RedirectAttributes redirectAttributes) {
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/basic/items/{itemId}";
}
400
Bad Request : 클라이언트의 잘못된 요청401
Unauthorized : 클라이언트가 해당 리소스에 대한 인증(로그인)이 필요함,403
Forbidden : 서버가 요청을 이해했지만 승인을 거부함, 주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우404
Not Found : 요청 리소스를 서버에서 찾을 수 없음 또는 해당 리소스를 숨기고 싶음500
Internal Server Error : 서버 문제로 오류 발생, 애매하면 500 오류503
Service Unavailable : 서비스 이용 불가, 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음, Retry-After
헤더 필드로 얼마 뒤에 복구되는지 보낼 수도 있음표현
은 요청이나 응답에서 전달할 실제 데이터, 표현 헤더
는 표현 데이터를 해석할 수 있는 정보 제공- 클라이언트가 선호하는 표현 요청, 협상 헤더는 요청시에만 사용
• From: 유저 에이전트의 이메일 정보
• Referer: 현재 요청된 페이지의 이전 웹 페이지 주소, A -> B로 이동하는 경우 B를 요청할 때 Referer: A 를 포함해서 요청, Referer를 사용해서 유입 경로 분석 가능
• User-Agent: 클라이언트의 애플리케이션 정보, 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
• Server: 요청을 처리하는 오리진 서버의 소프트웨어 정보, 응답에서 사용
• Date: 메시지가 생성된 날짜, 응답에서 사용
• Host: 클라이언트가 요청한 호스트 정보(도메인), 필수값으로 하나의 IP 주소에 여러 도메인이 적용되어 있을 때 사용됨
• Location: 페이지 리다이렉션
• Allow: 허용 가능한 HTTP 메서드
• Retry-After: 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
Set-Cookie: 서버에서 클라이언트로 쿠키 전달(응답)
Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달
필요성
• HTTP는 무상태(Stateless) 프로토콜이다.
• 클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어진다.
• 클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못한다.
쿠키의 도메인 : 예) domain=example.org
명시: 명시한 문서 기준 도메인 + 서브 도메인 포함(dev.example.org도 쿠키 접근)
생략: 현재 문서 기준 도메인만 적용
쿠키의 경로 : 지정한 경로를 포함한 하위 경로 페이지만 쿠키 접근
일반적으로 path=/ 루트로 지정
보안 : Secure, HttpOnly, SameSite
Last-Modified
를 헤더에 넣어서 보낸다. (304 Not Modified + HTTP 헤더정보)
만 받아와서 캐시의 정보를 갱신하고, 클라이언트는 기존에 가지고 있던 캐시를 재사용한다.서버가 요청받은 데이터를 보낼 때, 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
서버 데이터가 변경되면 서버가 이름을 바꾸어서 변경함(Hash를 다시 생성)
Cache-Control: max-age
(캐시 유효 시간, 초 단위)
Cache-Control: no-cache
(데이터는 캐시해도 되지만, 위의 두 가지 방법 중 하나로 항상 원(origin) 서버에 검증하고 사용)
Cache-Control: no-store
(데이터에 민감한 정보가 있으므로 저장하면 안됨)
Cache-Control: public
-> 응답이 public 캐시에 저장되어도 됨
Cache-Control: private
-> 응답이 해당 사용자만을 위한 것임, private 캐시에 저장해야 함(기본값)
Cache-Control: no-cache : 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용
원 서버와의 연결이 끊겨 접근할 수 없는 경우, 설정에 따라서
캐시를 반환할 수도 있음
Cache-Control: no-store : 데이터에 민감한 정보가 있으므로 저장하면 안됨
(메모리에서 사용하고 최대한 빨리 삭제)
Cache-Control: must-revalidate : 캐시 만료후 최초 조회시 원 서버에 검증해야함, 원 서버 접근 실패시 반드시 오류가 발생
해야함 -> 504(Gateway Timeout), must-revalidate는 캐시 유효 시간이라면 캐시를 사용함
Pragma: no-cache : HTTP 1.0 하위 호환
HTTP/0.9
HTTP/1.0
HTTP/1.1
- 표준 프로토콜Keep-Alive 기능(디폴트)
을 도입하여 Keep-Alive 유지시간동안 단일 연결에서 여러 요청과 응답을 처리할 수 있습니다. 비연결성을 위반한 것이라고 할 수 있지만 많은 횟수의 요청을 처리할 때 발생하는 오버헤드를 줄이는 장점이 있다.HTTP/2.0
HTTP/3.0
컨텐츠 전송 네트워크
로 데이터 사용량이 많은 애플리케이션의 웹 페이지 로드 속도를 높이는 상호 연결된 서버 네트워크이다.
웹 사이트를 방문할 때 해당 웹 사이트 서버의 데이터가 인터넷을 통해 사용자의 컴퓨터에 도달하게 된다. 이때 사용자가 해당 서버에서 멀리 떨어져 있는 경우, 동영상이나 이미지와 같은 대용량 파일을 로드할 때 많은 시간이 걸리게 된다. 사용자와 가까운 거리에 CDN 서버를 두어 웹 사이트 콘텐츠를 저장해놓으면 사용자는 훨씬 빠른 속도로 콘텐츠를 로드할 수 있다. CDN은 캐싱과 로드 밸런싱을 통해 콘텐츠를 최적의 서버로 배분하고, 요청은 오리지널 서버에 하더라도, 이미지 등의 데이터는 가까운 CDN서버에서 가지고 올 수 있다.
대표적으로 aws에서 제공하는 CDN서비스인 CloudFront
서비스가 있다
클라이언트가 서버에 간접적으로 접근할 수 있게 해주는 중간 서버이다. 프록시서버가 클라이언트로부터 요청을 받고, 그 요청을 서버로 전달한다.
웹서버인 엔진엑스
는 프록시서버 용도로도 사용한다.
포워드 프록시 : 일반적인 프록시 개념. 캐시, 접근제어, 보안, 사용률 파악의 장점이 있다.
리버스 프록시 : 받은 요청을 여러 서버들 중 하나로 전달하는 부하분산의 역할을 한다.
HOST는 네트워크에 연결된 컴퓨터를 의미한다. 해당 PC가 네트워크 인프라를 이루는 장비(라우터 등)인 경우 switch
라 하고, 해당 인프라를 사용하는 일반 user(클라이언트, 서버, peer) PC의 경우 end-point
라고 생각하면 된다.
컴퓨터가 어떤 역할을 하느냐에 따라 나눈 분류인 것이다.
아주 간단히 요약하면 switch는 네트워크 인프라, end-point는 인프라를 사용하는 유저다.
스위치는 패킷이 교차로(라우터)에서 어떤 방향으로 갈 것인지 매트릭 값(비용)을 고려하려 경로를 결정한다.
Link-up
, 정상이 아니라면 Link-down
이라고 한다.uplink
라고 한다.L2 distribution switch
: L2 Access switch들의 연결이 모이는 상위 스위치L3 IP 패킷
: 패킷은 네트워크에서 전송되는 데이터의 단위로 헤더(머리) + 페이로드(내용/데이터) + 트레일러(꼬리)로 구성된다. 최대크기는 MTU(1500bytes)
게이트웨이
: 한 네트워크(segment)에서 다른 네트워크로 이동하기 위하여 거쳐야 하는 지점이다. 기계, 장비가 아니라 인터넷 방향으로 나갈 때 찾아갸야할 IP 주소를 말한다.
이 그림에서 공유기와 인터넷 제공 회사의 라우터는 이전의 단계에서 다음 단계로 넘어 갈 때의 게이트웨이 역할을 담당합니다. 이 때, 거치는 게이트웨이의 수를 홉 수(hop count)
라고 한다. (라우터에서 다른 라우터를 지날때의 단위)
라우터(=물류센터)
: 라우터는 OSI7계층 중 3 계층( 네트워크 계층) 에 속하는 장비이다. (= L3 switch - 논란의 여지가 있음)
경로 설정 : 내부 네트워크와 외부 네트워크를 연결해주는 장치로 데이터 패킷이 목적지까지 갈 수 있는 길을 검사하고 어떤 경로로 전송하는 것이 가장 효율적일지 결정한다
스위칭 : 경로가 결정되면 해당 경로로 데이터 패킷을 넘겨준다.
서버에 연결된 buffer (개발자가 버퍼 크기를 정한다)
소켓에 연결된 buffer
TTL
: 패킷이 라우터에서 다른 라우터로 이동할 때 숫자가 감소하는데 정해진 숫자가 모두 감소해서 0이되면 해당 패킷이 도착한 라우터에서 패킷을 버리고 OS가 삭제한다.
단편화
: 패킷 하나의 크기는 일반적으로 1500byte이다. 하지만 어떤 라우터에서 받을 수 있는 MTU의 크기가 1500byte보다 작을 수 있다. 이때 하나의 패킷을 쪼개는 단편화가 일어난다. 쪼개진 2개 이상의 패킷은 일반적으로 패킷을 받는 서버에서 조립한다. (VPN을 사용하는 경우 단편화가 일어날 가능성이 높아진다)
IP, Gateway IP주소, Subnet mask 모두 일반적으로 자동으로 주소 받기를 사용한다. 이때 자동화를 위해 사용하는 것이 DHCP이다.
DHCP Server는 broadcast domain에 묶여서 해당 LAN영역에서 host가 요청한 인터넷 설정에 필요한 작업을 자동으로 세팅해준다.
broadcast domain에 묶였기 때문에 gateway의 네트워크 주소를 넘어서 외부 네트워크와 통신하지 않는다. 즉 broadcast는 gateway 안 쪽에 존재한다.