大家好,又见面了,我是你们的朋友全栈君。
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属性的绑定请求
############################################################
完全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的类型互联网。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160514.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...