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 |