학습일지_CodeSquad_MC_D24

VANS·2022년 2월 10일
0

오늘은 HTTP를 배우는 시간이다.

목차

미션 1 단계 진행에 필요한 내용만큼만 정리해봤습니다.


생활코딩 - HTTP

http 소개

  • http는 서버와 클라이언트가 request하고 respone를 위한 메시지로 구분되어 있다.
  • 웹브라우저는 사용자(클라이언트)가 요청한 정보를 웹서버에게 header형태로 대신 물어봐주고, 응답받은 정보를 화면에 적당히 그려주는 프로그램.
    (웹서버는 자신이 가진 정보를 header 형태로 만들어 응답해주는 기계)

http request message

  • 메시지 구조

http response message

  • 메시지 구조

  • http 상태(status)를 알려주는 표기종류

    • 1xx : 정보를 주기 위한
    • 2xx : 성공과 관련된 알림
    • 3xx : 다른곳으로 이동하게 함(리다이렉션)
    • 4xx : 클라이언트 쪽에 에러(유명한 404)
    • 5xx : 서버쪽에 에러일 경우

http 요청 응답 순서

  1. 웹브라우저가 웹서버에게 요청할 request header 코드를 적는다.
    1-1. post라면 웹서버에게 전달할 내용도 함께 적는다.
  2. 웹서버는 request header 정보를 분석해서 response header를 만들어준다.
  3. 그에 맞는 html 작성해서 웹브라우저에게 보내준다.
  4. 웹브라우저는 reponse header와 html을 참고해서 화면에 표시해준다

모든 개발자를 위한 HTTP 웹 기본 지식

인터넷 네트워크

1. 인터넷 통신

  • 클라이언트와 서버가 서로 통신을 하려면, 수많은 노드가 분포되어 있는 복잡한 인터넷 망을 거쳐야 한다.
  • 어떤 규칙과 방법으로 거쳐서 통신이 되는지 알려면 IP(인터넷 프로토콜)에 대해 학습이 필요하다.

2. IP(인터넷 프로토콜)

  • 클라이언트와 서버가 통신하기 위한 최소한의 규칙이다.(집주소 같은건가?)
  • 지정한 IP주소(IP Address)에 패킷(Packet)이라는 통신 단위로 데이터 전달하는 역할을 한다.
    (패킷은 일종의 편지(전송 데이터)를 넣는 우편봉투와 비슷하게 출발IP와 도착IP정보등을 지니게 된다.)
  • 하지만 몇가지 한계를 갖게된다.

IP 프로토콜의 한계

  • 비연결성
    - 패킷을 받을 대상이 없거나, 서비스 불능 상태여도 패킷 전송
    (우편 받을 당사자가 이사갔는데도, 기존 주소로 우편물이 전송됨)
  • 비신뢰성
    - 패킷이 중간에 사라지거나 순서대로 안갈수도 있다.
    (중간에 우편물을 가지고 이동하던 우체국 기사가 사고가 난다던지)
    (데이터가 대략적으로 1500바이트를 넘으면 나눠서 보내게 되는데, 나눠진 패킷이 서로 다른 노드를 통해 갈수도 있어서 순서를 보장할 수 없다.)
  • 프로그램 구분
    - 같은 IP를 사용하는 서버에서 통신하는 App이 여러개면?!

3. TCP/UDP

  • IP 프로토콜의 한계들을 어느정도 해결해준다.
  • TCP에는 출발지 목적지의 PORT / 전송 제어, 순서, 검증 정보등이 포함된다.

프로토콜 계층

클라이언트가 서버에 Hello world를 보내는 경우

  1. 애플리케이션 단위 - 프로그램이 Hello, world! 메시지 생성
    1-1. Socket 라이브러리를 통해 전달
  2. OS 단위 - TCP정보를 생성하여 메시지 데이터를 감싸준다.(포함한다.)
    2-1. 그다음 IP패킷을 생성하여 TCP 데이터를 감싸준다.(포함한다.)
  3. 네트워크 인터페이스 단위 - 랜카드를 통해 슝(이더넷 프레임으로 씌워주긴함)

