1.p2p是什么?
p2p是對等網絡(peer-to-peer networking)其可以定義為:端對端的資源共享,每一端即可是服務端,也可以是客戶端。既可以是資源的提供者,也可以是資源的共享者。
傳統C/S模型需要實現端和端的資源共享, 需要將資源上傳到中轉服務器。另外一端再去中轉服務器下載,如下圖:
傳統CS架構,客戶端1和客戶端2之間是無直接交互.png
而P2P則不需要將資源上傳到服務器,它是端對端傳輸,每一個端既可以是服務器,也可以是客戶端
p2p架構,無需中轉服務器.png
優勢:實時性最高,流量少,更加安全。在視頻直播,在線教育,視頻安防行業用的比較多
劣勢:一旦進行p2p傳輸之后,用戶之間的內容將無法監管,浪費用戶帶寬,頻繁進行讀寫磁盤
客戶端1和客戶端2這樣交互是p2p最理想的情況
圖中客戶端1和客戶端2直接連接, 假如他們處于兩個不同的內網呢?
2.NAT是什么?
NAT俗稱網絡地址轉換,它是一種把內部私有網絡地址(IP地址)轉換成公網網絡IP地址的技術。比如我們電腦里面網卡地址是192.168.1.100,但是我們再百度搜索“IP”卻顯示220.112.224.53,這就是NAT的功能。
NAT主要是部署在路由器或者交換機上。
為什么需要NAT?
主要還是IP地址的不足,使用少量的公有IP 地址代表較多的私有IP 地址的方式,將有助于減緩可用的IP地址空間的枯竭。用大白話:比如你有一個路由器(家用的那種就可以)這個路由器本身連接了公網(被分配到了一個公網的IP地址)。路由器后面有接了N多個設備,每個設備都分配到了一個私有的地址(內網地址),這些地址可以通過這個路由器和外網交互。
其次能夠有效地避免來自網絡外部的攻擊,隱藏并保護網絡內部的計算機。
RFC3489 中將 NAT 的實現分為四大類:
- Full Cone NAT(完全圓錐型)
- Address Restricted Cone NAT(地址限制圓錐型 )
- Port Restricted Cone NAT(端口限制圓錐型)
- Symmetric NAT(對稱型)
1.完全圓錐型NAT
在完全圓錐型NAT(Full Cone NAT)中,NAT會將客戶機地址{X:y}轉換成公網地址{A:b}并綁定。任何包都可以通過地址{A:b}送到客戶主機的{X:y}地址上。如圖所示:
RFC3581——完全錐型NAT
2. 地址限制圓錐型NAT
地址限制圓錐型NAT(Address Restricted Cone NAT)會將客戶機地址{X:y}轉換成公網地址{A:b}并綁定,只有來自主機{P}的包才能和主機{X:y}通信。如下圖所示:
RFC3581——地址限制型NAT
3.端口限制圓錐型NAT
端口限制圓錐型NAT(Port Restricted Cone NAT)會將客戶機地址{X:y}轉換成公網地址{A:b}并綁定,只有來自主機{P,q}的包才能和主機{X:y}通信。如下圖所示:
RFC3581——端口限制型NAT
4.對稱型NAT
對稱型NAT(Symmetric NAT)會將客戶機地址{X:y}轉換成公網地址{A:b}并綁定為{X:y}|{A:b}<->{P:q}。對稱型NAT只接受來自{P:q}的連接,將它轉給{X:y} ,每次客戶機請求一個不同的公網地址和端口,NAT會新分配一個端口號{C,d} 。如下圖所示:
RFC3581——對稱型NAT
其中完全最上層的完全圓錐形NAT的穿透性最好,而最下層的對稱形NAT的安全性最高。
3.如何穿透NAT?
事實上兩個客戶端相互通信還需要一個輔助服務器(p2pserver) 來保存兩個用戶的外網地址端口。
當用戶A連接B時、或者B連接A時, 會向輔助服務器詢問對方的外網地址和端口
NAT穿透組合情況.png
從上面的NAT類型中可以看出,有4種NAT,一共10種組合
1. 完全圓錐型NAT和完全圓錐型NAT
這種最簡單, 只需要B從輔助服務器拿到A的內外網信息, 就可以和A進行連接
2. 完全圓錐型NAT和地址限制型NAT
同上
3. 完全圓錐型NAT和端口限制性NAT
同上
4. 完全圓錐型NAT和對稱型NAT
同上
5.地址限制型NAT和地址限制型NAT
- 當B從輔助服務器拿到A的內外網信息, B向A發送連接, 這個時候NAT A設備會丟棄掉B發送過來的連接。
- 這個時候B就向輔助服務器發送請求,讓A連接B一次, 連完后B就可以連接到A了,NAT A不再攔截B過來的連接。
6.地址限制型NAT和端口限制型NAT
同上
7.地址限制性NAT和對稱型NAT
同上
8.端口限制型NAT和端口限制型NAT
同上
9.端口限制型NAT和對稱型NAT
這種無法穿透, 因為A需要連過B,B才能連到A,但是A無法連接到B,因為B的是對稱型NAT,端口一直在變
10.對稱型NAT和對稱型NAT
這種也無法穿透,因為客戶機每次請求一個不同的公網地址和端口, NAT會新分配一個端口號,所以從輔助服務器拿到的端口號是無效的(只是針對和服務器相連的端口號)。
eg:A和輔助服務器相連,NAT A會分配一個端口 8081。
A和B相連, NAT A會分配一個端口號10020,所以B連A并不知道A需要從10020進,所以無法穿透過NAT A。不過也有人通過端口預測算法成功連接, 但是這種并不可靠。
4.為什么需要保活鏈路?
因為一個連接經過NAT設備之后,在NAT設備上面綁定的端口是有時效性的,一般是30分鐘,但是最少的三五分鐘就失效了,所以要不停的發送心跳包來保活NAT上的這個“洞”。
5.移動、聯通網絡為什么沒有電信快?
原因是電信撥號之后分配的是公網IP。而聯通、移動撥號之后還是內網IP,也就是NAT設備上面還有多層NAT, 多次轉發并且最終的出口只有一個,所以總體來說比較慢