python - python 2.7 Client Server UDP通信,如何克服丢包?
问题描述
根据以下代码,我在本地主机上的服务器和客户端之间进行了 UDP 通信: https ://pymotw.com/2/socket/udp.html
回声服务器:
import socket
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('127.0.0.1', 12321)
sock.bind(server_address)
while True:
data, address = sock.recvfrom(4096)
if data:
sent = sock.sendto(data, address)
回声客户端
import socket
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('127.0.0.1', 12321)
message = 'This is the message. It will be repeated.'
try:
for i in range 4:
sent = sock.sendto(message, server_address)
data, server = sock.recvfrom(4096)
finally:
sock.close()
现在假设我受到了MITM攻击,特定数据包没有到达服务器,客户端仍在等待服务器的响应,
我陷入僵局。
我该如何克服呢?UDP套接字有一些超时参数吗?
解决方案
是的,UDP 套接字有超时。请参阅https://docs.python.org/2/library/socket.html中的 socket.settimeout()并阅读一般的非阻塞套接字。
请注意,即使没有中间人攻击者,UDP 数据包也可能被丢弃、复制和/或重新排序。这是因为 UDP(按设计)是一种不可靠的数据报协议。
如果您需要可靠的协议,请使用 TCP(或 QUIC)。
如果您需要确保没有中间人可以修改或(可选)观察数据,请使用 TLS(或 QUIC)。
推荐阅读
- android - 安卓。失去焦点后出现意外的淡入(暗淡)背景
- c# - GroupJoin 无需从加入列表中选择内容
- html - 如何通过网站上的链接打开信息亭模式
- java - 具有 Java JDBC 批量插入的 Oracle 数据库 - 在父级之前插入子级
- sql - 为什么不识别此 CTE?
- javascript - chrome 扩展上的 SpeechRecognition Web API 不允许错误
- python - 以表格格式加入单个字典
- python - Python - 如何将 S3 文件夹转换为 JSON 层次结构?
- python - 用 virtualenvwrapper 新建虚拟环境时如何选择 Python 版本?
- windows - 如何通过 Powershell 从禁用的 Active Directory 用户中删除所有组?