STUN详解

STUN详解STUN是一个简单的客户端-服务器协议。客户端发送一个请求到一台服务器,而服务器返回一个响应。有两种类型的请求:绑定请求(通过UDP发送)和共享密钥请求(发送TLS(通过TCP))。共享秘密请求服务器返回一个临时的用户名和密码。此用户名和密码用于在随后的绑定请求和绑定响应,身份验证和消息完整性的目的。STUN客户和STUN服务器之间可能有一个或多个NAT。

大家好,又见面了,我是你们的朋友全栈君。

STUN是一个简单的客户端 – 服务器协议。客户端发送一个请求到一台服务器,而服务器返回一个响应。

有两种类型的请求:

绑定请求(通过UDP发送)和共享密钥请求(发送TLS (通过TCP)) 。

共享秘密请求服务器返回一个临时的用户名和密码。此用户名和密码用于在随后的绑定请求和绑定响应,身份验证和消息完整性的目的。

STUN客户和STUN服务器之间可能有一个或多个NAT 。其结果是,由服务器接收该请求的源地址将通过在NAT最接近服务器创建的映射地址。

STUN服务器复制该源IP地址和端口到一个STUN绑定响应,并将其发送回源IP地址和端口

的STUN请求。对于所有类型的NAT,这种响应都将能够到达STUN客户。

一个STUN服务器必须准备接收绑定请求在四个

地址/端口组合:(A1, P1 ),(A2 ,P1) , (A1, P2)和(A2 ,

P2)。 

( A1 , P1)表示主地址和端口,而这些都是通过下面的客户端发现程序中获得的值。

通常情况下, P1的端口是3478 (默认的STUN端口)。 A2和P2是任意的。 A2和P2都通过CHANGED – ADDRESS属性告诉客户端的,如下所述。

一旦建立套接字,客户端发送绑定请求。可靠性通过客户端重传完成的。客户应在100ms的时间间隔仍未收到响应后开始重传请求,第二次在200ms的时间间隔仍未收到响应则开始重传,每次等待重传增加一倍的时间,直到时间间隔达到1.6秒。重传继续以1.6秒的间隔,直到收到响应,或总共9个请求已被发送。如果最后一个请求已发送1.6秒钟后仍未收到响应,客户应考虑该链接已经失败。换句话说,请求将在时间0毫秒, 100毫秒, 300毫秒, 700毫秒, 1500毫秒, 3100ms,4700ms , 6300ms和7900ms发送 。在9500ms如果没有收到响应客户认为请求已经失败。

以下是stun过程解析:​

test1:

客户端发送一个STUN绑定请求到服务器,在属性CHANGE-REQUEST中在不设置任何标志,并且没有 RESPONSE-ADDRESS属性。这会导致服务器会从接收请求的的地址和端口发送响应返回给客户端。

test2:

客户端发送一个带有同时设置“改变IP”和“改变端口” 的CHANGE-REQUEST属性的绑定请求

test3:

客户端发送一个带有设置“改变端口” 的CHANGE-REQUEST属性的绑定请求

STUN详解

############################################################

​完全NAT(full-cone NAT): test1(MAPPED-ADDRESS属性里的IP和端口与本地IP地址、端口不同)->test2(收到响应)

​对称NAT(symmetric NAT): test1(收到响应)->(向另一IP端口)test1(收到响应但响应里面的 MAPPED-ADDRESS 属性里的IP和端口与第一次的不一样)

IP受限NAT: 判断完对称NAT之后->test3(收到响应)

端口受限NAT: 判断完对称NAT之后->test3(没有收到响应)

#############################################################

客户端首先发起第一次test1,如果这个测试没有响应,客户端知道了,这个网络是不能够运行UDP协议的连接。如果测试产生了一个响应,客户端检查响应的MAPPED-ADDRESS属性 。如果这个地址、端口和本地IP地址、端口是相同的,客户端知道它不是在NAT后面了。

