BSD 소켓
BSD 소켓은 기본적으로 네트워크 프로그램을 작성 시에 사용되는 인터페이스이며, 주목적은 네트워크 상에서 서로 다른 컴퓨터에 간에 데이터를 주고받을 수 있도록 해주는 일종의 소프트웨어 도구입니다.
👆🤓BSD 소켓에서의 BSD는 Berkeley Software Distribution의 약자로 Unix 운영 체제의 한 버전에서 비롯되었습니다.
BSD 소켓은 줄여서 그냥 소켓(Socket)이라고도 부릅니다! 우리가 흔히 말하는 웹소켓 통신, 소켓 통신 모두 이 BSD 소켓을 말하는 것이죠! 이 소켓을 통해서 TCP/IP 통신이 가능하게 됩니다.
통신을 위한 소켓의 다양한 기능(listen, bind, accept, recv 등)을 제공하는 것을 BSD 소켓 API라고 합니다. 이 소켓 API는 다양한 운영체제에 이식되어 사용되며, 네트워크 프로그램의 기초가 되었습니다.
소켓의 종류
소켓은 크게 두 가지 종류로 나뉩니다.
1. 스트림 소켓(Stream socket): 신뢰할 수 있는 연결을 통해서 데이터를 주고 받는 소켓입니다. 흔히 TCP(Transmission Control Protocol)을 사용하기 때문에 연결이 안전하게 유지되고, 데이터가 순서대로 전달된다는 특징이 있습니다. 웹 브라우저가 웹 서버에 연결할 때 사용하는 소켓이 바로 스트림 소켓입니다.
2. 데이터그램 소켓(Datagram socket): 신뢰할 수 없는 연결을 통해서 데이터를 주고 받는 소켓입니다. UDP(User Datagram Protocol)을 사용하기 때문에 데이터를 빠르게 보낼 수 있으나, 데이터가 중간에 유실되거나 도착 순서가 틀릴 수 있습니다. 실시간 게임과 같이 빠른 반응을 요구하는 환경에서 사용합니다.
소켓의 사용 이유?
실제로 네트워크를 통한 컴퓨터 간의 통신은 실제로 매우 복잡하기 때문에 OSI 7계층을 만들고 더 나아가 TCP/IP 등의 프로토콜을 만들어 인터넷 애플리케이션 개발에 사용하고 있습니다. 지금 알아보는 소켓 또한 통신을 위한 인터넷 애플리케이션을 쉽게 만들 수 있도록 돕는 함수의 집합입니다. 즉 소켓의 기본적 목적은 통신 시의 복잡함을 줄여 서버-클라이언트 간의 통신을 쉽게 할 수 있도록 하는 것입니다.
아래의 그림과 같이 소켓은 인터넷을 통한 통신 시에 소프트웨어를 인터넷에 연결시켜주는 접점 역할을 하게 됩니다. 해당 접점을 활용하여 소프트웨어가 서로 통신을 할 수 있게 되는 것이죠. 이러한 소켓은 인터넷과 소프트웨어를 연결하는 접점 역할을 하기 때문에 endpoint socket이라고 부르기도 합니다.
네트워크에서의 소켓 활용
소켓 네트워크 프로그래밍이란 소켓 함수를 이용하여 소켓 객체를 생성해 인터넷을 가로질러 통신할 수 있는 소프트웨어를 만드는 프로그래밍 기술을 말합니다.
네트워크를 통해 소프트웨어 A에서 소프트웨어 B의 위치를 찾아서 통신하기 위해서는 IP, 포트 두 가지가 필요합니다. 해당 소프트웨어가 저장된 장치(컴퓨터)의 위치를 찾기 위해서 IP가 필요합니다. 장치(컴퓨터) 내에서의 소프트웨어와 통신하기 위해서는 포트가 필요합니다.
서버와 클라이언트의 연결과 데이터 통신 흐름
소켓 프로그램은 기본적으로 서버-클라이언트 형식으로 통신합니다. 통신을 시도하는 쪽이 클라이언트, 통신 요청을 받는 쪽이 서버가 됩니다. 통신을 위해서 앞서 설명한 소켓 API를 활용합니다.
서버에서의 소켓
1. socket(): 소켓 객체를 생성. 각 소켓은 file descriptor로 구분됨.
2. bind(): 1을 통해 생성한 소켓에게 IP 주소와 Port 번호를 연결함.
3. listen(): 소켓은 클라이언트의 연결 요청을 기다림.
4. accept(): 이 과정에서 서버는 소켓을 하나 더 생성함. 클라이언트 소켓에서 연결 요청이 왔을 때 accept() 함수가 호출된다. 기존에 존재하는 listen 소켓은 현재 클라이언트 말고 다른 클라이언트에서 오는 요청도 대기해야 하기 때문에 요청이 오면 새로운 소켓을 만들어 연결해 주는 것이다.
5. send()&recv(): 연결을 맺은 클라이언트 소켓과 데이터를 주고받는 과정임.
6. close(): 클라이언트 소켓이 연결을 종료하면 연결되어 있던 소켓을 반환함.
클라이언트에서의 소켓
1. socket(): 소켓 객체를 생성하는 과정.
2. connect(): 서버와 달리 클라이언트 소켓은 bind 과정이 필요가 없는데, 이는 클라이언트 소켓이 연결을 요청하는 쪽이기 때문이다(따로 포트 번호를 알고 있을 필요가 없다). connect 과정을 통해 소켓에게 임의의 소켓 번호가 부여되고 서버 소켓과 연결을 맺는다. 이 때 TCP의 3-way-handshake를 통해 연결을 한다.
3. send()&recv(): 연결을 맺은 서버 소켓과 데이터를 주고받는 과정임.
4. close(): 서버와 연결을 종료하고 소켓에게 할당된 자원을 반납함.
References
https://www.joinc.co.kr/w/Site/Network_Programing/Documents/socket_beginning
'CS' 카테고리의 다른 글
[CS] TCP/IP 4계층 (0) | 2024.08.17 |
---|---|
[CS] OSI 7계층(OSI Model) (0) | 2024.08.16 |
[C언어] GCC(GNU Compiler Collection) (1) | 2024.07.26 |
[CS] 가상화(Virtualization) (3) | 2024.07.26 |
[C언어] 포인터(Pointer) (1) | 2024.07.25 |