TCP 특징

  • 전송 제어 프로토콜(Transmission Control PRotocol)
  • 연결지향 - 연결이 되고나서 메시지를 보낸다.(TCP 3 way handshake)

    TCP 3 way handshake
    클라이언트 -> 서버 (SYN) SYN : 접속요청
    클라이언트 <- 서버 (SYN+ACK) ACK : 요청수락(
    클라이언트 -> 서버 (ACK) ACK와 함께 데이터 전송 가능하기도 함
    클라이언트 -> 서버 (데이터 전송)

  • 데이터 전달 보증 - 패킷이 중간에 누락되거나 사라지면 보낸이가 알 수 있다.
    (서버 응답을 통해서 알 수 있다.)
  • 데이터 전달 순서를 보장해준다.
    (서버에 순서가 잘못 도착하면 서버에서 TCP내의 순서정보를 참고하여 응답해준다.)
  • 고로 신뢰할 수 잇는 프로토콜이라 현재 대부분 TCP를 사용한다.

UDP 특징

  • 기능이 없다. 그냥 하얀 도화지 같다.
  • IP와 거의 같다.
  • PORT, 체크섬 정도가 추가되었다.
    (PORT : 동일한 IP를 사용하는 어플리케이션을 구분하기 위한 수단)
  • TCP와 다르게 데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠르다.
  • 최근에 웹브라우저에서 HTTP 통신할때 HTTP 3 spec이 나오게 되었는데, 여기서 handshake등을 없애서 최적화 하기위해 UDP를 쓰고 있는 추세라 UDP도 뜨고있는 추세다.

4. PORT

  • 같은 IP를 사용하는 App(프로세스)을 구분하기 위한 수단
  • 회사 주소(IP)로 우편을 받았는데, 회사 내 누구한테(App) 도착한것인지
    알 수 있게 이름(PORT)도 적어준다.

웹 브라우저 요청 흐름

  • 실제로 웹 브라우저에서 서버 요청시 어떤 흐름으로 진행되는지 알아보자
  • 요청주소
    https://www.google.com/search?q=hello&hl=ko
  • 웹브라우저 IP : 100.100.100.1
  • 구글 서버 IP : 200.200.200.2

1. 웹 브라우저

https:// www.google.com:443 /search?q=hello&hl=ko

1) HTTP 요청 메시지 생성

  • www.google.com 도메인으로 DNS Sever에서 IP를 조회한다.
    (조회결과 - IP : 200.200.200.2)
  • PORT정보를 찾는다.
    (https 라고 명시되어 있으니, 443이 생략된것을 알 수 있다.)

HTTP 요청 메시지 구성

GET /search?q=hello&hl=ko HTTP1.1
Host: www.google.com

2) HTTP 요청 메시지 전송

  • 생성된 HTTP 메시지를 OS에 SOCKET 라이브러리를 통해 전달
    (찾아낸 IP, PROT정보로 handshake 과정을 통해 TCP/IP를 연결한다.)
  • OS에서 TCP/IP 패킷을 생성한다.(HTTP 메시지 포함)
  • 네트워크 인터페이스로 넘어가 LAN 카드를 통해 요청 패킷이 전송된다.

2. 서버

  • 패킷을 까서 HTTP 요청 메시지에서 요청사항을 확인한다.

1) HTTP 응답 메시지 생성

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length:3423
html>
body>.../body>
/html>

2) 응답 패킷 전달

  • 요청 패킷과 동일하게 TCP/IP 패킷을 감싸서 웹 브라우저에게 전송한다.
  • 웹 브라우저는 HTTP 메시지 내 html을 열어 랜더링을 한다.

ref.

https://atoz-develop.tistory.com/entry/JAVA-TCP-%EC%86%8C%EC%BC%93-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9C%BC%EB%A1%9C-%EA%B0%84%EB%8B%A8%ED%95%9C-HTTP-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

twilio.com/blog/5-ways-to-make-http-requests-in-java

https://velog.io/@godkimchichi/Java-14-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-Socket

https://m.blog.naver.com/eternal_rest/222084705913

profile
코딩도 점진적 과부화

0개의 댓글