傳輸層的TCP和UDP協議
作者:HerryLo
原文永久連結: https://github.com/AttemptWeb...
TCP/IP協議, 你一定常常聽到,其中TCP(Transmission Control Protocol)稱為 傳輸控制協議,IP(Internet Protocol) 稱為網際協議。
事實上TCP/IP協議,是一個協議族,是一個協議的集合。
TCP/IP協議,定義了一整套規則。它定義整個網際網路如何連線,如何通訊,如何協商的最基礎規則。
TCP/IP協議分為五層,分別是應用層、傳輸層、網路層、資料鏈路層、物理層。每層都有對應的相關協議,其中TCP和UDP是傳輸層的兩個協議。
理解TCP和UDP
既然他們是傳輸層的協議,那麼他們的作用當然就是用來負責傳輸資料了。
我們想象一個場景,網路中隨意的兩端要通訊,會採取什麼傳輸方式呢?
可以先想象一下人類之間的通訊。
第一種是打電。我撥通電話你的電話,直到你回答“你好”,我聽到聲音之後,我們之間才繼續進行交談。
另一個是發簡訊。我給你的手機號傳送一條簡訊,無法知道你是否收到,然後我就只能等待你的回覆了。
其中第一種方式對應TCP,而第二種對應UDP。TCP是需要對方確認的,也就是傳輸之前需要進行三次握手(傳輸的兩端需要經過三次握手,才開始通訊)。UDP著比較粗暴,不論對方什麼情況,直接傳送,不需要確認過程。
而上圖中的看到的,TCP是可靠的,UDP是不可靠的,就是這個意思。
可靠的連線帶來的是效率的下降。比如一次網路請求,很大一部分時間其實都是浪費在互相確認的過程當中,資源消耗比較多,保證了資料傳輸是可靠的,而且傳輸資料是有序的。不可靠的連線帶來的是效率的提升,但可能服務質量有下降。
要擺脫一種人為的誤區,不要以為UDP不可靠,就沒有應用場景。據說QQ傳送資料就是靠UDP傳送的,儘管是不可靠的連線,可是還是用了非常多的校驗演算法保證了資料質量穩定,同也保證了效率。TCP儘管耗時,可是對於穩定性優先的場景,還是應該有限選用TCP,比方瀏覽器中訪問網頁用的就是TCP。此外在一些長連線系統裡面,比方微信,連線通道應該也是用TCP建立的,由於要維持一條穩定的資訊傳輸通道。
協議是怎麼控制,資料包是怎麼傳輸,怎麼校驗資料的正確性,還有重傳特性。這些都是協議中重要的控制過程,在這裡不做詳解,因為對於實際的產品並沒有太大的用。至於如何選定傳輸資料方式,應該依據場景而定。
安全的東西往往不快,反之亦然。而TCP和UCD之間也是這樣:
TCP(傳輸控制協議)
TCP(傳輸控制協議)是基於連線的。在正式收發資料之前,必須要與對方建立連線。這之間需要經過'三次握手':
第一步. 首先A主機需要和B主機之間建立資料收發,A需要傳送一個請求詢問B:'我要建立連線';
第二步. B收到訊息後,會給A傳送一個迴應:'可以連線';
第三步. A收到B的迴應後,A向B再次迴應:'我要開始傳送了',他們之間就可以建立連線了;
第一次握手的結論是:A的傳送能力、B的接收能力正常。
第二次握手的結論是:B的傳送能力、A的接收能力正常。
第三次握手的結論是:A的接收、傳送能力,B的接收、傳送能力都是正常的。
'3次握手'的作用就是 雙方都能明確自己和對方的收、發能力是正常的.
UDP(使用者資料報協議)
UDP(使用者資料報協議)是面向非連線的,不與對方建立連線,而直接把資料報=包傳送出去。UDP適用於一次傳輸少量的資料,對於可靠性要求不高的應用環境。日常生活中使用的ping命令測試主機是否通訊正常,事實上'ping'命令的原理就是向對方主機發送UDP資料包,然後對方主機確認收到資料包,假設資料包是否到達的訊息及時反饋回來了,那麼網路傳輸就是正常的。
適用場景
TCP:是全雙工、面向連線、可靠的,而且精確控制的協議。主要用於實時性不強,但傳輸要求高的應用。比方說:網頁瀏覽、檔案下載(不是BT、電腦下載)、郵件的傳送等場合,這些場景需要TCP協議進行傳輸。當然,它在網路方面的開銷是昂貴的。
UDP:這是一個不可靠的傳輸協議。由於它不排序所要傳送的資料段,不負責這些資料段到達目標的順序(說一它才不可靠)。它在網路的開銷要比TCP小很多,因此UDP適合用在那些實時性強、允許出錯的場合。比如說:即時通訊(MSN、QQ),視訊、語言等方面。
ps: 順便推一下自己的個人公眾號:Yopai,有興趣的可以關注,每週不定期更新,分享可以增加世界的