Network 프로그래밍에서의 Socket
프로토콜 표준에서 정의한 socket과의 차이
애플리케이션이 시스템의 기능을 함부로 사용할 순 없다. 대신 시스템은 애플리케이션이 네트워크 기능을 사용할 수 있도록 프로그래밍 인터페이스를 제공한다.
이 인터페이스를 Socket이라 하고, 애플리케이션은 Socket을 통해 데이터를 주고받는다.
개발자는 소켓 프로그래밍을 통해 네트워크 상의 다른 프로세스와 데이터를 주고받을 수 있도록 구현한다. 또, 대부분의 시스템(OS)에서는 Socket의 형태로 네트워크 기능을 제공한다.
간단한 API를 구현하면서, 나는 socket을 직접 생성/관리한 적이 없는데? 라는 생각이 들었다.
우리가 흔히 아는 클라이언트-서버 통신을 HTTP로 구현한 경우, 프레임워크에서 이미 소켓 프로그래밍을 추상화해서 제공하기 때문에 개발자가 직접 소켓을 생성/관리할 필요가 없다.
HTTP 요청/응답은 내부적으로 TCP 소켓을 사용한다.
HTTP나 WebSocket 같은 높은 수준의 프로토콜은 모두 TCP/IP 소켓 위에서 구현되어 있다.
application layer의 프로토콜은 보통 라이브러리나 모듈 형태로 기능이 제공되는데, 내부를 살펴보면 소켓을 활용해서 프로토콜을 구현했다.
여기서 다루는 내용은 ‘프로토콜 표준’에서 정의한 내용과 상이할 수 있다.

Socket 실제 구현 관점
실제 구현에서 소켓은 <protocol, ip addr, port number>로 정의할 수 있다.
여기서 port는 socket을 식별하기 위해 부여되는 숫자이고 socket 주소는 ip addr + port number로 볼 수 있다.
프로토콜 스펙을 시스템 레벨(applicaition x)에서 구현하면 조금 달라진다.
프로토콜 표준에서의 socket은 <protocol, ip addr, port number>로 유니크하게 식별된다고 했었다. 하지만 실제 구현에서는 조금 다르다.
UDP는 ip addr과 port number로 유니크하게 식별이 가능하다.
TCP는 ip addr과 port number만으로는 유니크하게 식별 불가능하다.
TCP Socket 동작 방식

각 프로세스에서 소켓 A(<77..77, 499>) 소켓 B(<50..50, 8080>)으로 소켓을 생성했다고 가정하자.
B에서 connection을 맺기 위해 기다리는 socket이 존재한다.
listening socketB에 요청이 들어오면 A, B는 3-way-handshake를 통해 conneciton을 맺는다.
connection이 형성되면 서버 소켓(B)에서는 새로운 소켓(C)을 하나 생성한다.
클라이언트는 서버에서 생성한 C 소켓을 통해 데이터를 주고받는다.
🧐 새로 생성된 C 소켓의 주소(ip addr + port)는 어떻게 될까?
처음 생성한 서버 소켓(B)과 동일하다.
그러면 그림과 같이 여러 클라이언트와 connection을 맺어 새로 생성된 소켓들은 어떻게 유니크하게 구별이 되는가?
TCP connection이 맺어지기 전에는, listening socket으로 커넥션을 형성한다.
connection이 성립되고 나서는 새로운 소켓에 clinet ip, client port 정보가 추가되면서 유니크한 소켓으로 식별할 수 있다.
정리하면,
Listening Socket
TCP connection을 맺기 위한 소켓
새로운 연결을 수신하는 역할만 담당
Protocol, Server IP, Server Port로 구성
Connection Socket
connection 성립 후 서버에서 새로 생성하는 소켓
실제 데이터 통신을 담당
Protocol, Server IP, Server Port, Client IP, Client Port로 구성
UDP Socket 동작 방식

UDP는 연결 지향적이지 않기 때문에 구성이 더 단순하다.
Listening Socket과 Connection Socket의 구분이 없다. 하나의 소켓으로 모든 통신을 처리한다.
클라이언트 소켓과 서버 소켓 간의 연결 상태를 유지하지 않는다.
(비 연결성)ip addr + port number 만으로 소켓 식별이 가능하다.
클라이언트 소켓과 서버 소켓 연결 없이 소켓에서 소켓으로 직접 데이터를 전송하고 수신할 수 있다.
서버의 UDP 소켓 또한 클라이언트의 UDP 소켓의 ip와 port를 보고 어디서 데이터가 왔는지 알 수 있다.
TCP, UDP 차이
IP는 신뢰할 수 없는 프로토콜이며 TCP, UDP는 이 위에서 동작한다.
TCP는 신뢰할 수 없는 프로토콜 위에서 신뢰할 수 있는 프로토콜로 동작하게 하기 위해 connection이 등장하게 된 것이다.
Last updated