프로토콜 체계와 소켓 타입(TCP/UDP)


네트워크 프로그램을 할 때 가장 핵심이 되는 것이 소켓이다.

수년 전에도 지금도 socket을 이용하여 컴퓨터, 각종 디바이스( 핸드폰, 테블릿 등)와 데이터를 송수신을 한다.

이런 socket을 생성할 때 2가지 중요한 정보를 입력 하는데 그것이 바로 프로토콜 체계와 소켓을 타입이다.

오늘은 두 가지 중요한 정보에 대해 설명 하도록 하겠다. 


프로토콜 체계


포로토콜(protocol)이란 컴퓨터 간에 데이터를 주고 받는 방식이다.

즉 각 컴퓨터 간 서로 데이터를 주고 받기 위해서 정의해 놓는 약속을 뜻한다.

이러한 규약을 정해 놓지 않으면 내가 의도한 것과 다르게 상대 컴퓨터에서 이해를 다르게 할 수 있다.


소켓 통신을 할 때 사용하는 프로토콜 부류가 몇가지 있다. 

이러한 부류를 프로토콜 체계라고 하며 c에서 소켓을 생성 할 때 다음과 같이 함수를 호출 할 때 첫 번째 인자에 프로토콜 부류를 넣는다.


#include <sys/socket.h>

int socket ( int domain, int type, int protocol );


프로토콜 부류 종류는 아래와 같다.

 이름

프로토콜 체계(Protocol Family) 

 PF_INET     IPv4 인터넷 프로토콜 체계

 PF_INET6

 IPv6 인터넷 프로토콜 체계 

 PF_LOCAL

 로컬 통신을 위한 UNIX 프로토콜 체계 

 PF_PACKET

 Low Level 소켓을 위한 프로토콜 체계 

 PF_IPX

 IPX 노벨 프로토콜 체계 



주소 체계


C에서는 소켓을 생성 후 bind나 connect 할 때 주소 구조체에 주소 체계를 넣어 준다.

Python에서는 프로토콜 체계를 넣지 않고 아래 처럼 주소 체계만 넣어 준다.


serverSocket = socket(AF_INET, SOCK_STREAM)


주소 체계의 종류는 다음과 같다.



 이름

주소 체계(Address Family) 

 AF_INET     IPv4 인터넷 프로토콜 체계

 AF_INET6

 IPv6 인터넷 프로토콜 체계 

 AF_LOCAL

 로컬 통신을 위한 UNIX 프로토콜 체계 



소켓 타입(TCP/UDP)


소켓 타입은 데이터 전송 방식을 의미 하며 socket 함수 호출 시 2번 째 인자에 값을 넣는다.


[C 예제]

#include <sys/socket.h>

int socket ( int domain, int type, int protocol );


[Python 예제]

serverSocket = socket(AF_INET, SOCK_STREAM)


대표적인 소켓의 타입은 아래와 같다.


 TCP

 UDP

 연결 지향형 소켓

 비 연결 지향형 소켓 

 SOCK_STREM

 SOCK_DGRAM 

 데이터 손실 없이 목적지로 전송

 데이터 손실 우려가 있다. 

 전송 순서대로 데이터가 수신 된다.

 전송된 순서에 상관없이 가장 빠른 전송 지향 

 데이터 경계 없음

 데이터 경계 존재 




반응형

파이썬을 이용한 네트워크 프로그래밍



 파이썬을 이용한 서버 개발                                                                              


파이썬을 이용해서 네트워크 프로그래밍을 예제를 설명 하도록 하겠다.

네트워크 개념이 없으신 분은 여기를 클릭하여 먼저 이해를 하는것이 좋습니다.

파이썬 서버 개발 예제부터 살펴 보겠다.


#! /usr/bin/python

# -*- coding: utf-8 -*-


from socket import *

from select import *

import sys

from time import ctime


HOST = ''

PORT = 10000

BUFSIZE = 1024

ADDR = (HOST,PORT)


serverSocket = socket(AF_INET, SOCK_STREAM)#1.소켓을 생성한다.


serverSocket.bind(ADDR) #2.소켓 주소 정보 할당

print('bind')

serverSocket.listen(100) #3.연결 수신 대기 상태

print('listen')

clientSocket, addr_info = serverSocket.accept() #4.연결 수락

print('accept')

clientSocket.close() #소켓 종료

serverSocket.close()

print('close')


1. 시작은 소켓을 생성하는 것으로 부터 시작 한다. serverSocket은 이제 socket 클래스의 인스턴스이다.

2. bind 함수를 호출 하여 주소 정보인 ADDR을 할당 한다.

3. listen 함수를 호출하여 연결 수신 대기 상태를 만든다.

4. 클라이언트가 연결을 하면 accept 함수를 이용하여 연결을 수락한다.

   이때 연결을 수락하면서 연결 클라이언트와 송수신을 하는 소켓(clientSocket)을 하나 리턴 받는다.

5. close함수를 호출하여 바로 종료 시킨다.




파이썬을 이용한 클라이언트 개발


파이썬 클라이언트 개발 예제부터 살펴 보겠다.

참고로 클라이언트 프로그램을 다 만들고 실행하기 전에는 서버 프로그램을 먼저 실행 시킵니다. 


#! /usr/bin/python

# -*- coding: utf-8 -*-


from socket import *

from select import *

import sys

from time import ctime


HOST = '127.0.0.1'

PORT = 10000

BUFSIZE = 1024

ADDR = (HOST,PORT)


clientSocket = socket(AF_INET, SOCK_STREAM)#1 서버에 접속하기 위한 소켓을 생성한다.


