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


相关推荐

  • 交叉线和直通线的区别和用途[通俗易懂]

    交叉线和直通线的区别和用途[通俗易懂]一般设备分为DCE(数据通信设备)和DTE(数据终端设备)当DCE 和DCE以及DTE和DTE之间相连,也就是同种类型的设备相连时间,我们用交叉线。当DCE和DTE之间相连接,也就是不同种类型的设备相连时间,我们一般使用直通线即不同类型的设备需要更简单的连接,不宜是传输复杂化常见的DCE设备(交换机,集线器,CSU/DSU)常见的DTE设备(终端计算机,路由器)

    2022年6月19日
    43
  • 校园网络总体规划设计方案_校园网的使用与规划

    校园网络总体规划设计方案_校园网的使用与规划目录一、项目概述3二、设计要求4(一)网络部分的总体要求4(二)系统部分的总体要求4(三)网络安全设计4三、设计原则6四、设计目标6五、网络拓扑结构设计7(一)布线结构需求7(二)拓扑结构的选择7六、网络技术选择9(一)VLAN技术9(二)IP通信技术10(三)使用适应性的路由协议10(四)访问控制技术11七、网络设备选型原则12(一)交换机的选择12(二)路由器的选择13(三)防火墙14(四)服…

    2022年10月5日
    0
  • int是什么_uint16范围是多少

    int是什么_uint16范围是多少收到反馈:9位条码更改为12位后,条形码无法自动+1原因:条码的数值超过当前定义的变量的范围调整:将int类型的变量定义为Int64,调整后测试值可自动+1附:Int16值类型表示-32768~+32767之间的整数。Int32值类型表示-2,147,483,648~+2,147,483,647之间的整数。Int64值类型表示-9,223,…

    2022年8月15日
    1
  • MySQL5.7.31编译安装时常见错误分析「建议收藏」

    MySQL5.7.31编译安装时常见错误分析

    2022年2月16日
    51
  • Apache Struts2更新到新版本(2.5.22)

    Apache Struts2更新到新版本(2.5.22)前两天接到阿里云那边的一个远程命令执行漏洞(S2-046)和(S2-45)的通知,上面说建议更新Struts2框架到最新版。老项目没有用pom.xml管理jar包的,所以只好把Struts2的相关东西都给更新一下咯,在Struts2官网上查到目前最新(2019年12月)的是2.5.22,我先把官网上的示例下载下来,看看里面的jar包解压后在lib文件夹下的东西看了一下,挑选了一下就直接替换掉原…

    2022年7月13日
    18
  • leetcode 最长有效括号_leetcode 三数之和

    leetcode 最长有效括号_leetcode 三数之和给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例 1:输入:s = “(()”输出:2解释:最长有效括号子串是 “()”示例 2:输入:s = “)()())”输出:4解释:最长有效括号子串是 “()()”示例 3:输入:s = “”输出:0题解括号匹配:(看作+1,)看作-1,所有满足条件的括号应该是前缀和>=0,并且总和==0class Solution {public: const int INF =

    2022年8月9日
    6

发表回复

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

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