소켓(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
What Is a Socket? (The Java™ Tutorials > Custom Networking > All About Sockets)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com
https://www.ibm.com/docs/en/zos/2.2.0?topic=hosts-ports
Ports
A port is a 16-bit integer that defines a specific application, within an IP address, in which several applications use the same network interface. The port number is a qualifier that TCP⁄IP uses to route incoming data to a specific application within an
www.ibm.com
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
Evolution of HTTP - HTTP | MDN
HTTP (HyperText Transfer Protocol) is the underlying protocol of the World Wide Web. Developed by Tim Berners-Lee and his team between 1989-1991, HTTP has gone through many changes that have helped maintain its simplicity while shaping its flexibility. Kee
developer.mozilla.org
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 |