然后它执行的测试二。如果收到一个响应,客户端知道它有开放互联网(或者,至少在一个有一个防火墙其行为像全锥型NAT ,但是没有转发) 。如果没有响应被接收时,客户端知道它的对称的UDP防火墙后面(主机出口处没有NAT设备,但有防火墙,且防火墙规则如下:从主机UDP端口A发出的数据包保持源地址,但只有从之前该主机发出包的目的IP/PORT发出到该主机端口A的包才能通过防火墙.)。

第一次test1中如果MAPPED-ADDRESS属性里的IP和端口与本地IP地址、端口不同,  

客户端知道自己在NAT后面,他再执行test2如果这个响应被收到了则客户端位于

 full-cone NAT(全锥形NAT),如果没有收到响应,客户端将继续执行第二次test1,但是这次这样做:绑定请求发向的地址不再是之前的地址而是第一次test1的响应中CHANGED-ADDRESS 属性里的IP地址和端口。

如果这次收到的响应里面的 MAPPED-ADDRESS 属性里的IP和端口与第一次的不一样,那么客户端就是在symmetric NAT(对称NAT)后面,如果这个地址是一样的那么客户端要么是在限制NAT之后要么是在端口受限NAT之后,要决定具体在那个NAT之后要进行test3,如果收到响应在是在受限NAT之后,如果没有响应收到的,其背后的一个端口受限NAT 。

在多个NAT之后的情况客户机与因特网之间,该类型被发现会是在客户机和之间最严格的NAT的类型互联网。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160514.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月17日 下午9:36
下一篇 2022年7月17日 下午9:36


相关推荐

  • idea2019永久激活注册码3月最新在线激活

    idea2019永久激活注册码3月最新在线激活,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    143
  • Claude Code新手保姆级教程

    Claude Code新手保姆级教程

    2026年3月15日
    1
  • 断点调试原理

    断点调试原理调试断点原理   调试断点,依赖于父进程和子进程之间的通信,打断点实际是在被调试的程序中,改变断点附近程序的代码,这个断点使得被调试的程序,暂时停止,然后发送信号给父进程(调试器进程),然后父进程能够得到子进程的变量和状态。达到调试的目的。   修改断点附近程序的指令地址为0xcc,这个地址的指令就是int3,含义是,是当前用户态程序发生中断,告诉内核当前程序有断点,那么内核

    2022年5月22日
    90
  • pycharm tensorflow 使用 GPU跑代码

    pycharm tensorflow 使用 GPU跑代码importosos environ CUDA VISIBLE DEVICES 0 指定使用 1 卡 config tf ConfigProto allow soft placement False log device placement False config gpu options allow growth Truesession tf Session config config 查看是否使用了 GPU cmd 输入 nvidia smi 如果执行了代码先

    2026年3月27日
    3
  • 两个Repeater嵌套使用「建议收藏」

    两个Repeater嵌套使用「建议收藏」在C#中有时存在着两个嵌套循环的存在,此时可以使用两个Repeater进行循环获取到。    例如:aspx页面中:                                                                                                          ‘alt=””>           

    2022年7月14日
    24
  • IIS服务器多域名部署多个HTTPS的方法

    IIS服务器多域名部署多个HTTPS的方法当我们使用 windows 服务器配置多站点 SSL 证书时 经常报错提示 至少一个其他网站正在使用同一 HTTPS 绑定 而此绑定用另一证书配置 确实要重用此 HTTPS 绑定并将其他网站重新指定使用新证书吗 由于每个站点对应的证书不同 服务器需要通过请求中不同的主机头来判断需要用哪个证书解密 然而主机头作为请求的一部分也被加密 最终 IIS 只好使用第一个绑定到该 IP PORT 的站点证书解密请求 从而有可能造成对于其他站点的请求失败而报错 默认情况下 使用 IIS8 以下版本的 HTTPS 绑定是无法指定主机名的 主机名

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号