웹프로그래밍 : HTTP

chanyeong yu ·2025년 4월 21일

웹프로그래밍

목록 보기
4/12

Sockets

  • 우리가 어플리케이션에서 서비스를 개발 즉 코딩을 하는 것은 소켓 위에서 개발하는 것이라고 할 수 있다.

소켓 요청

  • 순서는 다음과 같다. 소켓을 열고 Listening을 하면? 다음과 같은 것들을 정해놔야 한다.

Server IP
Server Port
그리고 어떤 프로토콜을 사용할 것인가

이것들을 정해서 소켓에 매핑을 시킨다.

그럼 요청을 하게 되면 맨 처음 LISTEN SOCKET이 첫 요청을 받아들인다.

그리고 CLIENT SOCKET을 만들어낸다.

CLIENT SOCKET엔 다섯개의 튜플이 존재한다.

Server IP
Server port
Protocol
Client IP
Client Port

Client IPClient Port가 새로 매핑이 되는 것이고, 클라이언트와 대응되는 소켓이 생성되는 것이다.

또 다른 클라이언트의 요청?

  • 새로운 소켓이 생성되는 것을 알 수 있다.

문제점

  • 서버는 웹클라이언트 하나만을 위한 것이 아니다. 실제로는 웹클라이언트의 요청이 무수히 많을텐데 어떻게 하나씩 하나씩 매핑할까? 오버헤드가 너무 커지고 불가능하다.

해결책

  • 기본적으로 쓰레드 여려개를 만들어서 처리한다고 생각할 수 있음. 다만 컨텍스트 스위칭이 너무 늘어난다.
  • 따라서 NGINX같은 여러 프레임워크가 만들어진다.
  • 이벤트 루프로드밸런싱.

TCP and UDP

TCP는 반드시 그 메세지가 클라이언트가 도달하게 되어있다. 신뢰도가 높다는 뜻

웹개발에서는 TCP 알고리즘을 사용한다.
클라이언트서버는 가장먼저 TCP 커넥션을 먼저 해주어야한다. TCP라는 파이프 안에서 http request, response들이 이루어진다.

동시에 이 말인 즉,
TCP의 성질에 따라서 영향을 받는 다는 이야기.

HTTP - Web protocol


protocol + domain name(+포트번호가 생략되어있다.) + path name = ip 주소.

Port 번호

  • https - 443
  • http - 22

HTTP Connections

Non-persistent HTTP

'Connection':'close' //response Headers
  1. TCP 연결
  2. 요청과 응답
  3. TCP 해제

이 경우 서비스가 엄청나게 느려지는 단점이 생긴다.

persistent HTTP

'Connection':'keep-alive' //response Headers

한번 웹서버와 클라이언트가 연결 되면 요청과 응답이 진행되고, 마지막에 연결을 해제한다.

HTTP Example


이런 코드로 요청을 할 경우 다섯개의 파일을 가져온다.

  1. html
  2. css
  3. image1
  4. image2
  5. image3

이를 그림으로 나타내면 다음과 같다. TCP가 열리고, 요청과 응답이 오고간 후 TCP가 종료된다.

But real HTTP...

실제로는 이렇게 순서대로 이루어지지 않고 뒤죽박죽.

실제로는 다중 TCP, 병렬 TCP로 속도를 빠르게 하려고 한다고 한다.

Wireshark로 확인하기

TCP 연결.

가장 먼저 TCP연결이 된다.
여기서 중요한 것은 소켓이 하나만 열리는게 아니라는 점이다.


HTTP 요청과 응답

그 이후로, HTTP 요청과 응답이 일어난다.
여기서 알아야할 것은 HTTP GET Request의 응답으로 TCP ACK 한번, HTTP Response의 응답으로 TCP ACK 한번이 일어난다는 것이다.


나머지 요청과 응답

이어서 CSS, Image 요청과 응답이 실행된다. 아까 소켓이 두개가 열렸기 때문에 병렬적으로 각각의 포트에서 요청과 응답이 일어난다.


종료, TCP 해제

모든 요청과 응답이 종료되었으면, 연결이 종료된다.

Clent : 연결을 종료하자 !
server : ok
server : 그럼 끊을게
Clent : ok

이런식으로 요청을 하면 요청에 대한 응답이 존재하고, 응답을 하면 응답에 대한 응답이 존재하는 것을 확인할 수 있다. 이처럼 주고 받는 것을 확인할 수 있다.


요청과 응답.

  • 헤더와 바디가 구분되어 있다. \r\n을 중간으로 해서 구분한다.

Request Header


1. 처음 메소드(Get, Post, .. 가 들어가고,
2. 그 뒤로 헤더 필드들이 주루룩. 헤더 필드들은 늘어날 수 있다.

  1. 그리고 바디.

Response Header


1. 처음 프로토콜, 그리고 숫자들로 state message를 표시해준다.
2. 뒤로 헤더 필드가 있고 여러 정보들이 들어있다.

  • Etag : 이미 전달한 정보를 확인해서 지연을 막는다.
  • Content-Length : 바디부분 사이즈가 몇인지 나타낸다.
  • Keep-Alive : TCP연결을 항상 유지, 최대유지시간, 최대전송량 등
  • Content-Type : 보내는 파일이 무슨 파일인지

헤더가 너무 크지않도록 조심해야한다. 배보다 배꼽이 커진다

Etag를 통해 파일 중복 확인

status code 304 : 이미 불러왔던 것

status code 200 : 처음 로딩하는 것

0개의 댓글