1.UDP协议的概述
UDP(User Datagram Protocol)是一种在网络通信中使用的传输层协议。与TCP(Transmission Control Protocol)相比,UDP是一种无连接的协议,这意味着它不像TCP那样在通信的开始和结束时需要建立和终止连接。
2.UDP协议的特点
-
无连接性: UDP是无连接的协议,这意味着通信的双方不需要在通信之前建立连接。每个UDP数据报都是独立的,它们可以单独发送,没有依赖关系。
-
不可靠性: UDP不提供数据传输的可靠性保证。它不会像TCP那样提供重传、确认和流量控制等机制。这意味着如果发送的数据丢失或者损坏,UDP不会自动重新发送,需要应用层自行处理。
-
速度和低延迟: 由于没有连接状态维护和复杂的确认机制,UDP的开销比TCP小,因此在速度和延迟方面表现更好。这使得它适用于实时应用,如语音通话和在线游戏。
-
数据报格式: UDP数据报包含了目标端口号和源端口号,这些信息用于将数据传递给正确的应用程序。但是,数据报本身没有保证按顺序到达或完整到达。
-
无拥塞控制: UDP不具备TCP的拥塞控制机制,因此在网络拥塞的情况下,UDP数据报可能会丢失或延迟增加。
-
广播和多播支持: UDP支持向特定组中的多个主机发送数据,这称为多播(Multicast)。也可以将数据报广播到网络中的所有主机,这称为广播(Broadcast)。
-
适用场景: UDP适用于需要快速传输和实时性要求较高的应用,如语音和视频流、在线游戏、实时传感数据等。它不适用于需要可靠传输和数据完整性的场景,因为这些方面没有被UDP提供。
3.UDP的格式
4.网络编程
我是在同一局域网下两台电脑实现的通信,一台是服务器,一台是客户端
你可以借用你室友的电脑,条件是在同一局域网,连同一个wifi就行,如果没条件的同学也可以把ip换成本地ip,本地测试。
server_address = ('127.0.0.1', 12345)
客服端代码
import socket
import time
# 定义服务器地址和端口
server_address = ('192.168.31.54', 12345)
# 创建 UDP 客户端套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
send_time = time.time()
message = "祖国必定统一!"
client_socket.sendto(message.encode(), server_address)
#接收数据
data,server = client_socket.recvfrom(1024)
receive_time = time.time()
#计算延迟
delay = receive_time - send_time
print("收到数据:", data.decode())
print("通信延迟:", delay, "秒")
finally:
client_socket.close()
服务器ip地址192.168.31.54 端口号:12345
服务端代码
import socket
# 绑定服务器地址和端口
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("收到数据:", data.decode())
# 发送数据
response = "hello from server!"
server_socket.sendto(response.encode(), address)
finally:
server_socket.close()
先运行服务端,在开启客户端。
服务端运行结果
客户端运行结果
5.数据抓包
在运行服务端之前开启抓包
抓包的数据保存在这里了。
电脑进程会调用12345端口,查询udp协议,端口12345产生的数据包。
-
Internet Protocol Version 4: 这表示这是一个IPv4数据包,与之前描述的类似,是一种在互联网上传输数据的常见协议。
-
Src: 192.168.31.46: 这是源IP地址,表示数据包的发送方的唯一标识。在你的数据中,源IP地址是 192.168.31.46。
-
Dst: 192.168.31.54: 这是目标IP地址,表示数据包的接收方的唯一标识。在你的数据中,目标IP地址是 192.168.31.54。
-
Version: 4: 这是IP协议的版本,表示这是IPv4。
-
Header Length: 20 bytes (5): 这是IP头部的长度,以字节为单位。在你的数据中,IP头部的长度是20字节。
-
Differentiated Services Field: 这是用于指示数据包优先级和服务质量的字段。在你的数据中,DSCP(DiffServ Code Point)被设置为0,表示默认服务。
-
Total Length: 49: 这是整个IP数据包的长度,以字节为单位。在你的数据中,数据包的长度是49字节。
-
Identification: 0x4ec2 (20162): 这是一个用于分片和重组数据包的标识字段。
-
Flags: 0x0000: 这是用于分片和重组的标志字段。
-
Time to live: 128: 这是数据包的生存时间,类似之前的描述。
-
Protocol: UDP (17): 这表示数据包中封装的是UDP协议的数据。
-
Header checksum: 这是IP头部的校验和,与之前的描述类似。
-
Source: 192.168.31.46: 这是源IP地址。
-
Destination: 192.168.31.54: 这是目标IP地址。
-
5c ba ef 2a ea 63: 这是目标MAC地址,也就是数据帧的目标设备的MAC地址。
-
50 28 4a eb 78 e1: 这是源MAC地址,也就是数据帧的发送设备的MAC地址。
-
08 00: 这是帧类型字段,指示以太网帧中的上层协议是IPv4。
-
45 00: 这是IP首部的起始,表示IPv4版本和首部长度。
-
00 2e: 这是IP数据报的总长度。
-
35 7d: 这是标识字段,用于分片和重组数据报。
-
00 00: 这是标志和片偏移字段。
-
80 11: 这是TTL和上层协议字段,表明上层协议是UDP。
-
45 8d: 这是IP首部校验和。
-
c0 a8 1f 36: 这是源IP地址,表示数据报的发送方IP地址。
-
c0 a8 1f 2e: 这是目标IP地址,表示数据报的接收方IP地址。
-
30 39: 这是源端口号,表示UDP数据报的发送方端口号。
-
ed 4b: 这是目标端口号,表示UDP数据报的接收方端口号。
-
00 1a: 这是UDP数据报的长度。
-
ba 41: 这是UDP校验和。
数据部分:
e7a596e59bbde5bf85e5ae9ae7bb9fe4b880efbc81
数据部分:48 65 6c 6c 6f 20 66 72 6f 6d 20 73 65 72 76 65 72 21
-
hex_string = "48656c6c6f2066726f6d2073657276657221"
- 这行代码将一个十六进制字符串赋值给变量
hex_string
。这个十六进制字符串表示ASCII字符的值,拼写出了 "Hello from server!"。
- 这行代码将一个十六进制字符串赋值给变量
-
decoded_string = bytes.fromhex(hex_string).decode("utf-8")
- 这行代码的作用:
bytes.fromhex(hex_string)
将十六进制字符串转换为字节序列。.decode("utf-8")
将字节解释为UTF-8编码的字符串。- 结果被存储在变量
decoded_string
中。
- 这行代码的作用:
hex_string = "48656c6c6f2066726f6d2073657276657221"
decoded_string = bytes.fromhex(hex_string).decode("utf-8")
print(decoded_string)
我上大一的时候还想抓包qq的连天记录,现在在知道怎么会这么容易让你知道聊天内容。就自己写了一个来抓包,顺便回忆一下计算机网络知识。