
作者: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),視頻、語言等方面。
