표준으로서의 Socket과 실제 구현상의 Socket에는 차이가 있다.
애플리케이션은 시스템의 기능을 함부로 쓸 수 없다. 때문에 시스템은 애플리케이션이 네트워크 기능을 사용할 수 있도록 프로그래밍 인터페이스를 제공하여야 하며 이를 소켓이라고 한다. 개발자는 소켓 프로그래밍을 통해 네트워크 상의 다른 프로세스와 데이터를 주고받을 수 있도록 구현한다.
실제 구현상에서 동작하는 소켓
- 대부분의 시스템은 소켓 형태로 네트워크 기능을 제공하지만 보통 소켓을 직접 조작해서 통신 기능을 구현할 일은 적다.
- Application Layer의 프로토콜은 보통 라이브러리나 모듈 형태로 제공되는데, 이때 내부를 열어보면 소켓을 활용해서 프로토콜을 구현했음을 알 수 있다.
- 소켓은
<protocol, IP address, port number>
로 정의되지만 표준처럼 유니크하게 식별되지는 않는다.
TCP 소켓 동작 방식
- 클라이언트는 커넥션을 맺기 위해서 서버로 요청을 보낸다.
- 서버는 커넥션을 맺는 요청을 기다리는
listening socket
을 가지고 있다. - 커넥션이 맺어지면 서버는 별도의 소켓을 만든다.
- 클라이언트는 새롭게 생성된 소켓과 함께 성립된 커넥션 위에서 데이터를 주고받는다.
- 또 다른 클라이언트가 커넥션을 맺기 위해
listening socket
으로 요청을 보낸다. - 커넥션이 맺어지면 서버는 또 다른 소켓을 만들어서 데이터를 주고받는다.
- 추가로 생성된 소켓의 IP 주소와 포트는
listening socket
과 같은 주소와 포트를 가진다. - 결국, 3개의 소켓의
<IP address, port number>
가 모두 동일하다.
왜 커넥션이 맺어지면 새로운 소켓을 만드는가?
이러한 메커니즘은 여러 가지 이유와 장점을 갖고 있다.
- 데이터 분리: 각 클라이언트와의 통신을 별개의 소켓을 통해 처리하면 데이터가 혼합되지 않는다. 클라이언트 A와 B가 동시에 데이터를 전송할 때, A의 데이터가 B에게 전송되거나 반대의 상황이 발생하지 않도록 보장할 수 있다.
- 상태 유지: 각 커넥션에 대한 상태 정보를 독립적으로 관리할 수 있다. 예를 들어, 클라이언트와의 통신 상태, 전송된 데이터 양, 타임아웃 설정 등을 각각의 소켓에 저장하여 관리할 수 있다.
- 격리된 오류 처리: 하나의 클라이언트와의 커넥션에서 문제가 발생하더라도, 다른 클라이언트와의 커넥션에 영향을 미치지 않는다. 예를 들어, 클라이언트 A의 소켓이 오류로 인해 종료되더라도, 클라이언트 B의 소켓은 영향을 받지 않고 정상적으로 동작합니다.
- 보안 관리: 각 커넥션에 대해 독립적인 보안 설정을 적용할 수 있다. 예를 들어, 클라이언트의 인증 상태, 암호화 설정 등을 개별 소켓 단위로 관리하여 보안성을 높일 수 있다.
- 리소스 최적화: 서버는 listening socket을 이용해 클라이언트 요청을 수신하고, 각 요청에 대해 별도의 소켓을 생성하여 통신을 처리함으로써, 시스템 리소스를 효율적으로 사용할 수 있다. listening socket은 오직 연결 요청을 수신하는 데 사용되고, 데이터 통신은 새로운 소켓을 통해 이루어지기 때문에 시스템 리소스가 최적화된다.
그렇다면 어떻게 소켓을 식별할까?
- 시스템은 커넥션 연결 요청이 오면
listening 소켓
으로 데이터를 보낸다. - 이미 커넥션이 성립된 이후에는
<src IP, src port, dest IP, dest port>
로 소켓을 식별한다.
클라이언트 소켓도 같은 IP와 포트를 가질 수 있을까?
- 몇몇 조건을 만족하면 가능하다.
- 클라이언트 소켓은 OS 레벨에서 포트 번호를 할당받는다. OS는 아무도 사용하지 않는 포트 번호를 할당한다.
- 소켓이 너무 많이 생성되어 남는 포트 번호가 없다면 같은 포트 번호의 소켓이 생성될 수 있다.
- 하지만 동일한 커넥션은 만들어지지 않는다.
그렇다면 UDP는?
- IP, 포트 번호만으로 유니크하게 식별할 수 있다.
- UDP 소켓에서 데이터를 보낼 때 어느 UDP 소켓으로 보낼지 지정할 수 있다.
- 데이터를 받을 때마다 어느 UDP 소켓으로부터 왔는지 알 수 있다.
프로토콜 표준과 실제 프로그래밍의 비교
프로토콜 표준 | 프로그래밍 | |
포트 | 프로세스가 데이터를 주고받는 통로 인터넷 상에서 포트 식별을 위한 숫자 |
인터넷 상에서 포트 식별을 위한 숫자 |
소켓 | 포트를 유니크하게 식별하는 주소 포트 자체를 의미하기도 함 |
프로그래밍 인터페이스 애플리케이션은 소켓을 통해 데이터를 주고받음 |
소켓 식별 방법 | <protocol, IP, port> |
UDP: <IP, port> |
TCP 커넥션 전: listening socket의 <IP, port> | ||
TCP 커넥션 후: <src IP, src port, dest IP, dest port> | ||
TCP 커넥션 | TCP에서 안정적인 데이터 송수신을 위해 필요한 기반<src IP, src port, dest IP, dest port> 로 구성되고 유니크하게 식별됨 |
728x90
'CS > 네트워크' 카테고리의 다른 글
[Network] TCP Connection 과 Socket (0) | 2024.08.06 |
---|---|
[Network] 네트워크의 기본 기능과 계층 모델 (0) | 2024.08.06 |