美文网首页网络与信息安全信息安全
UDP通信在NAT中session保持时间测试

UDP通信在NAT中session保持时间测试

作者: 年华不散场 | 来源:发表于2018-04-24 15:00 被阅读17次

1.朴素UDP数据包的发送与回发

当电脑A向电脑B发送UDP数据的时候,电脑B可直接向电脑A回发数据。拓扑如下:

朴素UDP数据包

2.NAT下的UDP数据发送

在IPV4资源紧张的大背景下诞生的NAT技术缓解了地址紧张的局面,但是也带来了大量设备不能直接访问公网的问题。

NAT拓扑

这时电脑A不能和电脑B愉快的发起TCP/UDP请求。处于不同局域网的设备不能直接互相访问,即电脑A和电脑B处于不同的局域网,所以他们互相都不能直接访问。

单NAT

在这种情况下,如果电脑A主动发起UDP请求,则双方可以互相通信,其原理如下:

UDP通信

在链接建立的生命周期中,内网的端口和外网的端口通过路由器建立起了映射,达到地址转换/端口转换的效果。这种映射方式,对于TCP这种有链接的协议来说,很容易确定映射的生命周期。但是对于UDP来说,就很困难了。还好,路由器厂家在做NAT的时候想到了这一点,在UDP从内网发送的时刻开始,为UDP数据回送保留了映射,这个时间根据路由器的厂家不同,保留映射数秒到数分钟不等。这个时间叫做Session(会话)保持时间。

3.验证与效果测试

我们采用以下方法验证数据回发:

  1、使用一台局域网内的电脑A和一台具有公网IP地址的电脑B; 
  2、使用电脑A向电脑B发送一个UDP数据包; 
  3、在电脑B接受到数据包时,立刻向源地址返回一个数据包。

如果Session会保持,则电脑A会收到电脑B返回的数据包。
为了实现以上效果,我们使用了两段Python程序来做这个实验。
局域网内电脑A的程序,会向电脑B发送“Hello”,然后静等数据返回。

import socket

if __name__ == "__main__":
    addr = ('127.0.0.1',21500)
    receive = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    receive.bind(addr)

    msg = 'Hi!\r\n'

    data,addr = receive.recvfrom(2048)
    print(addr,' : ',data)
    receive.sendto(msg.encode('UTF_8'),addr)

    receive.close()

具有公网IP地址的电脑B的程序(IP地址略去),接收到数据后会立刻回发“Hi”:

import socket

if __name__ == "__main__":
    addr = ('x.x.x.x',21500)
    receive = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    receive.bind(addr)

    msg = 'Hi!\r\n'

    data,addr = receive.recvfrom(2048)
    print(addr,' : ',data)
    receive.sendto(msg.encode('UTF_8'),addr)

    receive.close()

通常Session保持会持续一段时间,如何测试这段时间有多长呢?我们采用以下方法验证:

1、使用一台局域网内的电脑A和一台具有公网IP地址的电脑B; 
2、使用电脑A向电脑B发送一个UDP数据包; 
3、在电脑B接受到数据包时,延迟一段时间向源地址返回一个数据包。 
4.1、若电脑A收到数据,增大步骤3的延迟时间,重复2。 
4.2、若电脑A无法收到数据,实验结束,最后一次成功收到数据的时间为当前网络下的最大保持时间。

电脑A的程序保持不变,电脑B的程序变化如下:

import socket
import time
if __name__ == "__main__":
    addr = ('x.x.x.x',21500)
    receive = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    receive.bind(addr)

    msg = 'Hi!\r\n'

    data,addr = receive.recvfrom(2048)
    print(addr,' : ',data)
    time.sleep(10)#这里为延迟时间
    receive.sendto(msg.encode('UTF_8'),addr)

    receive.close()

最终作者的网络环境测试的最大延迟时间为5分钟。

4.小结

通过这个实验,说明网络设备在NAT/NAPT时对UDP通信已经做优化,只要延迟时间不是太长,很大概率可以将回传数据包成功送达。更有厂家对UDP Session保持时间做优化,在端口资源不紧张时长期保持端口映射。

相关文章

  • UDP通信在NAT中session保持时间测试

    1.朴素UDP数据包的发送与回发 当电脑A向电脑B发送UDP数据的时候,电脑B可直接向电脑A回发数据。拓扑如下: ...

  • 详细介绍java UDP通信

    详细介绍java UDP通信 介绍: UDP为用户数据报协议,在java中操纵UDP使用JDK中java.net包...

  • 网络编程-TCP

    1.tcp的相关介绍 udp通信模型: udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可...

  • 2019-01-07

    一. Nat介绍 1.nat基本介绍 NAT分类 NAPT类型介绍 NAT对待UDP的实现方式有4种,分别如下: ...

  • 2018-07-21tcp

    udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可 tcp通信模型中,在通信开始之前,一定...

  • session的生命周期是如何进行的?

    session简介 在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进...

  • 交互式连接建立 (ICE):一种用于网络地址转换 (NAT) 穿

    摘要 本文档为基于 UDP 的通信描述了一种用于网络地址转换 (NAT) 穿越的协议。这个协议被称为 交互式连接建...

  • GO语言初级学习之代码案例12 (UDP通信)

    @(go语言 黑马)[GO语言] UDP通信 题目:编写UDP通信的并发服务器和客户端 知识点:UDP通信 逻辑思...

  • QT udp通信--Apple的学习笔记

    一,前言 之前做的都是QT的TCP通信,从来没做过QT的udp通信,所以我从自己的小小代码库中找不到udp通信的最...

  • 常见面试题-计算机网络

    一、简述TCP/UDP的区别 TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常...

网友评论

    本文标题:UDP通信在NAT中session保持时间测试

    本文链接:https://www.haomeiwen.com/subject/vnzdlftx.html