STUN和TURN协议(P2P技术之STUN)

STUN(Session Traversal Utilities for NAT)协议和TURN(Traversal Using Relays around NAT)协议都是用来解决NAT穿透和中转问题的,本文将从以下几方面对它们进行详细的阐述:

一、STUN协议

1、STUN协议的概念

STUN协议是由IETF定义的一种网络协议,旨在解决NAT穿透和中转问题。它的主要作用是通过测试网络中的NAT类型(Full cone,Restricted cone,Port restricted cone,Symmetric),获取UDP或TCP端口映射的外部IP地址和端口号,以便实现点对点沟通。

2、如何使用STUN协议

使用STUN协议的步骤如下:

1、向STUN服务器发送一个BINDING请求。
2、STUN服务器会向请求的源地址发送一个响应消息。
3、响应消息中包含了源地址映射所需要的IP地址和端口号。
4、根据响应消息中的信息建立与目标主机的连接。

3、STUN协议的实例代码

import stun

stun_servers = ['stun.l.google.com:19302', 'stun1.l.google.com:19302', 'stun2.l.google.com:19302']

s = stun.socket.AF_INET, stun.SOCK_DGRAM)
s.bind(('0.0.0.0', 0))
s.settimeout(2.0)

for stun_server in stun_servers:
    s.sendto(stun.create_request(), (stun_server, 19302))
    try:
        response = stun.parse_response(s.recv(2048))
        print(response[stun.Attribute.XOR_MAPPED_ADDRESS])
    except stun.StunException as e:
        print(stun_server, e)
s.close()

二、TURN协议

1、TURN协议的概念

TURN协议是一种用于NAT穿透的协议,其主要作用是在NAT环境中提供一个中心转发的功能,实现点对点连接。当STUN协议无法穿透NAT时,TURN协议将选择一个可靠的中继服务器来建立连接。

2、如何使用TURN协议

使用TURN协议的步骤如下:

1、客服端向TURN服务器发送Allocate请求。
2、TURN服务器分配一个公共IP地址和端口号。
3、客户端通过分配的地址和端口号直接发送数据。
4、TURN服务器接收客户端的数据,再将数据转发到目标机器。

3、TURN协议的实例代码

import stun

turn_servers = ['turn:my_username@mydomain.com:1234', 'turn:my_username@mydomain.com:5678']
my_ip = '192.168.0.2'
my_port = 8080
my_username = 'test'
my_password = '1234'

s = stun.socket.AF_INET, stun.SOCK_DGRAM)
s.bind((my_ip, my_port))
s.settimeout(2.0)

for turn_server in turn_servers:
    s.sendto(stun.create_allocate_request(username=my_username, password=my_password, ttl=3600), (turn_server, 12345))
    try:
        response = stun.parse_response(s.recv(2048))
        print(response[stun.Attribute.XOR_RELAYED_ADDRESS])
    except stun.StunException as e:
        print(turn_server, e)
s.close()

三、STUN和TURN协议的异同点

1、协议用途:STUN是一种探测和打洞协议,TURN是一种中继服务器协议。

2、使用场景:当两个客户端处于不同的NAT下时,STUN可以尝试打洞,解决NAT穿透问题。如果STUN无法穿透,则需要TURN协议中继数据。

3、实现方式:STUN通过测试NAT类型并打洞实现点对点连接,TURN则是通过中继服务器转发数据实现点对点连接。

4、网络开销:STUN的网络开销较小,TURN需要中继服务器转发数据,网络开销较大。

四、总结

STUN和TURN协议都是NAT穿透和中继的解决方案。STUN协议用于在NAT环境下的打洞,通过测试网络中的NAT类型获取外部IP地址和端口号,实现点对点连接;TURN协议则是中继服务器协议,它提供一个中心转发的功能实现点对点连接。两种协议的实现方式不同,应用场景也不同,开发人员应该根据实际情况选择合适的协议。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

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