2013년 12월 13일 금요일

[Python] 파이썬과 소켓(Socket)

소켓은 통신 종단점(endpoint)의 개념을 내포하는 컴퓨터 네트워킹 구조를 말한다.
네트워크 응용 프로그램은 어떠한 형태의 통신이 개시되기 전에 소켓을 생성해야 한다.
그것은 전화기의 잭(jeck)에 비유될 수 있다.
소켓은 1970년대에 캘리포니아 대학, BSD(Berkeley Software Distribution) UNIX로 알려진 유닉스의 버클리 버전에서 유래했다.
현재사용되는 것은 1986년의 BSD UNIX 4.3에서 개정된 것이다.

AF_UNIX(address family: UNIX)
두 프로세서가 같은 기계에서 실행되기 때문에 이러한 소켓은 파일기반이라고 한다.
이것은 밑바탕의 하부구조가 시스템에 의해 지원되는 것을 의미하며, 파일시스템이 같은 호스트에서 실행되는 프로세서들 사이에 공유된 상수이기 때문에 의미가 있다.

AF_INET(address family: Internet)
한 머신에서의 프로세서가 다른 머신에 있는 프로세서와 대화하는 네트워크 소켓.

가능한 포트는 0~65535이며, 1024이하는 시스템을 위해 예약되어 있다.
Linux의 경우에는 예약된 포트번호를 /etc/service 파일에서 찾아볼 수 있다.
socket을 생성할때 이미 할당된 포트 번호나 잘못된 포트를 지정하려고 시도하는 것은 예외를 발생시킨다.

연결지향(Connection-Oriented)
기본적으로 전화시스템에서 친구에게 통화하는 것과 같이 통신이 발생할 수 있기 전에 연결이 확립되어야 한다는 것을 의미한다.
이러한 통신형태를 "가상회로망(virtual circuit)" 혹은 "스트림 소켓(stream socket)" 이라 한다.
연결지향 연결은 순차적이고, 신뢰성 있는 중복되지 않는 데이터의 전달을 제공하고, 레코드의 경계가 없다. 이것은 기본적으로 각 메세지가 여러개의 조각으로 나누어 질 수 있고, 모든것이 목적지에 도착해서 기다리고 있는 응용프로그램에게 전달되는 것을 보증한다. TCP(Transmission Control Protocol).
이러한 소켓은 네트워크에 있는 호스트를 찾기 위해 인터넷 프로토콜을 사용하기 때문에 일반적으로 두 프로토콜의 합성어로 "TCP/IP"라고 한다.
TCP 소켓을 생성하기 위해 SOCK_STREAM을 사용해야만 한다.


비연결(Connectionless)
가상 회로망과 완전히 대조적인 소켓의 데이터그램 형태이다.
이것은 통신이 시작될 수 있기 전에 어떠한 연결도 필요하지 않다는 의미이다.
데이터의 전송과정에서 순차적이고 신뢰성 있고 중복이 없다는 어떠한 보증도 하지 않는다.
데이터그램은 레코드의 경계를 보존한다.
데이터그램을 이용한 메세지 전송은 우편 서비스에 비교될 수 있다. 편지와 소포는 보내진 순서대로 도착하지 않을수도 있으며 사실상 그거이 전혀 도착하지 않을 수도 있다. 네트워크의 세계에서는 메세지의 중복도 가능하다.
이러한 부정적인 면에 반해 스트림소켓을 사용하는 것보다 좋은점도 있다.
데이터그램은 연결지향 소켓처럼 의해 제공된 보증 때문에 많은 양의 오버헤드(overhead)를 가지지 않는다. 따라서 더 나은 성능을 제공함으로써 비용이 덜 든다.
이러한 연결을 구현하는 프로토콜은 UDP(User Datagram Protocol)이다.
역시 네트워크에 있는 호스트를 찾기 위해 인터넷 프로토콜을 사용하기 때문에 "UDP/IP"라고 한다.
UDP 소켓을 생성하기 위해서는 SOCK_DGRAM을 사용해야만 한다.

파이썬에서 네트워크를 위해서 사용할 중요한 모듈은 socket 모듈이다.
소켓객체를 생성하기 위해 이 모듈안에 socket() 함수가 있다.

socket(socket_family, socket_type, protocol=0)

socket_family는 AF_UNIX 또는 AF_INET 둘 중에 하나이다.
또한 socket_type는 SOCK_STREAM이나 SOCK_DGRAM이다
protocol은 보통 생략하게 되며 디폴트로 0이 된다.

공통적인 소켓 메소드들
서버소켓 메소드들
s.bind()   소켓에 주소를 바인드
s.listen()   TCP listener 설정하고 시작
s.accept()   TCP 클라이언트 연결을 수동적으로 받아들이고 연결이 도착할 때까지 기다림

클라이언트 소켓 메소드들
s.connect()   TCP 서버연결을 능동적으로 초기화

일반적인 소켓 메소드들
s.recv()   TCP 메시지 수신
s.send()   TCP 메시지 전송
s.recvfrom()   UDP 메시지 수신
s.sendto()   UDP 메시지 전송
s.close()   소켓을 닫는다.



참고문헌:
Wesley J. Chun, Core Python Programing, Prentice Hall, 2000
이강성, 열혈강의 Python 파이썬, 이한디지털리, 2002

댓글 없음:

댓글 쓰기