一.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(服務器)。雖然這種方式不推薦,但是抱着研究學習的態度,我還是研究了下。可能在現實的項目中根本用不到這種方式,因為我們完全可以通過服務器轉發的方式來完成所有計算機(不管是內網還是外網)的相互通信。
下面開始本篇文章的重點,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通信已經建立了,我們也就大功告成了。下面是整個通信的流程圖: