1. 程式人生 > >關於前端那些事 :二、幾個重要協議TCP/IP和UDP(每天進步一點點)

關於前端那些事 :二、幾個重要協議TCP/IP和UDP(每天進步一點點)

1.什麼是TCP/IP協議

要想了解什麼是TCP/IP協議,就要知道為什麼有這個協議。中國人和中國人說話,要遵循漢語的的語法結構,使用漢語的發音。當我們和外國人交流時,就要適用外國的語言了,遵循外國的語法機構和發音。其實這就是一種協議,只不過我們稱之為語言。計算機再這方面體現的更為直觀,兩臺機器之間該如何通訊呢,就需要制定各種各樣的協議了。例如:檔案傳輸適用TCP協議。域名系統適用DNS協議。有了些協議的存在,各種資料流按照規則傳輸,計算機之間得意通訊。

TCP/IP協議是一個協議集合。大家叫的時候方便說,所以統稱為TCP/IP。TCP/IP協議族中有一個重要的概念是分層,TCP/IP協議按照層次分為以下四層。應用層、傳輸層、網路層、資料鏈路層。為什麼要分層?這就如同鄧小平1978年的大包乾,責任到人。一個層只負責一個層次的問題,如果出問題了,和其他的層次無關,只要維護這個層次也就好了。其實程式語言裡也能體現這個分層理論,即封轉性、隔離。這裡不再延伸細談。

在上一篇文章中說到了OSI七層模型,在這裡TCP/IP也分層了。對照上一篇文章的圖:這裡寫圖片描述

由此可見,只不過是劃分的方式不同而已,下面是在網上找的圖(通訊資料流)

這裡寫圖片描述

這裡我們主要看TCP、IP、DNS。。。

二:幾個協議

1.IP協議

IP(Internet protocol),這裡的IP不是值得我們通常所說的192.168.1.1.這個IP指的是一種協議,而後面的數字值得是IP地址。IP協議的作用在於把各種資料包準確無誤的傳遞給對方,其中兩個重要的條件是IP地址,和MAC地址(Media Access Control Address)。由於IP地址是稀有資源,不可能每個人都擁有一個IP地址,所以我們通常的IP地址是路由器給我們生成的IP地址,路由器裡面會記錄我們的MAC地址。而MAC地址是全球唯一的,除去人為因素外不可能重複。舉一個現實生活中的例子,IP地址就如同是我們居住小區的地址,而MAC地址就是我們住的那棟樓那個房間那個人。

2.TCP協議

按層次分,TCP屬於傳輸層,提供可靠的位元組流服務。什麼叫位元組流服務呢?這個名字聽起來讓人不知所以然,下面聽下我通俗的解釋。所謂的位元組流,其實就類似於資訊切割。比如你是一個賣自行車的,你要去送貨。安裝好的自行車,太過龐大,又不穩定,容易損傷。不如直接把自行車拆開來,每個零件上都貼上收貨人的姓名。最後送到後按照把屬於同一個人的自行車再組裝起來,這個拆解、運輸、拼裝的過程其實就是TCP位元組流的過程。

接下來就是響噹噹的TCP三次握手和四次揮手:

首先介紹一下tcp的報文格式:
這裡寫圖片描述

上圖中有幾個欄位需要重點介紹下:
  (1)序號:Seq序號,佔32位,用來標識從TCP源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。
  (2)確認序號:Ack序號,佔32位,只有ACK標誌位為1時,確認序號欄位才有效,Ack=Seq+1。
  (3)標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:
  (A)URG:緊急指標(urgent pointer)有效。
  (B)ACK:確認序號有效。
  (C)PSH:接收方應該儘快將這個報文交給應用層。
  (D)RST:重置連線。
  (E)SYN:發起一個新連線。
  (F)FIN:釋放一個連線。

然後下面這個是tcp三次握手和四次揮手的總圖

這裡寫圖片描述

上圖中

第一次握手:客戶端傳送一個TCP的SYN標誌位置1的包指明客戶打算連線的伺服器的埠,以及初始序號X,儲存在包頭的序列號(Sequence Number)欄位裡。
第二次握手:伺服器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均為1同時,將確認序號(Acknowledgement Number)設定為客戶的ISN加1以.即X+1。
第三次握手:客戶端再次傳送確認包(ACK) SYN標誌位為0,ACK標誌位為1.並且把伺服器發來ACK的序號欄位+1,放在確定欄位中傳送給對方.並且在資料段放寫ISN的+1。
用一張圖解釋就是
這裡寫圖片描述

然後是四次揮手:

第一次揮手:客戶端傳送一個FIN,用來關閉服務端到Server的資料傳送,客戶端進入FIN_WAIT_1狀態。
第二次揮手:服務端 收到FIN後,傳送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號),服務端進入CLOSE_WAIT狀態
第三次揮手:服務端傳送一個FIN,用來關閉Server到Client的資料傳送,服務端進入LAST_ACK狀態。
第四次揮手:客服端收到FIN後,服務端進入TIME_WAIT狀態,接著傳送一個ACK給服務端,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。

這裡有幾個問題:

【問題1】為什麼連線的時候是三次握手,關閉的時候卻是四次握手?
答:因為當Server端收到Client端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四步握手。

【問題2】為什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?
答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網路是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

三、最後說一下UDP

UDP(User Data Protocol,使用者資料報協議)
(1) UDP是一個非連線的協議,傳輸資料之前源端和終端不建立連線,當它想傳送時就簡單地去抓取來自應用程式的資料,並儘可能快地把它扔到網路上。在傳送端,UDP傳送資料的速度僅僅是受應用程式生成資料的速度、計算機的能力和傳輸頻寬的限制;在接收端,UDP把每個訊息段放在佇列中,應用程式每次從佇列中讀一個訊息段。
(2) 由於傳輸資料不建立連線,因此也就不需要維護連線狀態,包括收發狀態等,因此一臺服務機可同時向多個客戶機傳輸相同的訊息。
(3) UDP資訊包的標題很短,只有8個位元組,相對於TCP的20個位元組資訊包的額外開銷很小。
(4) 吞吐量不受擁擠控制演算法的調節,只受應用軟體生成資料的速率、傳輸頻寬、源端和終端主機效能的限制。
(5)UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連結狀態表(這裡面有許多引數)。
(6)UDP是面向報文的。傳送方的UDP對應用程式交下來的報文,在新增首部後就向下交付給IP層。既不拆分,也不合並,而是保留這些報文的邊界,因此,應用程式需要選擇合適的報文大小。

我們經常使用“ping”命令來測試兩臺主機之間TCP/IP通訊是否正常,其實“ping”命令的原理就是向對方主機發送UDP資料包,然後對方主機確認收到資料包,如果資料包是否到達的訊息及時反饋回來,那麼網路就是通的。

最後的最後小結TCP與UDP的區別:

1.基於連線與無連線;
2.對系統資源的要求(TCP較多,UDP少);
3.UDP程式結構較簡單;
4.流模式與資料報模式 ;
5.TCP保證資料正確性,UDP可能丟包,TCP保證資料順序,UDP不保證。