摘要:創建創建通信接受套接字的數據,與類似,但返回值是。發送數據,將數據發送到,形式為,指定遠程地址發送,返回值是發送的字節數發送的報文是類型,發送的報文是類型,在發送前要記得編碼。
UDP 和 TCP 的區別
? | TCP | UDP |
---|---|---|
連接性 | 面向連接 | 面向無連接 |
傳輸可靠性 | 可靠 | 不可靠 |
傳輸模式 | 流 | 數據報 |
應用場景 | 傳輸大量的數據 | 少量數據 |
速度 | 慢 | 快 |
TCP:
TCP 的可靠體現在傳輸數據之前,會有三次握手來建立連接。在數據傳完后,還會斷開連接用來節約系統資源。在數據傳遞時,有確認機制、重傳機制、擁塞控制機制以保證傳輸的可靠性,但這些機制都會消耗大量的時間和系統資源,每個連接都會占用系統的 CPU、內存等硬件資源,所以也導致 TCP 容易被人利用,比如 DDOS、CC 等攻擊。
一般用于文件傳輸、收發郵件或遠程登錄等對數據準確性要求高的場景。
UDP:
UDP 沒有 TCP 那些可靠的機制,所以在數據傳遞時,如果網絡質量不好,就會很容易丟包。但 UDP 也是無法避免攻擊的,比如:UDP Flood 攻擊。
一般用于即時通訊、在線視頻、網絡電話等對傳輸效率要求高,但對準確性要求相對低的場景。
面向有連接型
發送數據之前,需要在收發主機之間建立一條通信線路,在通信傳輸前后,專門進行建立和斷開連接的處理,如果與對端之間無法通信,可避免發送無謂的數據。
面向無連接型
這種類型不要求建立和斷開連接,發送端可任何時候發送數據,接收端也不知道自己何時從哪里接受數據,這種情況下,接收端需要時常確認是否收到數據,彼此也不需要確認對方是否存在。
關于 TCP 網絡編程的實現請參考我的另一篇博文 Socket 通信原理
UDP 網絡編程實現面向無連接的 UDP 時序圖
創建 Socket
sock = socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
family -> 地址族
socket.AF_UNIX: 用于同一臺機器上的進程通信(既本機通信)
socket.AF_INET: 用于服務器與服務器之間的網絡通信
socket.AF_INET6: 基于 IPV6 方式的服務器與服務器之間的網絡通信
type -> Socket 對象的類型
socket.SOCK_STREAM: 基于 TCP 的流式 Socket 通信
socket.SOCK_DGRAM: 基于 UDP 的數據報式 Socket 通信
socket.SOCK_RAW: 原始套接字,普通的套接字無法處理 ICMP、IGMP 等網絡報文,而 SOCK_RAW 可以;其次 SOCK_RAW 也可以處理特殊的 IPV4 報文;此外,利用原始套接字,可以通過 IP_HDRINCL 套接字選項由用戶構造 IP 頭
socket.SOCK_SEQPACKET: 可靠的連續數據包服務
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()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41780.html
摘要:在任何類型的通信開始之前,網絡應用程序必須創建套接字。基于文件的套接字,家族名又名基于網絡的套接字,家族名在和后續的版本中,支持的套接字有,,,。中的網絡編程在中主要是用模塊來實現基于套接字的網絡通信。 python學習記錄--網絡編程 1、套接字介紹 一臺機器上的不同進程之間進行通信可以利用隊列,管道等,但是不同機器之間的進程進行通信用隊列是不行的,解決這個問題就是網絡套接字。 套接...
摘要:套接字有兩種或者稱為有兩個種族分別是基于文件型的和基于網絡型的。大部分網絡設備的都是。不會發生黏包,用戶數據報協議是無連接的,面向消息的,提供高效率服務。即面向消息的通信是有消息保護邊界的。 軟件開發的架構 我們了解的涉及到兩個程序之間通訊的應用大致可以分為兩種: 第一種是應用類:qq、微信、網盤、優酷這一類是屬于需要安裝的桌面應用 第二種是web類:比如百度、知乎、博客園等使用瀏覽器...
摘要:部分來自網絡,適用于學習,維護網絡安全,做合法公民一和不同,沒有面向連接的機制,其是一種不可靠的協議,沒有確認機制。 部分來自網絡,適用于學習,維護網絡安全,做合法公民 一、UDP 和TCP不同,UDP沒有面向連接的機制,其是一種不可靠的協議,沒有確認機制。也就是說只要其端口開放,有數據需要交互時直接進行數據交互,也不需要TCP的三次握手。這樣的話,基于UDP的攻擊比基于TCP的攻擊需...
閱讀 2478·2021-09-22 16:05
閱讀 2961·2021-09-10 11:24
閱讀 3632·2019-08-30 12:47
閱讀 2941·2019-08-29 15:42
閱讀 3379·2019-08-29 15:32
閱讀 1945·2019-08-26 11:48
閱讀 1082·2019-08-23 14:40
閱讀 902·2019-08-23 14:33