首页 > 解决方案 > 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套接字有一些超时参数吗?

标签: pythonpython-2.7client-server

解决方案


是的,UDP 套接字有超时。请参阅https://docs.python.org/2/library/socket.html中的 socket.settimeout()并阅读一般的非阻塞套接字。

请注意,即使没有中间人攻击者,UDP 数据包也可能被丢弃、复制和/或重新排序。这是因为 UDP(按设计)是一种不可靠的数据报协议。

如果您需要可靠的协议,请使用 TCP(或 QUIC)。

如果您需要确保没有中间人可以修改或(可选)观察数据,请使用 TLS(或 QUIC)。


推荐阅读