< 2024.09.26 업로드 >
안녕하세요! SSAFYcial 12기 기자단 안수진입니다.
오늘은 여러분과 함께 네트워크 통신의 핵심적인 개념인 소켓 통신에 대해 알아보려고 합니다! 😊
네트워크가 어떻게 연결되고, 서버와 클라이언트가 서로 데이터를 주고받을 수 있는지 궁금하지 않으신가요?
소켓 통신은 우리가 인터넷을 사용하면서 데이터를 주고받을 수 있게 해주는 중요한 기술이랍니다.
그렇다면, 소켓 통신이 무엇인지, 왜 필요한지, 그리고 어떻게 작동하는지에 대해 함께 탐구해볼까요? 😍
🚀 소켓 통신이란?
네트워크 상에서 데이터를 주고받기 위한 연결의 종단점을 나타내는 소프트웨어 구조
IP 주소와 포트 번호를 조합하여 통신 상대를 식별합니다.
즉, 서버와 클라이언트의 IP 주소, 포트번호, 연결 상태 등을 기록하는 파일 디스크립터 라는 정보를 관리합니다.
파일 디스크립터? 실제 데이터를 송수신하는 통로로, 컴퓨터의 운영 체제가 소켓을 관리하는 데 사용하는 구조
이를 통해 서로 다른 시스템이나 동일한 시스템 내의 프로세스들이 데이터를 주고받을 수 있습니다.
소켓은 OSI 모델의 전송 계층과 응용 프로그램 사이의 인터페이스 역할을 하며 떨어져 있는 두 호스트를 연결해줍니다.
예를 들어
- 클라이언트는 서버의 IP 주소와 포트 번호를 사용하여 소켓을 생성하고, 이를 통해 서버에 연결을 시도합니다.
- 서버는 미리 설정된 포트에서 클라이언트의 연결 요청을 기다립니다. 클라이언트가 연결 요청을 보내면, 서버는 소켓을 통해 해당 요청을 수락하고 데이터 송수신을 시작합니다.
즉, 클라이언트와 서버 간의 연결을 설정하고 데이터 송수신을 담당합니다.
🤔 IP? Port? Socket? 헷갈려요!!
IP
IP 주소는 네트워크 상에서 각 장치(컴퓨터, 서버, 라우터 등)을 식별하는 고유한 주소입니다.
간단히 말해, 인터넷 상에서 "이 컴퓨터는 누구인가?"를 알려주는 번호입니다.
우리가 인터넷을 사용할 때, 데이터를 전송할 대상 장치가 어디인지 알려주는 역할을 합니다.
Port
Port는 한 컴퓨터 안에서 여러 개의 애플리케이션이 네트워크 통신을 할 수 있도록 구분하는 번호입니다.
같은 IP 주소를 가진 여러 애플리케이션이 서로 다른 Port 번호를 사용하여 동시에 데이터를 주고받을 수 있습니다.
예를 들어, 웹 서버는 보통 80번 포트를 사용하고, 이메일 서버는 25번 포트를 사용합니다.
Socket
Socket은 네트워크 통신에서 데이터를 주고받을 수 있는 통로입니다.
소켓은 IP 주소와 Port 번호를 결합해 네트워크 상에서 서로 다른 장치나 애플리케이션이 데이터를 주고받을 수 있게 해줍니다.
즉, "이 컴퓨터의 80번 포트에 연결된 웹 서버와 통신"이라는 구체적인 정보를 포함하여 실제로 데이터를 송수신하는 역할을 합니다.
💡 소켓의 종류
1. 스트림 소켓 (Stream Socket)
- 프로토콜: TCP(Transmission Control Protocol)
- 특징: 연결 지향적이며, 데이터의 신뢰성과 순서를 보장합니다.
- 사용 사례: 웹 브라우징, 이메일 전송 등 신뢰성이 중요한 통신
2. 데이터그램 소켓 (Datagram Socket)
- 프로토콜: UDP(User Datagram Protocol)
- 특징: 비연결 지향적이며, 데이터의 신뢰성을 보장하지 않습니다.
- 사용 사례: 실시간 스트리밍, 온라인 게임 등 속도가 중요한 통신
소켓은 주로 TCP/IP 프로토콜 스택을 기반으로 사용됩니다.
🚀 왜 소켓 통신이 필요할까?
💡 서버와 클라이언트간의 통신
네트워크 통신에서 소켓은 핵심적인 역할을 담당합니다.
클라이언트 입장에서는 서버와 1:1 통신을 하지만
서버 입장에서는 다수의 클라이언트와 동시에 통신을 처리해야 합니다.
서버는 증가하는 트래픽을 효과적으로 처리하고 안정적인 데이터 송수신을 위해 소켓을 활용합니다.
서버는 증가하는 트래픽에 대응하고 효율적인 데이터 처리를 위해 IP 주소와 포트 번호를 기반으로 통신 상대를 식별하고,
데이터 송수신 채널을 제공하며, 연결 상태를 관리하는 소켓을 활용합니다.
💡 동시 요청 처리의 필요성
N명의 클라이언트로부터 동시에 요청이 들어올 때, 이를 효율적으로 처리할 수 있는 방법은 무엇일까요?
가장 단순한 방법은 각 요청마다 N개의 스레드를 생성하는 것이지만, 이는 여러 가지 한계를 가지고 있습니다.
🔈 스레드를 이용한 동시 요청 처리의 문제점
- 공유 자원 관리의 복잡성
- 여러 스레드가 동일한 자원을 접근할 경우, 동기화 문제와 경합 조건(race condition) 등이 발생합니다.
- 이로 인해 데이터 무결성이 손상될 위험이 있습니다.
- 높은 오버헤드
- 스레드를 생성하고 관리하는 데는 많은 자원이 소모됩니다.
- 이를 해결하기 위해 스레드 풀링(thread pooling)을 도입할 수 있지만, 추가적인 관리 비용이 필요합니다.
- 확장성의 한계
- 스레드 수는 CPU 코어 수에 의해 제한됩니다.
- 스레드가 많아질수록 메모리와 CPU 리소스가 소모되어 전체 시스템 성능이 저하됩니다.
🔈 소켓이 동시 요청 처리에 적합한 이유
- 멀티플렉싱(Multiplexing) 지원
- 소켓은 select, poll, epoll과 같은 멀티플렉싱 기법을 통해 다수의 클라이언트 요청을 단일 스레드에서 처리할 수 있습니다.
- 이를 통해 스레드 생성 없이도 여러 요청을 비동기적으로 처리합니다.
- 비동기 I/O 지원
- 소켓은 비동기 입출력(Non-blocking I/O) 방식으로 작동하여, 대기 시간이 발생하더라도 다른 작업을 중단하지 않습니다.
- 이는 CPU와 메모리 자원의 활용도를 높이고, 처리 지연을 최소화합니다.
- 효율적인 자원 관리
- 소켓은 최소한의 스레드만으로도 다수의 요청을 처리할 수 있도록 설계되었습니다.
- 시스템 리소스를 절약하며, 확장성 측면에서도 유리한 구조를 제공합니다.
결론적으로
소켓은 서버와 클라이언트의 IP 주소, 포트 번호, 연결 상태 등을 관리하는 파일과 같은 역할을 합니다.
소켓을 사용하면 각 클라이언트의 요청을 처리할 때마다 새로운 프로세스나 스레드를 생성할 필요가 없어집니다.
대신, 소켓들이 연결 정보를 효율적으로 관리하여 다수의 클라이언트 요청을 효과적으로 처리할 수 있습니다.
또한, 병렬 작업을 처리하고자 할 때는 멀티플렉싱(Multiplexing)을 구현하여 소켓 별로 스레드를 생성할 수 있습니다.
이를 통해 시스템 리소스를 효율적으로 사용하면서도 동시에 많은 클라이언트의 요청을 처리할 수 있습니다.
그렇다면 소켓을 사용하여 네트워크 통신 기능을 구현하는 과정
즉, 소켓 프로그래밍은 그럼 어떻게 이루어지는 것일까요?
🚀 소켓 프로그래밍
두 개의 시스템(또는 프로세스)이 소켓을 통해 네트워크 연결을 설정하기 위해서는 한쪽에서 상대방에게 연결 요청을 보내야 합니다. 이때 연결 요청을 보내는지 또는 요청을 받아들이는지에 따라 소켓의 역할이 구분됩니다.
- 연결 요청을 보내는 소켓은 클라이언트 소켓(Client Socket)이라고 하며,
- 연결 요청을 받아들이는 소켓은 서버 소켓(Server Socket)이라고 합니다.
하지만 이 두 소켓은 역할에 따라 처리 흐름이나 호출되는 API 함수의 종류와 순서가 다를 뿐, 본질적으로 동일한 소켓입니다.
특히 서버 소켓은 클라이언트 소켓의 연결 요청을 받아들이는 역할만 수행하며, 실제 데이터의 송수신은 서버 소켓이 연결 요청을 수락한 결과로 생성된 새로운 소켓을 통해 이루어집니다.
💡 소켓 API 실행 흐름
클라이언트 소켓(Client Socket)
- 소켓 생성 socket() : 먼저 소켓을 생성합니다.
- 서버에 연결 요청 connect() : 생성한 소켓을 사용하여 서버 측에 연결을 요청합니다.
- 데이터 송수신 send() /recv() : 서버에서 연결이 수락되면 데이터를 송수신합니다.
- 소켓 닫기 close() : 모든 통신이 완료되면 소켓을 닫습니다.
서버 소켓(Server Socket)
- 소켓 생성 socket() : 클라이언트와 마찬가지로 소켓을 생성합니다.
- IP 주소와 포트 번호 결합 bind() : 서버가 사용할 IP 주소와 포트 번호를 소켓에 결합합니다.
- 연결 요청 대기 listen() : 클라이언트로부터의 연결 요청을 대기합니다.
- 연결 요청 수락 accept() : 연결 요청이 들어오면 이를 수락하고, 데이터 통신을 위한 새로운 소켓을 생성합니다.
- 데이터 송수신send() /recv() : 새로 생성된 소켓을 통해 클라이언트와 데이터를 송수신합니다.
- 소켓 닫기 close() : 통신이 완료되면 소켓을 닫습니다.
🗂️ References
[뽀따] 소켓 프로그래밍. (Socket Programming)
[나죽못고나강뿐] [Network] TCP/IP Socket 통신
👀 SSAFY의 다양한 소식과 이야기를 더 알고 싶다면
'SSAFY' 카테고리의 다른 글
[싸피셜이 알려드림: 기술편] Servlet이 뭘까? (0) | 2024.12.21 |
---|---|
[싸피셜이 알려드림: SSAFY편] 벌써 13기 모집? 알려줄게 SSAFY의 모든 것!! (0) | 2024.12.16 |
[싸피셜이 알려드림: SSAFY편] SSAFY 12기 싸피셜이 알려주는 SSAFY 지원 꿀팁! (2) | 2024.12.16 |
[싸피셜이 알려드림: 기술편] RDB와 NoSQL의 차이가 뭘까? (7) | 2024.11.05 |
[싸피셜이 알려드림: 인물편] SSAFY 12기 조유정 교육생 (1) | 2024.11.05 |