try:

        clientSocket.connect(ADDR)#2. 서버에 접속을 시도한다.

except  Exception as e:

        print('%s:%s'%ADDR)

        sys.exit()

print('connect is success')


1. 시작은 소켓을 생성하는 것으로 부터 시작 한다. clientSocket은 이제 socket 클래스의 인스턴스이다.

2. connect 함수를 호출하여 서버 접속을 시도한다.


파이썬으로 네트워크 프로그래밍을 할 때는 네트워크 프로그래밍 개념과 더불어 파이썬에서 제공하는 socket 클래스를 이해하면

어렵지 않게 프로그램을 만들수 있습니다.


반응형

네트워크 프로그래밍의 이해 2



소켓 연결 과정


두개의 컴퓨터가 어떻게 연결이 되는지 하나하나 설명 하도록 하겠다.

모든 네트워크 프로그램 개념은 동일 하다.

네트워크 프로그램을 만들 때 언제나 Server와 Client가 짝을 이루어 만들어야 한다.

일단 Server가 하는일 부터 설명 하겠다.


1. socket을 생성한다.

   모든 프로그램이 소켓을 생성하는 함수가 있다 보통 함수명은 socket 이며 언어 마다 이름은 다를 수 있지만 반드시 존재한다.

2. 소켓에 주소정보 할당

   우리가 누구에게 전화를 하려면 고유한 전화번호를 알고 있어야 한다.

   그와 마찬가지로 어떤 컴퓨터가 내 컴퓨터를 접속 하려고 하면 내 컴퓨터 주소를 알아야 하며 그 주소를 할당해 주는 작업이 필요하다.

   이런 함수를 bind라 하며 거의 모든 프로그램 언어가 비슷한 명을 사용한다. ( 컴퓨터의 주소 체계는 앞에서 설명 하였다. )

3. 연결 수신 대기 상태

   client가 연결을 시도하면 받을 수 있도록 해당 소켓을 listen 소켓으로 설정한다.

   이렇게 listen 상태로 바꾸는 함수는 대부분 listen이라는 이름을 갖고 있는 함수를 사용한다.


4. client의 연결 시도

   서버가 연결을 받을 준비가 되어 있으므로 클라이언트에서는 서버에 연결을 시도한다.

   이때 클라이언트는 connect 함수를 사용하며 위에서 서버 소켓을 설정할 때 입력 했던 IP, PORT를 입력 한다.

5. 연결 수락

    client가 연결을 요청하면 server에서는 수락을 하여야 한다.

    여기서 수락하는 함수 명은 accept이며 수락과 동시에 또하나의 소켓이 생성 된다.

    listen으로 설정된 소켓은 또 다른 client의 연결을 받기위해 계속 대기 해야 하기 때문이다.


이렇게 연결이 완료되면 데이터 송수신을 할 수 있다.

다음이 위의 그림까지 python을 이용하여 프로그래밍을 해보도록 하겠습니다.

   


   








반응형

네트워크 프로그래밍의 이해



네트워크 프로그래밍의 이해



두 컴퓨터간의 데이터를 주고 받을 수 있도록 프로그래밍을 하는 것을 네트워크 프로그래밍이라 한다.

인터넷 망을 통한 디바이스( 예를들어 핸드폰 )과 컴퓨터간의 데이터를 주고 받는 것도 역시 네트워크 프로그래밍이라 한다.

요즘은 어떤 프로그래밍을 해도 네트워크가 들어가는 경우가 많이 있다.

SNS, 채팅, 게임, IOT, 클라우드 등등 다 인터넷이 안되면 동작 하지 않는것이 대부분이다.

또한 네트워크 프로그램은 어떠한 언어로 구현하여도 개념이 거의 동일하니 개념을 잘 숙지하는 것이 중요하다.


두 컴퓨터간에 데이터를 주고 받을려면 물리적 연결이 필요한데 이러한 연결을 도울수 있는 것을 소켓(socket)이라 한다.

두개의 컴퓨터가 연결이 되면 아래 그림과 같은 상태가 된다.

이렇게 연결이 되면 서로 데이터를 주고 받을 수 있다.

여기서 Server는 연결을 대기하는 컴퓨터이며 Client는 연결을 시도하는 컴퓨터를 뜻 한다.

Server는 여러 Client를 연결 받아서 관리 할 수도 있다.

모든 데이터 송수신 작업이 끝나면 소켓을 닫으면 두개의 컴퓨터 연결을 사라진다.


컴퓨터의 주소 (IP, PORT)


우리가 누구에게 전화를 하려면 고유한 전화번호를 알고 있어야 한다.

또한 친구 집에 찾아 가려면 친구 집 주소가 있어야 찾아간다.

그와 마찬가지로 어떤 컴퓨터가 내 컴퓨터를 접속 하려고 하면 내 컴퓨터 주소를 알아야 하며 그렇다면 컴퓨터에서의 주소는 어떻게 표현이 되는가?

바로 컴퓨터에서의 주소를 IP와 PORT를 사용 한다. 

IP는 어떤 컴퓨터인지를 식별하며 하나의 컴퓨터에서 PORT는 어떤 프로그램이냐를 식별한다.


예를 들어 내컴퓨터에서 온라인 게임을 실행 시키면 내부적으로 211.111.11.1 IP에 PORT 10을 넣어 게임 프로그램 서버로 접속 하게 된다는 이야기다.


오늘은 네트워크 프로그램에 대한 이야기와 컴퓨터 주소에 대한 설명을 하였다 다음에는 두 컴퓨터가 연결이 되는 과정을 설명 하도록 하겠다.

반응형

+ Recent posts