안녕하세요.
오랜만에 전공책을 펴서 Socket과 HTTP에 대해 간단하게 정리해보려고 합니다.
네트워크 프로그래밍과 소켓
네트워크 프로그래밍이란?
네트워크로 연결되어 있는 서로 다른 두 컴퓨터가 데이터를 주고받을 수 있도록 하는 것
전 세계의 네트워크는 물리적으로 연결되어 있다.
물리적인 연결을 기반으로, 소프트웨어적으로는 어떻게 데이터를 송수신할 수 있을까?
이를 위해 운영체제에서 소켓 Socket 이라는 것을 제공한다.
회사 쇼핑몰에서 찾아 온 소켓의 이미지다.
우리가 전력망으로부터 전기를 공급받기 위해 소켓에 콘센트를 꽂는 것과 같이
내부망(inter-net)을 통해 데이터를 송수신하기 위해 소켓을 사용한다는 의미다.
네트워크 통신을 위한 프로그램들은 소켓을 생성하고, 이 소켓을 통해서 서로 데이터를 교환한다.
OSI 참조 모델 레이어 ( OSI 7 계층 )
네트워크 통신과 관련된 다양한 소프트웨어 및 하드웨어 구성 요소를 표준화하는 개념적 모델
이후 HTTP 프로토콜 설명에 도움이 될 예쁜 이미지가 있어서 가져왔다.
웹(Web) 서버
HTTP 프로토콜을 기반으로 웹 페이지에 해당 파일을 클라이언트에게 전송하는 서버
HTTP란?
HyperText Transfer Protocol
우리가 티스토리에 접속하면 티스토리의 메인 페이지 파일이 브라우저로 전송되고
마우스를 클릭해서 이동하고자 하는 곳으로 이동할 수 있는 것과 같이
클라이언트의 선택에 따라 이동이 가능한 텍스트를 HyperText라고 한다.
이러한 HyperText의 전송을 목적으로 설계된 어플리케이션 레벨의 프로토콜을
HTTP, HTTP 프로토콜이라고 부른다.
결론적으로
웹서버는 TCP/IP 또는 UDP를 기반으로 구현 된 HTTP 프로토콜을 기반으로 HTML문으로 이루어진 HyperText를 전송하며
인터넷 브라우저는 서버가 전송하는 HTML문으로 이뤄진 HyperText를
HTML 문법을 기반으로 사용자가 보기 쉽게 변환해서 보여주는 것으로
임의의 웹 서버에 접속을 시도하기 위해 내부적으로 소켓을 생성하는 소켓 기반의 클라이언트 프로그램인 것이다.
참고) HTTP/3는 기존의 HTTP/1, HTTP/2와는 다르게 UDP 기반의 프로토콜인 QUIC 을 사용한다.
HTTP의 요청/응답
1. 상태가 존재하지 않는 Stateless 프로토콜
서버는 클라이언트의 요청에 응답을 하고나서 연결을 바로 종료한다.
참고) keep alive 설정으로 일정기간 동안 클라이언트와 Connection을 유지할 수도 있다.
즉, 서버는 클라이언트의 상태 정보를 유지하지 않는다.
동일한 클라이언트가 다시 요청을 해와도 새로운 요청에 대해서 응답을 해줄 뿐이다.
2. 요청 메세지(Request Message) 구성
- HTTP/1.x
이전에 만들다가 만 맛집 추천 어플에서 수행하던 Request 정보를 가져왔다.
소프트웨어, 브라우저, 프록시, 또는 웹 서버가 아래와 같은 Text를 생성한다.
GET /v1/search/image?query=등촌칼국수 HTTP/1.1 // 요청라인
Host: openapi.naver.com // 헤더
X-Naver-Client-Id: -
X-Naver-Client-Secret: -
Cache-Control: no-cache
/**** 공백 라인 ****/
BODY LINE ...
안녕하세요. 님네 API에 등촌칼국수 데이터를 GET 방식으로 요청하고 HTTP 프로토콜 버전 1.1 기준으로 통신할 수 있을까요??
- HTTP/2
기존에 Plain Text(평문)를 사용하고, 개행으로 구별되던 HTTP/1.x 프로토콜과 다르게
2.0에서는 바이너리 포맷으로 인코딩 된 Message, Frame으로 구성된다.
3.응답 메세지(Response Message) 구성
Requests의 구조와 닮았으며 첫 줄에 클라이언트의 요청에 대한 결과 정보가 담긴다.
HTTP 상태코드
https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C
여기까지 소켓과 HTTP 프로토콜에 대해 간단하게 알아보았습니다.
HTTP/2에 대해 공부가 더 필요할 것 같고
이후에는 이번 포스팅을 기반으로 스프링 동작 원리에 대해 알아보도록 하겠습니다~
HTTP Message 참고 포스팅
https://velog.io/@taesunny/HTTP2HTTP-2.0-%EC%A0%95%EB%A6%AC
https://developer.mozilla.org/ko/docs/Web/HTTP/Messages
HTTP/2 관련 포스팅