一.UDP局域網通訊。安全
這個比較簡單,關於局域網中的2臺或者更多的計算機之間的UDP通訊,網絡上一大把,直接複製粘貼就可使用,原理也很是簡單。因此,本文不作詳細介紹。服務器
二.UDP廣域通訊(包括路由器穿透技術)網絡
廣域網中的通訊就比局域網複雜多了,並且會出現不少狀況,每種狀況的處理方式不一樣,下面一一道來。學習
1. 2臺直接鏈接廣域網中的計算機的UDP通訊:路由
這種狀況是最簡單的一種,由於這2臺計算機直接暴露在廣域網環境下,他們都擁有獨立的外網IP地址。這種狀況咱們能夠直接利用2臺計算機的外網IP和端口創建UDP數據通訊,和局域網很是相似。原理
2. 1臺經過路由器上網的計算機與1臺直接鏈接外網的計算機的UDP通訊(不考慮路由器端口映射的狀況):軟件
這種狀況就和上面的狀況不同了。咱們將經過路由上網的計算機稱做A,將直接鏈接外網的計算機稱做S。要實現A和S的UDP相互通訊,只有一個辦法。就是A主動和S聯繫,也就是說,A先向S發送UDP數據包。必定不能反向,由於S根本不知道A的通訊地址。就算是知道了,S向A發送的數據包也會被A的路由器所攔截,由於在A的路由器看來,S主動發出的UDP數據包是不請自來的,是不安全的,因此會主動摒棄掉。可是,當A主動和S聯繫後,A的路由器就會記錄下S的地址,咱們能夠理解爲一個通行證,這個時候S在向A發數據的時候,S已經擁有了通向A的通行證,因此,路由器會友好的將這個數據包傳遞到A。從而,咱們就創建起了A到S的通訊。同理,咱們能夠推出N臺經過路由器上網的計算機和一臺直接鏈接外網的計算機間的UDP通訊。而這個時候,咱們S就充當起了服務器的做用,用於和每臺其餘客戶機的鏈接並傳遞數據,如今咱們所用的大多數廣域網的通訊軟件,都是採用服務器轉發的機制來實現計算機間的通訊。路由器
3. 2臺都經過路由器上網的計算機之間的UDP通訊:請求
這種狀況就變得很是複雜了,若是要實現2臺經過路由器上網的計算機間的UDP通訊,咱們必需要在他們直接搭建一個橋樑,這個橋樑就是直接鏈接外網的S(服務器)。雖然這種方式不推薦,可是抱着研究學習的態度,我仍是研究了下。可能在現實的項目中根本用不到這種方式,由於咱們徹底能夠經過服務器轉發的方式來完成全部計算機(不論是內網仍是外網)的相互通訊。im
下面開始本篇文章的重點,2臺內網計算機(經過路由器等設備上網的計算機)的UDP穿透。首先,咱們把這2臺計算機稱爲C和D。若是C或者D直接向對方發送UDP數據包,即使是他們已經知道對方經過路由器轉換後的外網IP和端口,他們也不會收到來自對方的任何數據包,緣由在第二種狀況中已經說明,他們的路由器都會認爲對方的數據包是不請自來的,不安全,都會一一摒棄掉。這個時間,咱們就須要服務器S了,他要在他們二者中充當介紹人的身份。
經過第二種方式,咱們已經知道了內網計算機怎樣和外網計算機之間創建UDP通訊,因此,咱們的C和D均可以分別和S創建UDP通訊,他們與S的通道是能夠一一打通的。這個時候,咱們的S端,已經有了C和D經過路由器轉換後的外網通訊IP和端口,而且保存下來,在接下來的步驟中有重要做用。這個時候,①C向S發出請求,告知C想和D通訊而且請求D的外網IP和端口。②S端口收到C的請求後,向C發送有關D外網地址的數據包。③C收到有關D的通訊地址數據包後,很是重要的一步來了,C立刻向D的通訊地址發出一個UDP數據包,能夠是任何內容,由於這個數據包D根本不會收到。但之因此要這樣作的緣由是讓C的路由器記錄下D的通訊地址,也就是說,讓D在C的路由器處得到通往C的通行證。④這個時候,C立刻向S發送數據包,讓S告訴D,C已經容許D經過了,⑤而且向D發送C的外網IP和端口。⑥當D收到S發出的這個數據包後,D立刻向獲取的C的地址發送一個UDP請求包,這個時候,C是會收到的。當D向C發出數據包後,D的路由器也記錄下了C的通訊地址,因此,C也有了向D發送數據的通行證。當C接收到D的數據包後,C再向D回一個UDP應答包,這個時候,他們2者的UDP通訊已經創建了,咱們也就大功告成了。下面是整個通訊的流程圖: