[Network] 포트(PORT), 소켓(Socket)이란? (웹소켓 아님 Web Socket != Socket)
포트(Port)
Port는 운영체제 통신에서의 네트워크 연결이 시작되고 끝나는 논리적인 접속 지점을 말한다.
보통 http://192.168.1.1:8080과 같이 프로토콜/호스트/포트로 구분되어 도메인이 정의된다.
여기서 192.168.1.1와 같은 IP 주소가 컴퓨터 또는 네트워크 장치 등을 식별하는 것이라면,
포트 번호는 해당 컴퓨터 내의 특정 응용 프로그램을 식별한다.
데이터를 송수신할 때,
DataLink 계층에서 호스트의 NIC(Network Interface Card, LAN 카드)로 MAC 주소를 판별하고,
Network 계층에서 IP 주소로 목적지를 판별한다.
MAC 주소와 IP 주소로 목적지 호스트까지 도달한 뒤에는 어떤 응용프로그램 또는 프로세스로 접근할지를 알아야 하는데, 이때 쓰이는 것이 Port 번호이다.
포트 번호
포트 번호는 16비트의 논리적 할당으로 0~65536번까지 존재한다.
이 포트 번호로 하나의 IP를 가진 장치 내에서 프로세스를 구분할 수 있다.
0번 ~ 1023번: well-known port
해당 포트 대역은 잘 알려진 서비스나 프로토콜을 위해 예약되어 있는 포트 번호이다.
기본적으로 웹 서버는 80번 포트와 연결(listening) 되어있고, 웹 서버를 하나 더 사용하고 싶은 경우에는 관습적으로 8080 포트에 연결한다고 한다.
Spring Boot 프로젝트를 띄우면 기본적으로 8080 포트를 사용하는 이유다.
포트 번호 | 프로토콜 | 통신 프로토콜 | 설명 |
80 | HTTP | TCP | 웹서버 접속 |
443 | HTTPS | TCP | 웹 서버 접속(SSL) |
22 | SSH | TCP | 원격 로그인 |
110 | POP3 | TCP | 메일 읽기 |
25 | SMTP | TCP | 메일 전송 |
53 | DNS | UDP | DNS 질의 |
20 | FTP | TCP | 데이터 전송 |
21 | FTP | TCP | FTP 제어 |
1024번 ~ 49151번: Registered Port
해당 포트 대역은 특정 애플리케이션이나 벤더를 위해 등록되어 있다.
여러 인프라를 사용하다 보면 해당 서비스의 기본 포트들이 정해져 있는 것을 볼 수 있다.
포트 번호 | 설명 |
8080 | 대체 HTTP 포트 (웹 서버) |
5432 | PostgreSQL DB |
3306 | MariaDB (MySQL) |
6379 | redis |
27017 | MongoDB |
49152번 ~ 65535번: Dynamic or Private Port
해당 포트 대역은 클라이언트 측에서 임시로 사용하는 포트이다. 클라이언트가 서버에 연결할 때 운영체제가 자동으로 할당된다.
Node.js 애플리케이션을 띄울 때 Port Already use 일 때 해당 대역의 포트를 자동으로 할당하는 것을 볼 수 있다.
포트와 소켓
IP와 Port가 정해지면, 이 두가지를 결합하여 소켓을 형성한다.
(IP 주소가 192.168.1.1, 포트 번호가 8080인 경우 192.168.1.1:8080으로 소켓을 형성한다.)
특정 IP의 특정 PORT로 통신 세션을 설정하고 데이터를 송수신하는데에 사용된다.
소켓에 대해 알아보자.
소켓(Socket), 소켓 통신
소켓은 네트워크 통신의 양 끝점을 나타내는 추상화된 개념이다.
IP 주소와 포트 번호의 조합으로 통신 세션을 설정하고 데이터를 송수신 하는데에 사용한다.
서버 측과 클라이언트 측 (양 끝단)에 소켓을 각각 생성하고, 해당 소켓 간에 통신을 하여 데이터를 송수신한다고 생각하면 된다.
여기서, 서버측 소켓(ServerSocket)은 하나의 포트 당 하나만 생성할 수 있고, 클라이언트 측 소켓은 여러 개를 생성하여 하나의 ServerSocket과 통신하여 데이터를 주고받을 수 있다.
소켓 통신
소켓 통신은 TCP 통신, HTTP 통신에 비해 낮은 수준의 통신이다.
클라이언트와 서버가 특정 포트를 통해 양방향 통신을 하는 방식이다.
HTTP 처럼 데이터 전달 후 연결을 끊는 Connetionless 방식이 아닌, 계속해서 연결을 유지하는 방식이기 때문에 HTTP에 비해 많은 리소스를 소모한다. 클라이언트와 서버가 실시간으로 계속해서 데이터를 주고받아야 하는 경우에 사용한다.
소켓 작동 방식
소켓은 각각 아래와 같은 방식으로 동작한다.
서버 측 소켓
- 소켓 생성: 클라이언트의 연결 요청을 대기하기 위한 소켓 생성
- Binding(주소 할당): IP 주소와 Port 번호를 할당받는다.
- Listening: 연결되지 않은 소켓을 대기모드로 전환한다.
- accept(): 클라이언트가 연결 요청을 하면, 수락 후 실질적인 통신을 위한 소켓을 생성한다.
(3번의 소켓은 only 대기용) - 데이터 송수신: 연결이 설정되면, 클라이언트와 서버가 소켓을 통해 데이터를 주고받는다.
- 연결 종료: 소켓을 닫는다.
클라이언트 측 소켓
- 소켓 생성: 서버에 연결하기 위한 소켓을 생성
- 서버에 연결: 서버가 설정한 IP, Port로 연결을 시도한다.
- 서버가 accept()로 클라이언트의 요청을 수락하면 클라이언트의 socket descriptor가 반환되고 데이터를 송수신할 준비가 된다.
- 데이터 송수신: 데이터를 주고받는다.
- 연결 종료: 소켓을 닫는다.
그림으로 정리하면 아래와 같다.
소켓 프로그래밍의 주요 개념
- 바인딩(Binding): 서버 소켓은 서버의 특정 IP 주소, 포트 번호에 바인딩되어 클라이언트의 연결 요청을 기다린다.
- 리스닝(Listening): 서버 소켓은 클라이언트의 연결 요청을 대기하는 리스닝 상태가 존재한다.
- 수락(Accepting): 서버 소켓은 클라이언트의 연결 요청을 수락하고, 새로운 소켓을 생성하여 클라이언트와의 통신을 처리한다.
- 연결(Connection): 클라이언트 소켓은 서버 소켓에 연결 요청을 하고, 연결이 성립되면 데이터를 송수신한다.
소켓 통신 vs TCP 통신 vs HTTP 통신
특징 | 소켓 통신 | TCP 통신 | HTTP 통신 |
통신 수준 | 네트워크 계층/전송 계층 | 전송 계층 | 애플리케이션 계층 |
프로토콜 | TCP, UDP 등 다양한 프로토콜 | TCP | TCP 기반, HTTP/1.x, HTTP/2, HTTP/3 |
연결 방식 | 유연성 (연결 지향/비연결 지향) | 연결 지향적 | 비연결성 (HTTP/1.x) 연결 유지 (HTTP/2, HTTP/3) |
신뢰성 | 사용자 정의 | 신뢰성 보장 | TCP의 신뢰성에 의존 |
데이터 형식 | 사용자 정의 | 스트림 기반 | 요청-응답 모델, 표준화된 메시지 형식 |
상태 관리 | 사용자 정의 | 상태 유지 | 비연결성 (HTTP/1.x) 연결 유지 (HTTP/2, HTTP/3) |
사용 예시 | 다양한 네트워크 애플리케이션 | 파일 전송, 이메일, 원격 접속 등 | 웹 브라우징, API 통신, 웹 서비스 |
Java Socket Programming 예제
[JAVA & Spring] - [Java] 소켓 프로그래밍(Socket Programming) 예제 / ServerSocket, Socket, Thread 프로그래밍
[Java] 소켓 프로그래밍(Socket Programming) 예제 / ServerSocket, Socket, Thread 프로그래밍
들어가기 전에, 소켓에 대한 글을 보고 오시는 걸 추천합니다.[컴퓨터 공학/Web & Network] - [Network] 포트(PORT), 소켓(Socket)이란? (웹소켓 아님 Web Socket != Socket) [Network] 포트(PORT), 소켓(Socket)이란? (웹
innovation123.tistory.com