nat(Session Traversal Utilities for NAT)會話穿越應用程式,可以讓位于nat后的客戶端找出自己的公網地址以及對應的Internet埠,最重要的是可以判斷自己處于哪種nat型別之后,它是通過udp進行通信的,
下面重點講怎么判斷nat的型別,
一般將nat型別可以分為四種:全錐形,受限錐形,埠受限錐形,對稱形,之所以是叫錐,可以想象一下圓錐,一個圓集中映射到一個點,也就是本地ip埠映射到nat服務器上面的公網ip和埠,其他任何遠端ip和埠的網路都可以連接進來,這種就是全錐形,如果只有接收過連接的遠端ip才能反向連接到本地ip,那這種就是受限形,其實就是ip受限形,如果再進行限制,只有接受過連接的遠端ip和埠才能反連到本地ip,那這種就叫埠受限形,一般來說,本地服務器發起一個連接到任何遠端ip,它對應的nat的埠都是不變的,如果發到不同的遠端ip,它對應的nat的埠也不一樣(公網ip也就是出口ip肯定是不變的),那這種就是對稱形了,不同的遠端ip對應不同的nat埠,形成一個對應關系,這種nat型別是不太好進行穿透的,
知道了上面的原理,檢測nat的型別也就變得方便了,
首先本地程式發起一個udp連接到stun服務器,這個服務器你自己開發一個就行,stun接受的udp請求后,可以根據from記錄下該請求的ip和埠,這個就是nat服務器是的出口ip了,然后根據這個ip和埠回復一條資訊,把獲取到的ip和埠作為資訊回復回去,如果本地能接收到,說明網路是沒有問題的,如果接收不了,說明block了,
這里獲取到了出口ip后,可以和本地ip做對比,如果一樣,那說明壓根就沒有nat了,可以直接bind一下,能系結成功就說明沒有nat,
本地重新發起一個請求到另外的stun服務器,通過同樣的方法獲取到出口ip和埠,將該埠和第一次的出口埠對比,如果變了,說明是對稱形,
本地程式再發起一個請求給stun, stun服務器接收到該請求后,換一個出口ip給回復回去(重新發起一次請求),如果本地能收到回復,說明是全錐形的,換了一個ip也能接收到請求,如果接收不到請求了,對于非nat模式,那說明本地可能存在防火墻,nat下那還得繼續探測,
本地發起一個請求到stun服務器,讓stun換一個埠進行回復,如果本地能接收到,那說明是ip受限形,否則就是埠受限形,
至此,nat型別檢測完成,這是udp通信下測驗的結果,對于全錐形,需要使用tcp進行反連接探測,如果連接不上,可能服務器對tcp做了限制,如果能連接上,說明可以正常穿透使用,可以將nat改為0,注意,本地要有保活的措施,定期對外發起tcp連接,以獲取公網ip和埠,反連就是對公網ip和埠重新發起連接的,
本文作者: nephen
本文鏈接: https://www.nephen.cn/posts/12334267/
著作權宣告: 本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 3.0 許可協議,轉載請注明出處!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/458390.html
標籤:其他
上一篇:排序演算法一
下一篇:費曼學習法
