본문 바로가기
네트워크

[네트워크] TCP / IP 통신, 소켓이란 (Socket)

by 느링 2017. 12. 15.

소켓이란?
2개 이상의 네트워크로 연결된 컴퓨터의 데이터를 송수신 할 수 있게 하는겁니다.
그 기반이 소켓이라서 소켓 프로그래밍이라고 합니다.
즉, 소켓이란 네트워크롤 연결하는 연결도구라고 보시면 됩니다.

포트번호
물리적 전송선은 하나지만 이를 여러개의 응용 프로그램이 나누어 쓰기 위해서 포트를 만들었다.
소켓을 사용하는 한 컴퓨터 내의 모든 서버 프로세스는 별도의 포트 번호를 가지고 있는 소켓을 가진다.
ex) 파이썬 서비스 포트 번호 확인
 import socket
 socket.getservbyname('http','tcp')
 80
 socket.getservbyname('ftp','tcp')
 21
 

파이썬 소켓 프로그래밍

서버측 기본 메소드

- 클래스 socket(도메인, 소켓의유형) : 소켓 객체를 생성한다.

 

여기서 사용되는 도메인의 종류는

주소 중심의 (AF_~~)로 시작하는 형식과 (PF_~~~)로 시작하는 프로토콜이 있다.

주로 사용되는 형식은 주소형식

AF_INET - 가장 일반적으로 사용되는 형식으로 IPv4 소켓이고, 주소 표현을 위해 (host,port)튜플이 사용

AF_INET6 -> IPv6 소켓이고, 주소 표현을 위해 (host, port, flowinfo, scopeid)튜플이 사용됩니다.


​위의 도메인말고도 AF_UNIX, AF_TIPC, AF_NETLINK, AF_BLUETOOTH, AF_PACKET

등이 있습니다.


그리고 소켓의 유형으로는


SOCK_STREAM -> TCP 소켓을 말합니다.


SOCK_DGRAM -> UDP 소켓을 말합니다.


SOCK_RAW -> 무가공 소켓입니다.


이 것 말고도 SOCK_RDM, SOCK _SEQPACKET 등이 있습니다.


앞서 설명한것이 소켓의 객체를 설정하는데 필요한 요소들입니다.

이제 이것을 어떻게 사용했는지 서버와 클라이언트로 나눠서 예제를 들어서 보여드리겠습니다.

 


- bind((host,port)) : 소켓을 host컴퓨터의 port에 연결시킨다.
- listen(n) : n - 한번에 처리할 수 있는 연결의 수

최대치는 5까지 설정가능하고, 보통 5로 설정
1 이산의 값을 가져야 하며, 최대값은 시스템에 따라 다르나 보통 5이다.
- accept(): 클라이언트의 연결을 받아들인다. 블로킹(Blocking) 모드 일때 클라이언트가 연결을
시도할 때 까지 기다린다.
- recv(bufsize) : 소켓으로부터 데이터를 읽어온다.
- send(string) : 데이터(string)를 소켓에 쓴다. 값은 한 클라이언트로 전달된다.
- close() : 소켓을 닫는다.

클라이언트 측 기본 메소드

- 클래스 socket(도메인, 소켓의유형) : 소켓 객체를 생성한다.
- connect((host, port)) : 클라이언트가 지정된 주소로 소켓 연결을 시도한다.

여기서도 튜플형식으로 적어줘야합
- recv(bufsize) : 소켓으로부터 데이터를 읽어온다.
- send(string) : 데이터(string)를 소켓에 쓴다. 값은 서버로 전달된다.
- close() : 소켓을 닫는다.

 

 

1. 소켓 생성 - 전화기 구입

2. 주소 및 포트 할당 - 전화번호 할당

3. 연결 요청 대기 - 케이블 연결

4. 연결 수락 - 수화기를 든다.

 

파이썬 소켓(UDP)

UDP 소켓같은 경우 TCP보다는 많이 사용되지 않습니다. 이는 주로 이 프로토콜을 통해서 상대방에게 보냈을 경우 상대가 받았는지 아닌지를 명확하게 알 수가 없으며, 자기 할 일만 하고 끝나는 프로토콜이기 때문입니다. 그렇게 때문에 이 소켓을 비연결 지향형 소켓이라고 불리기도 합니다.

 

UDP 소켓 프로그래밍의 경우 TCP 소켓 프로그래밍과 달리 Server측에선 accept()과정이라던지 Client측에서의 connect()메소드들이 필요가 없습니다.

 

또한 TCP소켓 프로그래밍과 확연히 다른 점은

TCP의 경우 서버와 클라이언트간의 대화를 하는데 사용하는 메소드로 send() / recv()를 사용했다면 여기서는 sendto() / recvfrom()메소드를 사용합니다.

 

 

'네트워크' 카테고리의 다른 글

[네트워크] DNS 설치  (0) 2018.01.18
[네트워크] TCP Header 구조  (0) 2018.01.05
[네트워크] IP주소  (0) 2017.12.15
[네트워크] OSI 7 계층 (Layer)  (1) 2017.12.14
[네트워크] 프로토콜(Protocol)이란?  (0) 2017.12.12