본문 바로가기
Study/Python

[Python #6] Network

by YOONAYEON 2021. 11. 24.
Network

 

- 네트워킹 : 여러 컴퓨터를 서로 연결하면 통신이 가능하다

- 인터네트워킹 : 인접한 네트워크를 연결하여 인터넷같은 큰 시스템을 형성할 수 있다.

- 패킷 : 네트워크 디바이스 간 통신을 위한 가장 기본적인 단위 (목적지 주소와 전달할 데이터를 가진 수천byte의 바이너리 스트링 형태)

- 보통 네트워크 계층모델로 OSI 7layer 이용 (또는 TCP/IP계층 모델)

 

 

네트워크 계층 (OSI 7 layer)

 

7 : Application layer (HTTP, SMTP, FTP, SNMP)

6 : Presentation layer (MIME, TLS/SSL)

5 : Session layer (NetBIOS)

4 : Transport layer (TCP, UDP)

3 : Network layer (IP, ICMP, IPSec)

2 : Datalink layer (Frame relay, ethernet)

1 : Physical layer (USB, Bluetooth, DSL)

 

 

네트워크 예시 ( C/S 모델 )

 

Client (웹 브라우저)   --------- (패킷) ------------>   Server (웹 서버)

 

1. 웹 브라우저에서 웹서버 '호스트주소' 검색

2. 브라우저는 웹서버의 클라이언트가 됨

3. 웹서버의 어플리케이션은 포트를 통해 구별됨 (포트번호 80번이 HTTP server application)

4. 각 layer을 지나며 패킷 데이터에 추가 데이터를 덧붙이며 캡슐화 함

5. 호스트이름 -> IP주소 변경 (DNS)

6. IP주소 -> MAC주소 변경 (ARP)

7. MAC주소(물리 주소)를 알았으니 물리적 통신이 가능해짐

8. 서버는 클라이언트의 요청 페이지를 보내줄 수 있음

 

 

TCP VS UDP

 

- 패킷의 전송기술 (connection관련만 처리)

- 최상위 IP를 구축하는 두가지 접근법

 

TCP UDP
 데이터 간 순서O, 신뢰 가능 데이터 간 순서X, 신뢰 불가
재전송 보장O 재전송 보장X

 

- 최근 대부분의 애플리케이션은 IP애플리케이션 간에 순서있고 신뢰가능한 데이터 스트림을 제공하는 TCP위에 구축된다. (EX. Download)

- 짧거나 독립적인 요청/응답을 갖거나, 클라이언트가 간단해서 요청이 손실되어도 귀찮지 않은 프로토콜은 UDP를 선택 (EX. Streaming)

 

 

소켓 프로그래밍

 

- 소켓: 애플리케이션한테 스트림 기반으로 보여주는 TCP와 UDP인터페이스

- 소켓은 파일과 비슷한 객체로, 네트워크 상에서 파일처럼 데이터를 받고 보내도록 해준다. 

- UDP와 TCP 모두 소켓 사용을 지원한다.

- 두 컴퓨터가 연결을 맺기 전에 양쪽 모두 소켓을 먼저 생성해야 한다.

 

 

UDP 프로그래밍

 

 

# Clinet
from socket import socket, AF_INET, SOCK_DGRAM

s = socket(AF_INET, SOCK_DGRAM)
s.bind( ('127.0.0.1', 0) )  # 자신의 주소, 포트번호(os가 선택)
server = ('127.0.0.1', 8888) # 서버정보 튜플 (자신IP, 포트번호)
s.sendto("Hello".encode(), server) # 'Hello'를 byte array로 변환하여 서버로 전송
data, addr = s.recvfrom(1024) # 서버로부터 최대 1024byte의 데이터를 수신
print(data.decode(), "from", addr) # 받은 데이터를 다시 string으로 바꾸어 출력
s.close()

 

# Server
from socket import socket, AF_INET, SOCK_DGRAM

s = socket(AF_INET, SOCK_DGRAM)
s.bind(('127.0.0.1', 8888))	# 8888번 포트로 소켓 바인드
while True:					# 루프돌면서 계속 receive
	data, addr = s.recvfrom(1024)	# 데이터, 보낸측이 주소
	print('Connection from ', addr)
	s.sendto(data.upper(), addr)	# 대문자로 바꿔 다시 되돌려줌

 

 

TCP 프로그래밍

 

 

# Client
from socket import *

s = socket(AF_INET, SOCK_STREAM) # TCP소켓 만들기
s.connect( ('127.0.0.1', 8888))	# 서버랑 연결 (자신의 호트스 주소, 포트번호)
m = s.recv(1024)				# 최대 1024byte까지 수신
s.close()
print(m.decode())

 

# Server
import time

s = socket(AF_INET, SOCK_STREAM) # TCP소켓 생성
s.bind( ("", 8888) ) # 8888번 포트에 바인드
s.listen(5)			 # passive마킹, 기다림
while 1:
	client, addr = s.accpet() # 커넥션 기다림. 연결되어야 소켓 리턴
    print("from", addr)		  # 상대쪽 주소, client: 클라이언트와 주고받을 소켓
    client.send(time.ctime(time.time()).encode())	# 현재 시간 보내기
    clinet.close() # client close했지만 s소켓은 살아있으므로 다시 accpet가능

'Study > Python' 카테고리의 다른 글

[Python #8] Database  (0) 2021.12.14
[Python #7] Multiple Connections, Web Scrapping  (0) 2021.12.14
[Python #5] Class, Module, Package  (0) 2021.10.31
[Python #5] Dictionary, Set, Collection  (0) 2021.10.10
[Python #4] File  (0) 2021.10.07