Python 網路程式設計之 UDP 協議

2021-09-13 19:39:48 字數 2842 閱讀 2536

tcpudp

連線性面向連線

面向無連線

傳輸可靠性

可靠不可靠

傳輸模式

流資料報

應用場景

傳輸大量的資料

少量資料速度慢

tcp:

tcp 的可靠體現在傳輸資料之前,會有三次握手來建立連線。在資料傳完後,還會斷開連線用來節約系統資源。在資料傳遞時,有確認機制、重傳機制、擁塞控制機制以保證傳輸的可靠性,但這些機制都會消耗大量的時間和系統資源,每個連線都會占用系統的 cpu、記憶體等硬體資源,所以也導致 tcp 容易被人利用,比如 ddos、cc 等攻擊。

一般用於檔案傳輸、收發郵件或遠端登入等對資料準確性要求高的場景。

udp:

udp 沒有 tcp 那些可靠的機制,所以在資料傳遞時,如果網路質量不好,就會很容易丟包。但 udp 也是無法避免攻擊的,比如:udp flood 攻擊。

傳送資料之前,需要在收發主機之間建立一條通訊線路,在通訊傳輸前後,專門進行建立和斷開連線的處理,如果與對端之間無法通訊,可避免傳送無謂的資料。

這種型別不要求建立和斷開連線,傳送端可任何時候傳送資料,接收端也不知道自己何時從**接受資料,這種情況下,接收端需要時常確認是否收到資料,彼此也不需要確認對方是否存在。

關於 tcp 網路程式設計的實現請參考我的另一篇博文 socket 通訊原理面向無連線的 udp 時序圖

建立 socket

sock = socket.socket(family=af_inet, type=sock_stream, proto=0, fileno=none)
family -> 位址族

type -> socket 物件的型別

proto -> 協議編號,預設是 0,一般可以忽略該引數

fileno -> socket 的檔案描述符,如果指定了 fileno,則其他引數將被忽略,返回指定檔案描述符的 socket。

建立 tcp socket:

sock = socket.socket(socket.af_inet, socket.sock_stream)建立 udp socket:

sock = socket.socket(socket.af_inet, socket.sock_dgram)

udp 通訊

sock.recvfrom(bufsize[, flags])
接受 udp 套接字的資料,與 recv() 類似,但返回值是tuple(data, address)。其中 data 是包含接受資料的字串,address 是傳送資料的 socket 位址

注意協議接收到的資料可能大於 buf 的長度,所以在這種情況下要呼叫幾次 recv 函式才能把 socket 接收緩衝區中的資料 copy 完。recv 函式僅僅是 copy 資料,真正接收資料是由協議來完成的。
sock.sendto(bytes, address)
傳送 udp 資料,將資料傳送到 socket,address 形式為tuple(ipaddr, port),指定遠端位址傳送,返回值是傳送的位元組數

python 2.x 傳送的報文是 str 型別,python 3.x 傳送的報文是 bytes 型別,在傳送前要記得編碼。
import socket

sock = socket.socket(socket.af_inet, socket.sock_dgram)

address = ('127.0.0.1', 8020)

while true:

msg = input('wanna send: ')

if not msg:

break

sock.sendto(bytes(msg, 'utf-8'), address) # return the number of bytes sent

data, addr = sock.recvfrom(1024)

data = data.decode('utf-8')

print('response:', data)

sock.close()

import socket

import time

sock = socket.socket(socket.af_inet, socket.sock_dgram)

sock.bind(('127.0.0.1', 8020))

print('waiting for message...')

while true:

data, addr = sock.recvfrom(1024)

data = data.decode('utf-8')

print('got message from', addr)

print('received message:', data)

sock.sendto(bytes('[%s] %s' % (time.ctime(), data), 'utf-8'), addr)

sock.close()

Python網路程式設計之UDP

udp處理資料報,是一種無連線的協議 伺服器端 server socket.socket socket.af inet,socket.sock dgram 繫結ip server.bind 192.168.1.104 221 while true 接收 data,address server.rec...

Python網路程式設計之UDP協議

注 這只是乙個udp協議的簡單演示,覺得簡單了可以不看 import socket 用於指定位元組的長度 bufsize 1024 前面的引數代表主機名,後面的代表埠號 ip port 127.0.0.2 9999 udp協議 server socket.socket socket.af inet,...

python網路程式設計 之udp通訊

encoding utf 8 ss socket 建立乙個伺服器套接字 ss.bind 繫結伺服器套接字 inf loop 伺服器無限迴圈 cs ss.recvfrom ss.sendto 對話 接收與傳送 ss.close 關閉伺服器套接字 建立乙個能接收客戶的訊息,在訊息前加乙個時間戳後返回的 ...