TCP IP 파이썬 활용

socket 모듈을 이용해 소켓의 개념과 객체 생성 방법

웹하는빡통 2020. 6. 9. 21:10

소켓(Socket)이란 서로 떨어진 두 대의 컴퓨터 사이에서 TCP/IP 네트워크를 통해 상호 통신이 가능하도록 운영체제에서 해당 자원을 할당하고 처리해 주는 방식을 의미한다. 다시 말해 컴퓨터 상호간에 데이터를 주고받기 위한 프로세스 처리 방식을 소켓이라고 한다.   

 

소켓은 두 대의 컴퓨터, 즉 서버와 클라이언트를 전제로 설정한다. 서버와 클라이언트는 서비스를 기준으로 구분한다.

서버란 서비스를 제공하는 컴퓨터를 의미라고, 클라이언트란 서비스를 요청하는 컴퓨터를 의미한다. 

 

socket 모듈을 기반해 소켓 객체를 생성해보자. 

 

socket 모듈을 이용해 소켓 객체를 생성하는 방식은 아래와 같다.

예제)) socket_c=socket.socket(Socket Family, Socket Type, Socket Protocols)

socket을 생성하기 위해 변수를 선언하고 socket()은 함수 이름이다. 이때 socket() 함수에는 세 개의 인자가 필요하다.

 

1. socket family: 소켓에서 사용할 주소 형식을 지정해준다.

ex) socket.AF_UNIX, socket.AF_INET, socket.AF_INET6,socket.PF_PACKET 등이 있다.

이중 socket.AF_INET은 IPv4 주소를 의미한다. 예전에 소캣 프로그램으로 채팅 프로그램에서도 자주 사용하던 거다. 

 

2. socket type: 서버와 클라이언트 사이에서 사용하는 전송 유형을 설정한다.

ex) socket.SOCK_DGRAM, sock.SOCK_STREAM 등이 있다. 아시다시피

DGRAM은 UDP방식을 의미하고 STREAM은 TCP방식을 의미한다. 채팅 프로그램에서는 STREAM방식을 이용한다. 

 

3. socket protocols: 소켓 타입을 설정한 뒤 소켓 타입을 더욱 세부적으로 구분할 때 사용한다.

ex) socket.IPPROTO_UDP, socket.IPPROTO_TCP 등이 있다. 소켓 객체를 생성할 때는 흔히 소켓 프로토콜을 생갹하거나 0으로 설정한다. 

 

아래 예제 3가지 방식 같은 경우 UDP 소켓 객체 생성 방식이 모두 동일하다. 

socket1=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

socket2=socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)

socket3=socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

 

TCP 소켓 방식도 UDP 객체 생성 방식이랑 동일하다.

socket1=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

socket2=socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)

socket3=socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)

 

한편 소켓을 생성하는 방식에는 두 가지가 있다. 한가지는 운영체제에서 모든 헤더를 자동으로 생성하는 방식 다른 방식은 사용자가 헤더를 직접 생성하는 방법이다.

소켓 생성을 자동차 운전에 비유하면 전자와 같은 방식은 자동식 운전에 해당하고, 후자와 같은 방식은 수동식 운전에 해당한다.  특히 후자같이 수동으로 생성하는 소켓 방식원시 소켓 방식이라고 한다. 

 

자동식 소켓 방식, 다시 말해 표준 소켓(Standard Socket) 방식은 운영체제에서 모든 괴정을 자동으로 처리하기 때문에 사용자는 TCP/IP 계층별 데이터 전송 단위와 헤더 구조 등을 따로 알아야 할 필요가 없다. 따라서 표준 소켓 방식에는

원시 소켓 생성 방식보다 접근성이 용이하다는 장정을 가지고 있다. 그러나 Standard Socket 방식은 운영체제가 이미 정해진 방식에 따라 소켓을 생성하기 때문에 원시 소켓 방식과 비교할 때 소켓 사용에 대한 유연성은 없다. 

 

번면 원시 소켓 방식은 헤더 항목을 사용자가 직접 생성하기 때문에 TCP/IP 계층별 데이터 전송 단위와 헤더 구조 등을 정확히 알아야 한다. 원시 소켓 방식은 패킷 스니퍼등과 같은 응용 도구를 구현하거나 새로운 프로토콜을 개발하는 경우에 사용한다. ICMP 패킷 등을 생성할 경우에도 원시 소켓 방식을 사용한다.