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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 动态库依赖关系_查看运行的动态库

    动态库依赖关系_查看运行的动态库1前言这两天在编写一个插件系统Demo的时候,发现了个很奇怪的问题:插件加载器中已经链接了ld库,但是应用程序在链接插件加载器的时候,却还需要显式的来链接ld库。否则就会报:DSOmissingfromcommandline。这个报错翻译过来就是没有在命令行中指定该动态库。这个报错就很搞事了,你说你明明知道需要哪个库,为什么不直接帮我链接呢,非得我显示的在命令行中指定呢?2现象描…

    2022年9月1日
    3
  • 虚拟IP简介「建议收藏」

    虚拟IP简介「建议收藏」什么是虚拟IP虚拟IP(VirtualIPAddress,简称VIP)是一个未分配给真实弹性云服务器网卡的IP地址。弹性云服务器除了拥有私有IP地址外,还可以拥有虚拟IP地址,用户可以通过其中任意一个IP(私有IP/虚拟IP)访问此弹性云服务器。同时,虚拟IP地址拥有私有IP地址同样的网络接入能力,包括VPC内二三层通信、VPC之间对等连接访问,以及弹性公网IP、VPN、云专线等网络接入。多个主备部署的弹性云服务器可以在绑定虚拟IP地址时选择同一个虚拟IP地址。用户可以为该虚拟IP地址绑定一个弹

    2022年10月20日
    1
  • php 简单的存在 (方法之间的神奇作用:容错)

    php 简单的存在 (方法之间的神奇作用:容错)

    2022年1月7日
    45
  • nginx 负载均衡时,一台tomcat宕机时的问题 可以做到自动切换「建议收藏」

    nginx 负载均衡时,一台tomcat宕机时的问题 可以做到自动切换「建议收藏」如果Nginx没有仅仅只能代理一台服务器的话,那它也不可能像今天这么火,Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用。具体配置过程如下:1.在http节点下,添加upstream节点。upstreamlinuxidc{server10.0.6.108:7080;server10.0.0.85:8980;}2.将server节…

    2022年7月23日
    11
  • python文件操作步骤_python打开文件的函数

    python文件操作步骤_python打开文件的函数文件操作文件操作主要包括对文件内容的读写操作,这些操作是通过文件对象实现的,通过文件对象可以读写文本文件和二进制文件open(file,mode='r',buffering=-

    2022年8月6日
    5
  • 通信端口感叹号_PCI简易通讯控制器有黄色感叹号怎么办?

    通信端口感叹号_PCI简易通讯控制器有黄色感叹号怎么办?近日有网友新安装了Win7系统,安装完成后感觉电脑都顺畅了很多,不过在打开设备管理器的时候发现,在其他设备下的PCI简易通讯控制器有个黄色感叹号,出现这个感叹号也意味着这个控制器的驱动未安装,对此我们该如何解决呢?解决方法1、打开设备管理器,右键点击“PCI简易通讯控制器”,在下拉菜单中点击属性;2、在打开的“PCI简易通讯控制器属性”窗口显示:该设备的驱动程序未被安装,我们点击更新驱动程序;3…

    2022年5月25日
    194

发表回复

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

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