소켓 작동 방식

소켓은 일반적으로 클라이언트 및 서버 상호작용에 사용됩니다. 일반적인 시스템 구성은 서버를 한 시스템에 두고 클라이언트를 다른 시스템에 둡니다. 클라이언트는 서버에 연결하여 정보를 교환한 후 연결을 끊습니다.

소켓에는 일반적인 이벤트 흐름이 있습니다. 연결 지향성 클라이언트 대 서버 모델에서는 서버 프로세스의 소켓이 클라이언트의 요청을 기다립니다. 이를 수행하기 위해 서버는 먼저 클라이언트가 서버를 찾는 데 사용할 수 있는 주소를 설정(바인드)합니다. 주소가 설정되면 서버는 클라이언트가 서비스를 요청하기를 기다립니다. 클라이언트 대 서버 데이터 교환은 클라이언트가 소켓을 통해 서버에 연결하면 이뤄집니다. 서버는 클라이언트의 요청을 수행한 후 클라이언트에 응답을 송신합니다.

참고: 현재 IBM은 대부분의 소켓 API에 대해 두 가지 버전을 지원합니다. 기본 IBM® i 소켓은 BSD(Berkeley Socket Distribution) 4.3 구조 및 구문을 사용합니다. 또 다른 소켓 버전은 BSD 4.4 및 UNIX 98 프로그래밍 인터페이스 스펙과 호환되는 구문 및 구조를 사용합니다. 프로그래머는 _XOPEN_SOURCE 매크로를 지정하여 UNIX 98 호환 인터페이스를 사용할 수 있습니다.

다음 그림은 연결 지향성 소켓 세션의 일반적인 이벤트 흐름(및 실행되는 API의 순서)을 보여줍니다. 그림 뒤에는 각 이벤트에 대한 설명이 제공되어 있습니다.

두 종료점이 연결을 설정하고 클라이언트와 서버를 서로 연결합니다.

다음 내용은 연결 지향성 소켓의 일반적인 이벤트 흐름입니다.

  1. socket() API가 통신을 위한 종료점을 작성하고 해당 종료점을 나타내는 소켓 설명자를 리턴합니다.
  2. 애플리케이션은 소켓 설명자를 획득한 후 해당 소켓에 고유 이름을 바인드할 수 있습니다. 네트워크에서 액세스하기 위해서는 서버가 이름을 바인드해야 합니다.
  3. listen() API가 클라이언트 연결 요청을 승인하려는 의사를 표시합니다. listen() API가 소켓에 대해 실행되면 해당 소켓은 능동적으로 연결 요청을 시작할 수 없습니다. listen() API는 socket() API를 사용하여 소켓이 할당되고 bind() API가 소켓에 이름을 바인드한 후 실행됩니다. listen() API는 accept() API가 실행되기 전에 실행되어야 합니다.
  4. 클라이언트 애플리케이션이 스트림 소켓에 대해 connect() API를 사용하여 서버에 대한 연결을 설정합니다.
  5. 서버 애플리케이션이 accept() API를 사용하여 클라이언트 연결 요청을 승인합니다. 서버가 accept() API를 실행하기 위해서는 먼저 bind()listen() API를 실행 완료해야 합니다.
  6. 스트림 소켓 간(클라이언트와 서버 간)에 연결이 설정되면 모든 소켓 API 데이터 전송 API를 사용할 수 있습니다. 클라이언트 및 서버에는 send(), recv(), read(), write() 등과 같이 선택할 수 있는 많은 데이터 전송 API가 있습니다.
  7. 서버 또는 클라이언트는 조작을 중단하려는 경우 close() API를 실행하여 소켓이 획득한 시스템 자원을 해제합니다.
참고: 소켓 API는 애플리케이션층과 전송층 간의 통신 모델에 위치합니다. 소켓 API는 통신 모델에 있는 층이 아닙니다. 소켓 API는 애플리케이션이 일반 통신 모델의 전송층 또는 네트워킹층과 상호작용할 수 있도록 합니다. 다음 그림의 화살표는 소켓의 위치와 해당 소켓이 제공하는 통신층을 표시합니다.
통신층 내 소켓 위치

일반적으로 네트워크 구성은 보안 내부 네트워크와 보안이 약한 외부 네트워크 간에 연결을 허용하지 않습니다. 그러나 방화벽(보안이 매우 강한 호스트) 외부의 시스템에서 실행되는 서버와 통신할 수 있도록 소켓을 설정할 수 있습니다.

소켓은 MTPN(Multiprotocol Transport Networking) 구조를 위한 IBM의 AnyNet® 구현의 일부이기도 합니다. MPTN 구조는 하나의 전송 네트워크 외에 추가 전송 네트워크를 운영하는 기능과 서로 다른 유형의 전송 네트워크 간에 애플리케이션 프로그램을 연결하는 기능을 제공합니다.