CS/네트워크

[Network] 실제 구현상에서의 Socket

kyoulho 2024. 8. 6. 16:09

표준으로서의 Socket과 실제 구현상의 Socket에는 차이가 있다.

애플리케이션은 시스템의 기능을 함부로 쓸 수 없다. 때문에 시스템은 애플리케이션이 네트워크 기능을 사용할 수 있도록 프로그래밍 인터페이스를 제공하여야 하며 이를 소켓이라고 한다. 개발자는 소켓 프로그래밍을 통해 네트워크 상의 다른 프로세스와 데이터를 주고받을 수 있도록 구현한다.

 

실제 구현상에서 동작하는 소켓

  • 대부분의 시스템은 소켓 형태로 네트워크 기능을 제공하지만 보통 소켓을 직접 조작해서 통신 기능을 구현할 일은 적다.
  • Application Layer의 프로토콜은 보통 라이브러리나 모듈 형태로 제공되는데, 이때 내부를 열어보면 소켓을 활용해서 프로토콜을 구현했음을 알 수 있다.
  • 소켓은 <protocol, IP address, port number>로 정의되지만 표준처럼 유니크하게 식별되지는 않는다.

 

TCP 소켓 동작 방식

  1. 클라이언트는 커넥션을 맺기 위해서 서버로 요청을 보낸다.
  2. 서버는 커넥션을 맺는 요청을 기다리는 listening socket을 가지고 있다.
  3. 커넥션이 맺어지면 서버는 별도의 소켓을 만든다.
  4. 클라이언트는 새롭게 생성된 소켓과 함께 성립된 커넥션 위에서 데이터를 주고받는다.
  5. 또 다른 클라이언트가 커넥션을 맺기 위해 listening socket으로 요청을 보낸다.
  6. 커넥션이 맺어지면 서버는 또 다른 소켓을 만들어서 데이터를 주고받는다.
  7. 추가로 생성된 소켓의 IP 주소와 포트는 listening socket과 같은 주소와 포트를 가진다.
  8. 결국, 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