vpn原理及實現--tcp還是udp
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
有了ip over ssl的關鍵思想,openvpn就是一個必然結果了,於是就不多說了,openvpn和openssl並不在一個層次上,雖然都很open。openvpn的配置非常複雜,主要就是為了建立更加合理的隧道,雖然ipsec實現的vpn不區分客戶端和伺服器,建立sa的時候全靠dh對稱的協商加密金鑰和演算法,但是基於openssl的openvpn卻區分二者,因為openvpn的安全是ssl實現的,而ssl區分客戶端和伺服器,虛擬網絡卡已經說的很多了,現在說說隧道的一些細節,openvpn可以建立tcp隧道和udp隧道,tcp隧道顧名思義就是用tcp來封裝vpn資料流,udp亦然,但是雖然可以使用udp封裝,在openvpn中你卻不需要擔心資料失序,因為udp之上還有ssl,而ssl不允許資料失序,確切的說不應說是ssl,基於udp的ssl實際上是tls,ssl資料由於並不是流式的,而是基於記錄的,每次必然讀取一條記錄,因此ssl是儲存接收和儲存傳送的,如果下面用udp傳輸,那麼就可能出現丟包或者失序的情況,如此一來讀取的記錄就會不正確,在ssl解密特別是cbc方式解密時就會出錯,所以ssl下面必然是可靠而按序的,即使用udp,那麼在ssl和udp之間也必須實現可靠和按序。那麼到底tcp隧道和udp隧道如何選擇呢?我們看一個組合,拋開tcp/udp之外的協議不談,一共有四種隧道,分別是tcp in tcp,udp in tcp,tcp in udp,udp in udp,第一種和最後一種問題最大,先說第一種,由於tcp是有連線的,如果出現丟包的話,那麼不管是隧道還是真實收發方都要重傳資料,雙方重傳的資料實際上是為了一個目的一份資料,vpn路由器僅僅提供封裝服務,並不需要為丟包負責,因此收發方負責即可,然而tcp的語義卻管不了這麼複雜的策略,它只有讓二者均重傳資料包,如此一來網路一旦丟包,那麼緊接著會出現大量的重傳,udp in udp的情況正好相反,本來udp就會丟包而且丟後不管,udp式的隧道加重了這個問題,本來不用隧道的網路平均丟包x個,用了隧道就可能丟包n*x個,也不可取,那麼就剩下餘下的udp in tcp,tcp in udp了,其實需要考慮是不是in前面的協議,而是後面的,因為後面的更底層,我們必須要選出一個協議來建立隧道而不是強迫使用者使用某一種協議,那麼到底是tcp好還是udp好呢?這似乎又是一個需要權衡的問題,個人認為udp要好些,如果使用者使用tcp,那麼使用者自己就能處理重傳和失序問題,不勞vpn代勞,如果使用者使用udp,那麼說明他不在乎丟包和失序,vpn更不需要多此一舉用tcp保證不丟包和按序,畫蛇添足反而抵消了使用者選擇udp的原因。如果用tcp建立隧道的話,使用者使用tcp時會導致重傳風暴,而使用者使用udp時效率會明顯降低。但是使用udp的話會有一個問題,那就是如果vpn兩端之一斷開了連線,由於udp在斷開時不管是正常斷開還是異常崩潰都不會向另一端傳送通知,那麼連線雙方的連線感知必須通過一個心跳來完成,在openvpn中可以通過--ping和--ping-restart來配置,如果心跳時間過短,雖然感知力增加了,但是心跳風暴不說,在端點物理間距很長時,有時的網路擁塞會被認為是斷開了連線,造成誤判。這又是一個值得權衡的事情。