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