使用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)

 

posted @ 2024-12-26 11:24  无限's-blog  阅读(152)  评论(0)    收藏  举报