소켓(Socket)의 개념

bolee·2022년 4월 2일
0
post-custom-banner

소켓(socket)의 개념에 대해 알아볼 것이다. 먼저 알아보기 앞서 쉬운 이해를 위해 소켓 통신을 일반 전화 통신과 비교해 볼 것이다.

(1-12 그림)

그림의 (a)에서 볼 수 있듯 사람은 응용 프로그램, 전화는 소켓, 전화망은 인터넷에 대응한다. 좀 더 자세히 보면 그림의 (b)와 같이 사람은 응용 프로그램, 내선 번호는 포트 번호, 대표 전화는 IP 주소, 전화망은 인터넷에 대응한다.
여기에서 소켓은 포트 번호화 IP 주소 등의 통신 관련 정보를 포괄하는 개념으로 볼 수 있다.

소켓 프로그래밍에서 '소켓'을 3가지 관점에서 살펴보자

  • 데이터 타입
  • 통신 종단점
  • 네트워크 프로그램 인터페이스

데이터 타입

소켓은 파일 디스크립터(file descriptor) 또는 핸들(handle)과 유사한 개념으로, 일단 만들고 나면 함수를 호출해 쉽게 네트워크 통신을 할 수 있다.
아래 코드를 비교하면 파일 입출력 코드와 소켓 통신 코드의 형태가 비슷한 것을 알 수 있다.

파일 입출력소켓 통신
int fd = open("myfile", ...); // 파일 생성
...
read(fd, ...); // 데이터 읽기
write(fd, ...); // 데이터 쓰기
SOCKET sock = socket(...); // 소켓 생성
...
recv(sock, ...); // 데이터 받기
send(sock, ...); // 데이터 보내기

응용 프로그램이 통신하려면 다음과 같은 요소가 결정되어야 한다.

  • 사용할 프로토콜 (TCP/IP, UDP/IP 등)
  • 송신 측 IP 주소
  • 송신 측 포트 번호
  • 수신 측 IP 주소
  • 수신 측 포트 번호

운영체제는 내부적으로 이와 같은 정보를 결정하고 관리하는데, 응용 프로그램은 소켓을 사용해 이 정보에 접근할 수 있다. 프로그램 관점에서 소켓은 생성과 설정 과정이 끝나면 운영체제의 통신 관련 정보를 참조해 다양한 작업을 편리하게 할 수 있는 데이터 타입으로 볼 수 있다.

통신 종단점

소켓은 응용 프로그램 관점에서 통신 종단점(communication end-point), 즉 통신의 출발점/도착점이라고 볼 수 있다.

(1-13 그림)

그림처럼 클라이언트가 서버에 데이터를 보내는 경우 클라이언트는 자신의 소켓이 서버 소켓과 연결된 것으로 생각하고 send()하수를 호출해 데이터를 보낸다. 서버도 자신의 소케싱 클라이언트 소켓과 연결된 것으로 보고 recv()함수를 호출해 데이터를 받을 수 있다. 반대의 경우도 이와 같은 원리로 생각할 수 있다.

네트워크 프로그래밍 인터페이스

TCP/IP 프로토콜 관점에서 소켓은 네트워크 프로그래밍 인터페이스에 불과하다. 따라서 응용 프로그램이 통신하기 위해 양쪽 모두 소켓을 사요해야하는 것은 아니다. 둘 다 같은 프로토콜을 사용하고 정해진 형태와 절차에 따라 데이터를 주고 받으면 된다.

TCP/IP 프로토콜 구조에서 소켓은 일반적으로 응용 계층과 전송 계층 사이에 위치한다고 간주한다. 그러나 전송 계층(TCP, UDP)을 거치치 않고 바로 인터넷 계층(IP)을 사용할 수도 있다.

(1-14 그림)

  • ICMP = Internet Control Message Protocol
  • IGMP = Internet Group Management Protocol

참고 자료
김성우 저, "TCP/IP 윈도우 소켓 프로그래밍", 한빛아카데미, 2018

post-custom-banner

0개의 댓글