我喜歡用很簡單的話來概括:
natp是內部機器通過路由器也就是網(wǎng)關向外部發(fā)送網(wǎng)絡請求時,路由器記住內部機器的ip和端口,同時跟真正發(fā)送數(shù)據(jù)的外網(wǎng)端口綁定,產生一個臨時映射表,當收到外網(wǎng)數(shù)據(jù)以后通過這個映射表將數(shù)據(jù)轉發(fā)給內部機器。nat的多種映射類型以后再說。
upnp和nat-pmp差不多,就是在路由器和內部機器提供一個中間服務,內部機器請求upnp將其使用到的端口跟某個外網(wǎng)端口綁定,這樣當路由器收到外網(wǎng)請求時先去upnp里查找是否此外網(wǎng)端口已經(jīng)被upnp映射,如果被映射則將數(shù)據(jù)轉發(fā)到內部機器對應的端口。
napt是路由器肯定帶的功能,其產生的nat映射表有多種類型,但都有時效,也就是超過一段時間原來的nat映射就無效,然后新建新的nat映射。nat映射必須先由內部機器向外部網(wǎng)絡發(fā)起請求才會產生。
upnp是把映射關系長期保存下來,外部機器可以主動向內部機器請求網(wǎng)絡連接。 所以首先要路由器開啟upnp功能(一般由用戶去路由器設置里手動開啟upnp),然后內部機器的程序要自己實現(xiàn)upnp客戶端功能:主動查找upnp服務,主動增加映射、刪除映射等。
客戶端無法控制natp的映射,可以主動控制upnp映射。
從我目前對go-ethereum源碼中p2p的研究來看,以太坊只做了upnpt和nat-pmp的端口映射,而且實現(xiàn)是調用了第三方開源庫,但是沒有做NATP udp打洞。
比特幣源碼還沒看,不過應該也沒有做udp打洞穿越NAT.