使用UDP探测steam游戏延迟
需求:
众所周知网络传输上对icmp,tcp,udp数据包是有区别对待的,当我们使用icmp去探测游戏服务器时毫无问题,但是游戏延迟异常或频繁掉线
此时不妨尝试下UDP探测,来求证是否运营商对UDP数据做了限制
基础理论
icmp探测
icmp探测的前提是服务端会对icmp报文进行回包
探测方式是客户端使用icmp协议发送request报文到服务端,服务端回应icmp replay报文,当客户端收到服务端的replay报文时认为探测成功,反之探测失败
tcp探测
tcp探测的前提是服务端对所探测的端口进行侦听
tcp探测通常在客户端发起对服务端端口的tcp握手,当收到服务端的ack报文时认为探测成功,反之探测失败
udp探测
udp探测的前提是服务端对所探测的端口进行侦听,且对该端口收到的数据进行回复
udp探测通常是在客户端给服务器发送双方约定的报文,服务端收到后进行回应,当客户端收到服务端所回应的udp报文后认为探测成功,反之探测失败
我们基于以上理论来做下到steam游戏的udp延迟探测
1 抓取steam游戏服务器的ip和端口
2 抓取udp数据包字段
3 封装发送udp数据包
如何抓取可以私聊,以dota2为例,展示下探测延迟的部分核心代码,我使用的有加速器,未使用加速器延迟或许在100ms以上且丢包
import socket,time host = '103.10.124.118' hex_str = 'ffffffff54536f7572636520456e67696e6520517565727900' message = bytes.fromhex(hex_str) port = 27015 while True: try: server_address = (host, port) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sent = sock.sendto(message, server_address) sock.settimeout(1) start_time = time.time() data = sock.recv(4096) sock.close() delay = round((time.time()- start_time)*1000,2) print(f'服务器{host}:{port}延迟:{delay}ms') time.sleep(1) except: print(f'服务器{port}timeout') time.sleep(1)

以驱魔为理想,为生计而奔波

浙公网安备 33010602011771号