소켓(Socket)

- 네트워크 상에서 프로세스 간 통신을 가능하게 하는 엔드포인트
- 네트워크를 통해 데이터를 송수신하는 데 사용되며, 네트워크를 통해 서로 다른 시스템 간에 통신할 수 있도록 한다.
- 주로 TCP/IP 프로토콜 스택과 함께 사용되며, TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)를 지원한다.
- 웹 서버, 채팅 애플리케이션, 온라인 게임 등에서 소켓을 사용하여 실시간 데이터 통신을 구현할 수 있다.
TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)는 인터넷 프로토콜 스위트의 핵심 프로토콜 중 두 가지
이 두 프로토콜은 네트워크 통신에서 데이터를 전송하는 데 사용된다.
TCP(Transmission Control Protocol)
- 연결 지향적 프로토콜, 데이터를 주고받기 전에 먼저 연결을 설정해야 한다.
- 데이터 전송 시 데이터의 순서를 보존하고, 손실된 데이터를 재전송하며, 중복된 데이터를 제거한다.
- 흐름 제어와 혼잡 제어 기능을 제공하여 네트워크 상황에 따라 데이터 전송 속도를 조절한다.
- 대부분의 웹 브라우징, 이메일 전송, 파일 전송 등과 같은 응용 프로그램에서 사용된다.
UDP(User Datagram Protocol)
- 비연결 지향적 프로토콜, 연결 설정 과정이 없으며 데이터를 주고받을 때 먼저 연결을 설정할 필요가 없다.
- 데이터 전송에 대한 오류 검사와 재전송 기능이 없다.
- 혼잡 제어나 흐름 제어 기능이 없기 때문에 데이터 전송 속도를 제어할 수 없다.
- 실시간 음성 및 영상 스트리밍, DNS 쿼리 등과 같이 데이터의 손실이 크게 중요하지 않은 응용 프로그램에서 주로 사용된다.
소켓을 사용하여 데이터를 주고받는 과정?
1. 소켓 생성(Socket Creation)
- 호스트 및 포트 번호를 지정하여 소켓을 초기화
2. 연결 설정(Connection Establishment)
- 클라이언트가 서버에 연결을 요청하거나, 서버가 클라이언트의 연결 요청을 수락
3. 데이터 송수신(Data Transmission)
- 연결이 설정된 후에는 클라이언트와 서버가 데이터를 송수신
- 송신한 데이터는 수신측에서 수신되고 처리된다.
4. 연결 종료(Connection Termination)
- 통신이 완료된 후에는 연결을 종료
- 소켓을 닫고 사용한 자원을 반환
특징
연결 지향성(Connection-oriented)
- TCP 소켓은 연결을 설정하고 데이터를 안정적으로 전송하는 데 사용된다.
- 데이터를 전송하기 전에 클라이언트와 서버 간에 연결을 설정한다.
비연결 지향성(Connectionless)
- UDP 소켓은 연결 없이 데이터를 전송하는 데 사용된다.
- 데이터를 전송할 때 클라이언트와 서버 간에 연결을 설정할 필요가 없다.
멀티캐스팅(Multicasting)
- 소켓은 멀티캐스팅을 지원하여 하나의 송신자가 여러 수신자에게 데이터를 전송할 수 있다.
블로킹(Blocked) vs. 논블로킹(Non-blocking)
- 소켓은 블로킹 또는 논블로킹 모드로 작동할 수 있다.
- 블로킹 모드에서는 입출력 작업이 완료될 때까지 대기하며, 논블로킹 모드에서는 입출력 작업이 진행 중일 때에도 다른 작업을 수행할 수 있다.
Python 간단 예시 코드
클라이언트-서버 통신을 구현하는데 소켓을 사용한 것
서버는 클라이언트의 요청을 받아들이고, 클라이언트는 서버에게 메시지를 보내고 응답을 받는 형태로 동작한다.
서버(server.py)
import socket
# 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 서버 주소와 포트 지정
server_address = ('localhost', 12345)
# 소켓과 주소 바인딩
server_socket.bind(server_address)
# 연결 대기 상태로 진입
server_socket.listen(5)
print("서버가 시작되었습니다.")
while True:
# 클라이언트로부터 연결 요청 수락
client_socket, client_address = server_socket.accept()
# 클라이언트로부터 데이터 수신
data = client_socket.recv(1024)
print(f"수신한 데이터: {data.decode()}")
# 클라이언트에게 응답 전송
message = "서버가 메시지를 수신하였습니다."
client_socket.sendall(message.encode())
# 연결 종료
client_socket.close()
클라이언트(client.py)
import socket
# 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 서버 주소와 포트 지정
server_address = ('localhost', 12345)
# 서버에 연결
client_socket.connect(server_address)
# 메시지 전송
message = "서버 연결 시도"
client_socket.sendall(message.encode())
# 서버로부터 응답 수신
data = client_socket.recv(1024)
print(f"서버로부터 수신한 응답: {data.decode()}")
# 연결 종료
client_socket.close()
'CS' 카테고리의 다른 글
WebRTC와 시그널링 (0) | 2024.05.23 |
---|---|
네트워크 프로토콜과 통신 개념 (0) | 2024.05.17 |
UI/UX 용어 (0) | 2024.05.09 |
프로세스 스케줄링 알고리즘 (1) | 2024.04.30 |
TCP vs. UDP (0) | 2024.04.23 |