淺析TCP協議與UDP協議

TCP(Transmission Control Protocol,全稱傳輸控制協議。工做在TCP/IP協議棧中的傳輸層,爲主機層對主機層的鏈接提供了可靠的連接服務。此協議經過三個步驟使客戶機與服務器創建一個鏈接,並經過四個步驟關閉此鏈接,這個過程咱們分別稱之爲三次握手和四次揮手。服務器

UDP((User Datagram Protocol,全稱用戶數據報協議。一樣工做在傳輸層,是一種非面向鏈接的協議,由於其無恢復數據功能,因此是一種不可靠的網絡訪問。但由於發送數據時無需向TCP同樣反覆創建鏈接,因此內存佔用率小,傳輸性能高。網絡

一:何爲TCP/IP協議棧?
ide

1.名詞解釋性能

TCP(Transmission Control Protocol 傳輸控制協議)/IP(Internet Protocol  因特網互聯協議)棧,是以TCP和IP協議爲重要表明的多個協議的集合,該集合中還包括UDP、ICMP、RIP、TELNET、 FTP、SMTP、ARP等許多協議。spa

2.歷史:blog

最先發源於美國國防部(縮寫爲DoD)的 因特網的前身ARPA網項目,1983年1月1 日,TCP/IP取代了舊的網絡控制協議NCP,成爲今天的互聯網和局域網的基石和標準,由互聯網工程任務組負責維護。內存

3.TCP/IP協議棧結構:get

咱們知道,早期的OSI參考模型將網絡分爲七層,而TCP/IP模型將網絡分爲了五層,以下圖:同步

wKiom1mqGErD5UTHAAIM21JuTwY273.png-wh_50

             圖一 : TCP/IP與OSI參考模型對比圖(點擊查看高清大圖)it

二:深刻理解TCP協議的三次握手和四次揮手

首先讓咱們瞭解TCP首部組成結構,以下圖:

wKioL1mqTMvxI4JPAAFy5aWl-DM010.png-wh_50

                           圖二 :  TCP首部結構 (點擊查看高清大圖)

(1)源端口和目標端口:

通常狀況下,源端口爲客戶端,目標端口爲服務器端。由圖二可知源端口和目標端口各佔16位,也就是2^16-1=65535,因此客戶端理論上來講能夠打開65535個程序來訪問服務器端。其中客戶機端口號隨機生成,而服務器端口固定不變。能夠經過 cat /etc/service 配合grep查看常見服務所用端口號。

(2)序號(seq):

表示本報文段所發送數據的第一個字節的編號。在TCP鏈接中所傳送的字節流的每個字節都會按順序編號。因爲序列號由32位 表示,因此每2^32個字節,就會出現序列號迴繞,再次從 0 開始

(3)確認號(ack  acknowledgement character):

表示接收方指望收到發送方下一個報文段的第一個字節數據的編號

                              總的來講,seq和ack都是數據包的序號。

(4)重要標記位:

從圖二咱們能夠看出,標記位共有六個,每個只佔一位,因此標記位取值只有0 、1種狀況。


URG: 是否包含緊急數據(urgent)

PSH: 傳送(push)

RST:釋放鏈接並重置(reset)

ACK:表示前面的確認號字段(ack)是否有效。鏈接創建後,ACK=1。

SYN:在創建鏈接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求創建鏈接的報文段;當SYN=1,ACK=1時,表示對方贊成創建鏈接。SYN=1 ,說明這是一個請求創建鏈接或贊成創建鏈接的報文。只有在前兩次握手中SYN才置爲1帶SYN標誌的TCP報文段稱爲同步報文段

FIN:表示通知對方本端要關閉鏈接了,標記數據是否發送完畢。若是FIN=1,即 告訴對方:「個人數據已經發送完畢,你能夠釋放鏈接了」,帶FIN標誌的TCP報 文段稱爲結束報文段


好,瞭解完TCP首部結構中經常使用知識點後,讓咱們以客戶端的三次握手和四次揮手爲例,來具體瞭解創建鏈接和斷開鏈接的具體過程。

創建鏈接(三次握手)

wKiom1mqYijhY5plAAXBUPsMlek767.png

                                                                    圖三:三次握手(點擊查看高清大圖)          

第一步:處於close狀態的客戶端A主動打開,並對服務器B說:「我向你發送了序號爲x的包(seq=x),請求創建鏈接(SYN=1),over」,並轉爲同步已發送狀態SYN-SENT),等待B確認。


第二步:服務器B每隔一段時間就會轉爲偵聽LISTEN)狀態,這時B收到來自A的請求,因而他向客戶端A說:「我贊成創建鏈接(SYN=1),而且確認已經收到了你的包(ACK=1),並向你發送了y包(seq=y),請求你繼續給我發你下一個包(ack=x+1)「,並轉爲同步收到(SYN-RCVD)狀態。


第三步:到此,AB都第一次收到了對方的包,第一次同步所有完成。

A收到B包後對B說:「我知確認你的請求了(ACK=1),並繼續向你發送序號爲X+1的包(seq=x+1),請求你繼續向我發送你下一個包吧(ack=y+1)。」並轉爲已創建鏈接(ESTABLISHED)狀態。B在收到A的包後,也轉爲已創建鏈接(ESTABLISHED狀態。


  至此,AB都進入了ESTABLISHED(已創建鏈接)狀態。三次握手已所有完成,AB雙方將進入數據傳送狀態。

斷開鏈接(四次揮手)

wKioL1mqgzujanaFAAhnZaQ19Co206.png-wh_50

                           圖四:四次揮手(點擊查看高清大圖)

第一步: 客戶機A對服務器B說:」我要和你斷開鏈接(FIN=1)「。與此同時,向B發送了一個序號爲u的包,並將狀態由創建鏈接狀態(ESTABLISHED)轉換爲終止等待1(FIN-WAIT-1)狀態


第二步: B收到A的包時,得知A要與本身單方面分手,因而先通知應用程序關閉,接着對A說:」我已經收到你的分手請求了(ACK=1),但並不表明我贊成分手,請你向我發送你的下一個包(ack=u+1)「,並向A發送序號爲v的包。並被迫將狀態轉爲閉等待狀態(CLOSE-WAIT)


第三步: 因爲B可能還有一些屬於A殘留數據沒有發送給A,因此,B還會發數據給A,這中間A將處於終止等待2狀態(FIN-WAIT-2),直到B發完。當財產分割完成之後,B對A說:」好啦,我已經接收到了你的分手請求包(ACK=1),屬於你的數據我也都還給你了,我贊成和你分手(FIN=1),你能夠給我發你下一個包啦(ack=u+1)「,並向A發送第w個包。而且轉爲最後確認狀態( LAST-ACK)


第四步:A收到B的w包,並對B說:」我已經收到了你的分手確認(ACK=1),請你給我個回覆(ack=w+1),「,並向B發送序號爲u+1的包。

從圖四中咱們能夠看出,當服務器B收到u+1這個包時,就當即轉換爲closed狀態了;而A卻沒有當即轉爲closed狀態,而是轉爲了時間等待狀態(TIME-WAIT),這個等待時間爲2倍的MSL(最長數據傳輸時間)。因此客戶端A留出了足夠時間來接受來自B的殘留數據。

當服務器將屬於A的殘留數據所有歸還後,客戶端A最終轉換爲closed關閉狀態,四次揮手結束,鏈接關閉成功。

相關文章
相關標籤/搜索