소켓(Socket)이란 무엇인가?
일반적으로 서버는 특정 컴퓨터에서 실행되며 특정 포트 번호에 바인딩된 소켓이 있다. 서버는 클라이언트가 연결 요청을 하기 위해 소켓을 수신 대기한다.
클라이언트 측에서: 클라이언트는 서버가 실행 중인 시스템의 호스트 이름과 서버가 수신 중인 포트 번호를 알고 있는데 연결 요청을 만들기 위해 클라이언트는 서버의 시스템 및 포트에서 서버와 연결을 시도하게 된다. 또한 클라이언트는 이 연결 중에 사용할 로컬 포트 번호에 바인딩되도록 서버에 자신을 식별해야 한다. 일반적으로 시스템에서 할당한다.
모든 것이 순조롭게 진행되면 서버가 연결을 수락한다. 수락하면 서버는 동일한 로컬 포트에 바인딩된 새 소켓을 가져오고 remote endpoint도 클라이언트의 주소와 포트로 설정하며 연결된 클라이언트의 요구 사항을 처리하면서 연결 요청에 대해 원래 소켓을 계속 수신할 수 있도록 새 소켓이 필요하다.
클라이언트 측에서 연결이 수락되면 소켓이 성공적으로 생성되고 클라이언트는 소켓을 사용하여 서버와 통신할 수 있다.
클라이언트와 서버는 이제 소켓에 쓰거나 소켓에서 읽어 통신할 수 있다.
정의하자면
소켓은 네트워크에서 실행 중인 두 프로그램 간의 양방향 통신 링크의 한 endpoint이다. 소켓은 TCP 레이어가 데이터의 송신지가 되는 애플리케이션을 식별할 수 있도록 포트 번호에 바인드된다.
포트란 무엇인가?
포트는 네트워크 연결이 시작되고 끝나는 가상 지점이다. 포트는 소프트웨어 기반이며 컴퓨터 운영 체제에서 관리한다. 각 포트는 특정 프로세스 또는 서비스와 연결되며 포트를 사용하면 컴퓨터가 서로 다른 종류의 트래픽을 쉽게 구분할 수 있다. 예를 들어 이메일과 웹 페이지가 동일한 인터넷 연결을 통해 컴퓨터에 도달하더라도 이메일은 웹 페이지와 다른 포트로 이동한다.
또한 포트는 네트워크에 연결된 모든 장치에서 표준화되며 각 포트에는 번호가 할당된다. 대부분의 포트는 특정 프로토콜 용으로 예약되어 있다. 예를 들어 모든 HTTP(Hypertext Transfer Protocol) 메시지는 포트 80으로 이동하게 된다.IP 주소를 사용하면 메시지가 특정 장치와 주고받을 수 있지만 포트 번호는 해당 장치 내의 특정 서비스나 응용 프로그램을 대상으로 지정할 수 있다.
소켓과 포트의 차이점
TCP/IP는 특정 시스템(네트워크 인터페이스)의 특정 프로세스를 나타내는 포트를 정의하는데. 포트는 많은 프로세스를 가질 수 있는 호스트에서 한 프로세스의 위치를 나타낸다다. 소켓은 특정 포트와 해당 호스트의 IP 주소를 나타낸다.
버전별 HTTP
HTTP/0.9 – 원-라인 프로토콜
HTTP 초기 버전에는 버전 번호가 없었다. HTTP/0.9는 이후에 차후 버전과 구별하기 위해 0.9로 불리게 됐다. HTTP/0.9는 극히 단순하며 요청은 단일 라인으로 구성되며 리소스에 대한 (프로토콜, 서버 그리고 포트는 서버가 연결되고 나면 불필요로 하므로 URL은 아닌) 경로로 가능한 메서드는 GET이 유일했다.
GET /mypage.html
HTTP/1.0 – 확장성 만들기
HTTP/0.9는 매우 제한적이었으며 브라우저와 서버 모두 좀 더 융통성을 가지도록 빠르게 확장되었다:
- 버전 정보가 각 요청 사이 내로 전송되기 시작했다. (HTTP/1.0 이 GET 라인에 붙은 형태)
- 상태 코드 라인 또한 응답의 시작 부분에 붙어 전송되어, 브라우저가 요청에 대한 성공과 실패를 알 수 있고 그 결과에 대한 동작(특정 방법으로 그것의 로컬 캐시를 갱신하거나 사용하는 것과 같은)을 할 수 있게 되었다.
- HTTP 헤더 개념은 요청과 응답 모두를 위해 도입되어, 메타데이터 전송을 허용하고 프로토콜을 극도로 유연하고 확장 가능하도록 만들어주었다.
- 새로운 HTTP 헤더의 도움으로, 평이한 HTML 파일들 외에 다른 문서들을 전송하는 기능이 추가되었습니다.
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
A page with an image
<IMG SRC="/myimage.gif">
</HTML>
HTTP/1.1 – 표준 프로토콜
HTTP/1.1은 모호함을 명확하게 하고 많은 개선 사항들을 도입했다:
- 커넥션이 재사용될 수 있게 하여, 탐색된 단일 원본 문서 내로 임베드된 리소스들을 디스플레이하기 위해 사용된 커넥션을 다시 열어 시간을 절약하게 하였다.
- 파이프라이닝을 추가하여, 첫 번째 요청에 대한 응답이 완전히 전송되기 이전에 두 번째 요청 전송을 가능케 하여, 커뮤니케이션 지연시간을 낮췄다.
- 분할된(chunk) 응답 또한 지원된다.
- 추가적인 캐시 제어 메커니즘이 도입되었다.
- 언어, 인코딩 혹은 타입을 포함한 콘텐츠 협상이 도입되어, 클라이언트와 서버로 하여금 교환하려는 가장 적합한 콘텐츠에 대한 동의를 가능하게 했다.
- Host 헤더 덕분에, 동일 IP 주소에 다른 도메인을 호스트 하는 기능을 가능하게 한다.
HTTP/2 – 더 나은 성능을 위한 프로토콜
2010년 전반기에, Google은 실험적인 SPDY 프로토콜을 구현하였으며 응답성 증가 능력을 입증하고 전송된 데이터 중복에 관한 문제를 해결하면서, SPDY는 HTTP/2 프로토콜의 기초로써 기여했다.
HTTP/2 프로토콜은 HTTP/1.1 버전과 다른 몇 가지 근본적인 차이점을 가지고 있다:
- HTTP/2는 Text 프로토콜이라기보다는 Binary 프로토콜 이다. 더 이상 읽을 수도 없고 수작업을 만들어낼 수 없다. 이런 결점에 대한 새로운 최적화 기술이 구현될 수 있다.
- 병렬 요청이 동일한 커넥션 상에서 다루어질 수 있는 다중화 프로토콜로, 순서를 제거해주고 HTTP/1.x 프로토콜의 제약사항을 막아준다.
- 전송된 데이터의 분명한 중복과 그런 데이터로부터 유발된 불필요한 오버헤드를 제거하면서, 연속된 요청 사이의 매우 유사한 내용으로 존재하는 헤더들을 압축시킨다.
- 서버로 하여금 사전에 클라이언트 캐시를 서버 푸쉬라고 불리는 메커니즘에 의해, 필요하게 될 데이터로 채워넣도록 허용한다.
2016년 6월, 모든 웹 사이트 중 8.7%가 이미 사용 중에 있고, 인터넷 상에서 전송 오버헤드 감소로 많은 돈을 절약하는 높은 트래픽의 웹 사이트들은 이 프로토콜을 급속히 받아들이고 있다.
HTTP/3 - HTTP over QUIC
HTTP/3의 중요한 차이점은 새로운 전송 프로토콜인 QUIC에서 실행된다는 점이다 QUIC은 사람들이 이동하면서 한 네트워크에서 다른 네트워크로 지속적으로 전환하는 스마트폰을 휴대하는 모바일 사용량이 많은 인터넷 사용을 위해 설계되었다.
QUIC을 사용한다는 것은 HTTP/3 이 전송 제어 프로토콜( TCP )이 아닌 사용자 데이터그램 프로토콜( UDP ) 에 의존한다는 것을 의미한다. UDP로 전환하면 온라인 브라우징 시 연결 속도와 사용자 경험이 빨라진다.
QUIC 프로토콜은 2012년 Google에서 개발했으며 벤더 중립적 표준 조직인 IETF(Internet Engineering Task Force)에서 채택하여 새로운 HTTP/3 표준을 만들기 시작했다.
QUIC은 HTTP/2의 가장 큰 단점 중 일부를 수정하는 데 도움이 된다.
- 스마트폰이 WiFi에서 셀룰러 데이터로 전환될 때(예: 집 또는 사무실을 떠날 때) 성능 저하에 대한 해결 방법 개발
- 패킷 손실의 영향 감소 — 정보의 한 패킷이 목적지에 도달하지 못하는 경우 더 이상 모든 정보 스트림을 차단하지 않는다
- 더 빠른 연결 설정: QUIC를 사용하면 TLS 버전 협상이 암호화 및 전송 핸드셰이크 와 동시에 발생할 수 있다.
- 제로 왕복 시간 (0-RTT): 이미 연결된 서버의 경우 클라이언트는 핸드셰이크 요구 사항(통신 방법을 결정하기 위해 서로를 확인하고 확인하는 프로세스)을 건너뛸 수 있다.
- 보다 포괄적인 암호화: 핸드셰이크에 대한 QUIC의 새로운 접근 방식은 기본적으로 암호화 (HTTP/2에서 크게 업그레이드됨)를 제공하고 공격 위험을 완화하는 데 도움이 된다.
기술 출처
https://docs.oracle.com/javase/tutorial/networking/sockets/definition.html
https://www.ibm.com/docs/en/zos/2.2.0?topic=hosts-ports
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
https://www.cloudflare.com/ko-kr/learning/performance/what-is-http3/
'DevOps > CS' 카테고리의 다른 글
[DevOps] 데이터베이스 정규화 (0) | 2022.12.19 |
---|---|
[DevOps] HTTP가 뭐길래 (0) | 2022.12.07 |
[DevOps] DNS 너 어떻게 작동하는건데!!! (0) | 2022.12.06 |
[DevOps] DevOps가 뭔지알아??? 내가알려줄게 (2) | 2022.11.29 |
[DevOps] SaaS??? 너 누구야!!! (1) | 2022.11.28 |