Socket NAT穿透解決方案 UDP打洞

2021-09-24 14:56:15 字數 3744 閱讀 1988

full cone 

restricted cone 

port restricted cone 

symmentric 

目前主要的nat型別有如下幾種:

1)full-cone nat, also known as one-to-one nat

2)address-restricted-cone nat

3)port-restricted cone nat

類似於address restricted cone nat, 但是埠號有限制.

4)symmetric nat

針對前面三種nat型別(即cone nat)只要通訊雙方彼此知道對方的內部位址和外部位址的對映關係,然後通過udp打洞的方式就可以建立相互連線的通訊;但是第四種也就是symmetric nat的話由於每次向不同目的地傳送資料報時採用不同的外部位址,也就沒辦法通過直接的方式建立p2p連線。

可以通過pystun來判斷:

stun方案的特性如下表:

特性 說明

實現複雜度

實現簡單

tcp穿透支援

不支援對現有裝置的要求

要求客戶端支援,對現有nat裝置無改動要求,需增加stun伺服器

可擴充套件性

可擴充套件性好,與具體協議無關

安全性 一般

健壯性差,不支援symmentric型nat 其他

支援自動檢測nat型別,使使用者即使在使用stun協議無法實現nat

穿透時還可以根據nat型別自主選擇其他可使用的nat穿透方案

turn方案的特性如下表:

特性 說明

實現複雜度

難於實現。turn的安全性設計增加終端設定的複雜度

tcp穿透支援 支援

對現有裝置的要求

對現有nat裝置無要求,要求客戶端支援,需增加turn伺服器s

可擴充套件性

可擴充套件性好,與具體協議無關

安全性 一般

健壯性好,支援所有型別的nat 其他

與p2p穿透方式相比,效能時relay穿透方式的弱點。另外turn無法

實現負載分擔,解決的方式是把media relay伺服器的分配工作放在 sip proxy完成

與stun和turn相比,ice並非是解決nat穿透問題的協議,而是乙個框架,在這個框架中, 可以整合其他現存的nat穿透協議,如stun、turn、rsip等。區別於其他的nat穿透解 決方案,ice是一種探索和更新式的解決方案,通過蒐集自身和對端盡可能多的網路資訊(各種網路位址),嘗試在這些位址間建立資料通道,並在這一過程中不斷更新先前收集到的資訊,從而找出和選擇能夠進行nat穿透的資料通道。

ice方案的特性如下表:特性

說明 實現複雜度 一般

tcp穿透支援 支援

對現有裝置的要求

對nat裝置無要求,支援所有型別的nat裝置。客戶端必須支援,

網路結構中需增加stun/turn伺服器

可擴充套件性

可擴充套件性好,與具體協議無關

安全性 較好

健壯性好,適用與所有nat及nat拓撲型別,且由於存在中繼伺服器,nat

穿透一般總是能成功 其他

兩台沒有外網 ip、在 nat 後邊的主機如何直連?udp打洞通常可行,但是需要第三方伺服器。方法如下:

#

!/usr/bin/env python3

#vim:fileencoding=utf-8

'''echo back clients' udp address

'''import

sysimport

time

import

socket

registry =

defget_peer(name, addr):

now =time.time()

for t, k, a in

reversed(registry):

if now - t > 500:

ret =none

break

if k == name and addr[0] !=a[0]:

ret =a

break

else

: ret =none

del registry[:-50]

return

retdef

main(port):

s =socket.socket(socket.af_inet, socket.sock_dgram)

s.bind((

'', port))

try:

while

true:

data, addr = s.recvfrom(4096)

msg = data.decode('

utf-8

', '

replace

').rstrip('\n'

)

try:

cmd, *rest =msg.split()

except

valueerror:

continue

cmd =cmd.upper()

if cmd == '

reg'

andlen(rest):

name =rest[0]

back = '

addr %s %d

' %addr

peer_addr =get_peer(name, addr)

ifpeer_addr:

back += '

%s %d

' %peer_addr

back += '\n'

else

: back = '

your address is %r\n

' %(addr,)

s.sendto(back.encode(), addr)

print(time.strftime('

%y-%m-%d %h:%m:%s

'), addr, msg)

except

keyboardinterrupt:

print

()if

__name__ == '

__main__':

try: port = int(sys.ar**[1])

except

(valueerror, indexerror):

sys.exit(

'which port to listen?')

main(port)

快取穿透解決方案

1 先查快取,快取不存在查資料庫,資料庫中如果存在則存入快取 問題 大量不存在的資料導致資料庫的查詢頻次高,有900多萬次 因為該功能上線預設為不存在,所以正常使用者訪問也是每次都查詢 2 先查快取,快取中不存在查資料庫,資料庫如果存在則存結果入快取 如果不存在則存 1入快取 資料庫的查詢次數明顯降...

cocos 剛體穿透解決方案。

剛體穿透 打個比方,比如乙個圓球在乙個正方形的方框裡面不同的彈射。當圓球達到一定的速度時候,會出現乙個bug,圓球會直接彈出方框,還沒有進行正確的碰撞檢測。這種情況叫做剛體穿透。之所以出現這種情況是因為圓球速度過快,方框的厚度不夠,那麼在剎那的短時間內系統沒有對其進行碰撞檢測,而當球剛好已經穿過方框...

快取雪崩,快取穿透解決方案

負載過高,甚至宕機。解決思路 1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。2,分析使用者行為,盡量讓失效時間點均勻分布。避免快取雪崩的出現。3,如果是因為某台快取伺服器宕機,可以考慮做主備,比如 red...