1.UDP協(xié)議的概述
UDP(User Datagram Protocol)是一種在網(wǎng)絡(luò)通信中使用的傳輸層協(xié)議。與TCP(Transmission Control Protocol)相比,UDP是一種無連接的協(xié)議,這意味著它不像TCP那樣在通信的開始和結(jié)束時需要建立和終止連接。
2.UDP協(xié)議的特點
?文章來源地址http://www.zghlxwxcb.cn/news/detail-753453.html
-
無連接性: UDP是無連接的協(xié)議,這意味著通信的雙方不需要在通信之前建立連接。每個UDP數(shù)據(jù)報都是獨立的,它們可以單獨發(fā)送,沒有依賴關(guān)系。
-
不可靠性: UDP不提供數(shù)據(jù)傳輸?shù)目煽啃员WC。它不會像TCP那樣提供重傳、確認(rèn)和流量控制等機(jī)制。這意味著如果發(fā)送的數(shù)據(jù)丟失或者損壞,UDP不會自動重新發(fā)送,需要應(yīng)用層自行處理。
-
速度和低延遲: 由于沒有連接狀態(tài)維護(hù)和復(fù)雜的確認(rèn)機(jī)制,UDP的開銷比TCP小,因此在速度和延遲方面表現(xiàn)更好。這使得它適用于實時應(yīng)用,如語音通話和在線游戲。
-
數(shù)據(jù)報格式: UDP數(shù)據(jù)報包含了目標(biāo)端口號和源端口號,這些信息用于將數(shù)據(jù)傳遞給正確的應(yīng)用程序。但是,數(shù)據(jù)報本身沒有保證按順序到達(dá)或完整到達(dá)。
-
無擁塞控制: UDP不具備TCP的擁塞控制機(jī)制,因此在網(wǎng)絡(luò)擁塞的情況下,UDP數(shù)據(jù)報可能會丟失或延遲增加。
-
廣播和多播支持: UDP支持向特定組中的多個主機(jī)發(fā)送數(shù)據(jù),這稱為多播(Multicast)。也可以將數(shù)據(jù)報廣播到網(wǎng)絡(luò)中的所有主機(jī),這稱為廣播(Broadcast)。
-
適用場景: UDP適用于需要快速傳輸和實時性要求較高的應(yīng)用,如語音和視頻流、在線游戲、實時傳感數(shù)據(jù)等。它不適用于需要可靠傳輸和數(shù)據(jù)完整性的場景,因為這些方面沒有被UDP提供。
3.UDP的格式
?文章來源:http://www.zghlxwxcb.cn/news/detail-753453.html
?
4.網(wǎng)絡(luò)編程?
我是在同一局域網(wǎng)下兩臺電腦實現(xiàn)的通信,一臺是服務(wù)器,一臺是客戶端?
你可以借用你室友的電腦,條件是在同一局域網(wǎng),連同一個wifi就行,如果沒條件的同學(xué)也可以把ip換成本地ip,本地測試。
server_address = ('127.0.0.1', 12345)
客服端代碼
import socket
import time
# 定義服務(wù)器地址和端口
server_address = ('192.168.31.54', 12345)
# 創(chuàng)建 UDP 客戶端套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
send_time = time.time()
message = "祖國必定統(tǒng)一!"
client_socket.sendto(message.encode(), server_address)
#接收數(shù)據(jù)
data,server = client_socket.recvfrom(1024)
receive_time = time.time()
#計算延遲
delay = receive_time - send_time
print("收到數(shù)據(jù):", data.decode())
print("通信延遲:", delay, "秒")
finally:
client_socket.close()
服務(wù)器ip地址192.168.31.54 端口號:12345?
服務(wù)端代碼
?
import socket
# 綁定服務(wù)器地址和端口
server_address = ('192.168.31.54', 12345) # 留空表示綁定到所有可用接口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(server_address)
print("等待客戶端連接...")
try:
data, address = server_socket.recvfrom(1024)
print("收到數(shù)據(jù):", data.decode())
# 發(fā)送數(shù)據(jù)
response = "hello from server!"
server_socket.sendto(response.encode(), address)
finally:
server_socket.close()
先運行服務(wù)端,在開啟客戶端。
服務(wù)端運行結(jié)果
?
客戶端運行結(jié)果?
?
5.數(shù)據(jù)抓包?
?在運行服務(wù)端之前開啟抓包
?
抓包的數(shù)據(jù)保存在這里了。
電腦進(jìn)程會調(diào)用12345端口,查詢udp協(xié)議,端口12345產(chǎn)生的數(shù)據(jù)包。
?
?
?
?
?
-
Internet Protocol Version 4: 這表示這是一個IPv4數(shù)據(jù)包,與之前描述的類似,是一種在互聯(lián)網(wǎng)上傳輸數(shù)據(jù)的常見協(xié)議。
-
Src: 192.168.31.46: 這是源IP地址,表示數(shù)據(jù)包的發(fā)送方的唯一標(biāo)識。在你的數(shù)據(jù)中,源IP地址是 192.168.31.46。
-
Dst: 192.168.31.54: 這是目標(biāo)IP地址,表示數(shù)據(jù)包的接收方的唯一標(biāo)識。在你的數(shù)據(jù)中,目標(biāo)IP地址是 192.168.31.54。
-
Version: 4: 這是IP協(xié)議的版本,表示這是IPv4。
-
Header Length: 20 bytes (5): 這是IP頭部的長度,以字節(jié)為單位。在你的數(shù)據(jù)中,IP頭部的長度是20字節(jié)。
-
Differentiated Services Field: 這是用于指示數(shù)據(jù)包優(yōu)先級和服務(wù)質(zhì)量的字段。在你的數(shù)據(jù)中,DSCP(DiffServ Code Point)被設(shè)置為0,表示默認(rèn)服務(wù)。
-
Total Length: 49: 這是整個IP數(shù)據(jù)包的長度,以字節(jié)為單位。在你的數(shù)據(jù)中,數(shù)據(jù)包的長度是49字節(jié)。
-
Identification: 0x4ec2 (20162): 這是一個用于分片和重組數(shù)據(jù)包的標(biāo)識字段。
-
Flags: 0x0000: 這是用于分片和重組的標(biāo)志字段。
-
Time to live: 128: 這是數(shù)據(jù)包的生存時間,類似之前的描述。
-
Protocol: UDP (17): 這表示數(shù)據(jù)包中封裝的是UDP協(xié)議的數(shù)據(jù)。
-
Header checksum: 這是IP頭部的校驗和,與之前的描述類似。
-
Source: 192.168.31.46: 這是源IP地址。
-
Destination: 192.168.31.54: 這是目標(biāo)IP地址。
-
-
5c ba ef 2a ea 63: 這是目標(biāo)MAC地址,也就是數(shù)據(jù)幀的目標(biāo)設(shè)備的MAC地址。
-
50 28 4a eb 78 e1: 這是源MAC地址,也就是數(shù)據(jù)幀的發(fā)送設(shè)備的MAC地址。
-
08 00: 這是幀類型字段,指示以太網(wǎng)幀中的上層協(xié)議是IPv4。
-
45 00: 這是IP首部的起始,表示IPv4版本和首部長度。
-
00 2e: 這是IP數(shù)據(jù)報的總長度。
-
35 7d: 這是標(biāo)識字段,用于分片和重組數(shù)據(jù)報。
-
00 00: 這是標(biāo)志和片偏移字段。
-
80 11: 這是TTL和上層協(xié)議字段,表明上層協(xié)議是UDP。
-
45 8d: 這是IP首部校驗和。
-
c0 a8 1f 36: 這是源IP地址,表示數(shù)據(jù)報的發(fā)送方IP地址。
-
c0 a8 1f 2e: 這是目標(biāo)IP地址,表示數(shù)據(jù)報的接收方IP地址。
-
30 39: 這是源端口號,表示UDP數(shù)據(jù)報的發(fā)送方端口號。
-
ed 4b: 這是目標(biāo)端口號,表示UDP數(shù)據(jù)報的接收方端口號。
-
00 1a: 這是UDP數(shù)據(jù)報的長度。
-
ba 41: 這是UDP校驗和。
?
?
數(shù)據(jù)部分:
e7a596e59bbde5bf85e5ae9ae7bb9fe4b880efbc81
?
?
?
?
?
數(shù)據(jù)部分:48 65 6c 6c 6f 20 66 72 6f 6d 20 73 65 72 76 65 72 21
-
hex_string = "48656c6c6f2066726f6d2073657276657221"
- 這行代碼將一個十六進(jìn)制字符串賦值給變量
hex_string
。這個十六進(jìn)制字符串表示ASCII字符的值,拼寫出了 "Hello from server!"。
- 這行代碼將一個十六進(jìn)制字符串賦值給變量
-
decoded_string = bytes.fromhex(hex_string).decode("utf-8")
- 這行代碼的作用:
-
bytes.fromhex(hex_string)
將十六進(jìn)制字符串轉(zhuǎn)換為字節(jié)序列。 -
.decode("utf-8")
將字節(jié)解釋為UTF-8編碼的字符串。 - 結(jié)果被存儲在變量
decoded_string
中。
-
- 這行代碼的作用:
hex_string = "48656c6c6f2066726f6d2073657276657221"
decoded_string = bytes.fromhex(hex_string).decode("utf-8")
print(decoded_string)
?
?
我上大一的時候還想抓包qq的連天記錄,現(xiàn)在在知道怎么會這么容易讓你知道聊天內(nèi)容。就自己寫了一個來抓包,順便回憶一下計算機(jī)網(wǎng)絡(luò)知識。?
?
?
?
?
??
?
?
?
?
到了這里,關(guān)于計算機(jī)網(wǎng)絡(luò)編程——UDP詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!