소켓 : 프로토콜 명세서를 코드로 구현
- 인터넷과 소프트웨어 사이에 놓여 소프트웨어들을 연결
- 소켓의 함수들 : 인터넷에서 소켓 찾아 연결, 데이터 읽고 보내는 함수들
- 서비스 포트
- 각 네트워크 프로그램들이 할당 받는 포트번호를 통해 서비스 프로그램을 찾아간다.
- apache web server : 80 port
- FTP : 21
- ssh : 22
- telnet : 23
- SMTP(email) : 25
- 포트 번호 크기 : 2byte (1 ~ 65536)
- 이중 1 ~ 1024 = 시스템 포트 (root 권한 사용자만 사용)
- 80번 포트 웹서버 실행 ? root 권한 가진 사용자
HTTP 는 단방향, 소켓통신은 양방향?
인터넷 찾아보면 흔히 보이는 내용인데, 소스 코드를 보니 이해가 안 된다.
HTTP 요청을 받고, 소켓을 사용하기 때문이다.
Microsoft Docs - Socket 클래스
- 프로토콜을 어떻게 활용하느냐에 따라 연결 지향과 비연결 프로토콜로 바뀔 수 있다.
- 먼저, IP, HTTP 는 비연결 프로토콜이다.
- IP 프로토콜을 이용하는 TCP 프로토콜은 연결지향 프로토콜이다.
- 비연결 프로토콜인 HTTP는 TCP 프로토콜을 이용한다.
HTTP over TCP/IP
HTTP Basics
- 웹브라우저의 URL을 통해 요청하면,

- 내가 적지 않은 요청내용이 담겨져 있다.
- 브라우저가 지정된 프로토콜에 따라 URL을 요청 메시지로 전환한 내용이라고 한다.

- 응답 헤더에 코드상 적은 내용들이 담겨져 있는걸 확인

URL 요청에서 응답까지의 과정은 어떻게 됐을까?
- URL을 다시 보면,
localhost:8080
- 도메인 : localhost
- 포트 번호 : 8080
- 두 가지만으로 소스 코드에 Socket 커넥션과 응답헤더 처리까지 진행 할 수 있었다.

HTTP
클라이언트-서버 응용 프로그램 수준 프로토콜
- HTTP는 TCP/IP에서만 실행가능한게 아니라, 신뢰할 수 있는 전송 가정하에, 이러한 보장을 제공하는 모든 전송 프로토콜을 사용할 수 있다.
TCP/IP(전송 제어 프로토콜/인터넷 프로토콜)
시스템이 네트워크를 통해 서로 통신하기 위한 전송 및 네트워크 계층 프로토콜 집합
- IP (인터넷 프로토콜)
- 네트워크 주소 지정 및 라우팅을 처리하는 네트워크 계층 프로토콜
- IP 네트워크 각 시스템에는 고유한 IP 주소(예: 165.1.2.3)가 할당되며, IP 소프트웨어는 원본 IP에서 대상 IP로 메시지를 라우팅하는 역할
- IPv4 (IP 버전 4)
- IP 주소는 4바이트로 구성되며 각 범위는 0에서 255까지로 네트워크에서 최대 4G 주소를 지원
- DNS(Domain Name Service)
- 도메인 이름을 IP 주소로 변환
- 특수 IP 주소 127.0.0.1 = 도메인명 localhost
(항상 자신의 컴퓨터 참조)
- TCP
두 시스템 간의 연결을 설정하는 전송 계층 프로토콜
- 2가지 프로토콜 : TCP, UDP(User Datagram Package)
- 신뢰 할 수 있다.
- 각 패킷에는 시퀀스 번호가 있으며, TCP에서 패킷 전달 보장
- IP 시스템 내에서 응용 프로그램을 다중화
- 각 IP 시스템에 대해 TCP는 포트 번호 0에서 65535까지 최대 65536개의 포트(또는 소켓)를 지원(다중화)
- 포트 0 ~ 1023은 널리 사용되는 프로토콜(예: HTTP 80, FTP 21, Telnet 23, SMTP 25, NNTP 119, DNS 53)에 미리 할당
- TCP 포트 80이 HTTP에 미리 할당되어 있지만 기본 HTTP 포트 번호로 8000, 8080과 같은 다른 사용자 할당 포트 번호(1024-65535)에서 HTTP 서버를 실행하는 것도 가능하다.
- URL에 포트 번호를 명시적으로 지정
- 즉, TCP/IP 통신 위해서는 IP와 포트번호를 알면 된다.
- UDP
- 패킷전달을 보장하지 않는다.
- 오벗헤드가 적다
- 비디오 및 오디오 스트리밍과 같은 애플리케이션에 사용

(이미지 출처 : https://whatsup95.tistory.com/19)
실습예제
위에서 TCP/IP 통신 위해서는 IP와 포트번호를 알면 된다
고 했다.
ServerSocket에 port 번호만 할당 했는데?
- 처음에는 ServerSocket에 addr=0.0.0.0/0.0.0.0으로 생성
public ServerSocket(int port) throws IOException {
this(port, 50, null);
}

- accept() 대기 상태에서 클라이언트 요청으로 생성시킨 소켓(Socket)에 위임
- TCP의 포트 영역 0 ~ 0xFFFF (0 ~ 65535) 범위
- InetSocketAddress 에서 0:0:0:0:0:0:0:1 할당


- 소스를 분석하고자 하니 복잡해 보였지만, 정의되어진 프로토콜에 맞춰 로직들이 돌아가는 소스들이라는 점은 좀더 익숙해질 수 있을것 같았다.
소켓 네트워크 프로그래밍에 대한 이해
HTTP basics