TCP/IP的開腸破肚(4)

 這一節我們來談談運輸層


   運輸層的任務主要是負責主機中兩個進程之間的通信。


    運輸層的功能主要有:

(1)複用與分用

(2)差錯控制(完整性控制)

(3)可靠傳輸(按序交付,無丟失,不重複)

  (4)擁塞控制(收發雙方的協調一致)


流量控制(全局上的通信流量調節)


網絡層與運輸層的區別:

(1)運輸層爲應用進程之間提供端到端的邏輯通信。

(2)網絡層爲主機之間提供端到端的物理通信

(3)運輸層對收到的報文進行差錯檢測,包括首部和數據部分。

(4)網絡層IP數據報首部中的檢驗和字段,只檢驗首部是否出現差錯而不檢驗數據部分。

(5)運輸層有兩種不同的運輸協議,即面向鏈接的TCP(傳輸控制協議)和無連接的UDP(用戶數據報協議)。

(6) 網絡層無法同時實現這兩種協議。

 

分用(Demultiplexing):即將運輸層的報文段中的數據交付到正確的套接字的工作。


複用(Multiplexing):是在源主機的不同套接字中收集數據塊,併爲每個數據塊封裝上首部信息(將在分用的時候使用),從而生成報文段/數據報,然後將報文段/數據報傳遞到網絡層工作。


端口:爲了進行分用和複用,需要給應用層的每個進程賦予一個非常明確的標誌,在協議層就採用了協議端口號,簡稱端口。

UDP和TCP都使用了與應用層接口處的端口與上層的應用進程進行通信。端口也就是運輸層的服務訪問點(TSAP),其作用就是讓應用層的各種應用進程都能將其數據通過端口交付給運輸層,以及讓運輸層知道將其報文中的數據向上通過端口交付給應用層相應的進程。


UDP協議:

UDP是一種無連接的, 即發送數據前不需要建立連接,因此減小的開銷和發送數據的延遲。

UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連接狀態表。

UDP是面向報文的,

UDP沒有擁塞控制,因此網絡出現的擁塞不會使主機的發送率降低。

UDP支持一對一,一對多,多對一和多對多的交互通信。

UDP首部開銷小,只有8字節,比TCP的20個字節的首部要短。


TCP協議:

TCP提供了一種可靠的面向連接的字節流運輸層服務。

TCP將用戶數據打包成報文段,它發送後啓動一個定時器,另一端收到的數據進行確認,對失序的數據重新排序,丟棄重複數據,TCP提供端到端的流量控制,並計算和驗證一個強制性的端到端的檢驗和。

許多流行的應用程序如:Telnet,Rlogin, FTP,SMTP 都使用TCP。


TCP的一些主要特點:

TCP是面向連接的運輸層協議

每一條TCP連接只能有兩個端點,每一條TCP連接只能是點對點的

TCP提供可靠交付的服務

TCP提供全雙工通信

面向字節流的。


面向字節流的含義:雖然應用程序和TCP交互是一次一個數據塊,但TCP把應用程序交下來的數據僅僅是一連串的無結構的字節流


TCP是面向連接的,無論哪一方向另一方發送數據之前,都必須先在雙方之間建立一條連接。在TCP/IP協議中,TCP協議提供可靠的連接服務,連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方的序列號和確認號並交換 TCP窗口大小信息。這就是面試中經常會被問到的TCP三次握手。只是瞭解TCP三次握手的概念,對你獲得一份工作是沒有任何幫助的,你需要去了解TCP三次握手中的一些細節。



1.    第一次握手:建立連接。客戶端發送連接請求報文段,將SYN位置爲1,Sequence Number爲x;然後,客戶端進入SYN_SEND狀態,等待服務器的確認;


2.    第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設置Acknowledgment Number爲x+1(Sequence Number+1);同時,自己自己還要發送SYN請求信息,將SYN位置爲1,Sequence Number爲y;服務器端將上述所有信息放到一個報文段(即SYN+ACK報文段)中,一併發送給客戶端,此時服務器進入SYN_RECV狀態;


3.    第三次握手:客戶端收到服務器的SYN+ACK報文段。然後將Acknowledgment Number設置爲y+1,向服務器發送ACK報文段,這個報文段發送完畢以後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。

完成了三次握手,客戶端和服務器端就可以開始傳送數據

 

當客戶端和服務器通過三次握手建立了TCP連接以後,當數據傳送完畢,就要要斷開TCP連接的了。那對於TCP的斷開連接,這裏就有了神祕的“四次分手”。


1.第一次分手:主機1(可以使客戶端,也可以是服務器端),設置Sequence Number和Acknowledgment Number,向主機2發送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有數據要發送給主機2了;


2.第二次分手:主機2收到了主機1發送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number爲Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我“同意”你的關閉請求;


3.第三次分手:主機2向主機1發送FIN報文段,請求關閉連接,同時主機2進入LAST_ACK狀態;


4.第四次分手:主機1收到主機2發送的FIN報文段,向主機2發送ACK報文段,然後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以後,就關閉連接;此時,主機1等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,主機1也可以關閉連接了。


至此,TCP的四次分手就這麼愉快的完成了。這就是著名的三次握手,四次分手。


那麼爲什麼需要三次握手呢?


(1)爲了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。

(2)“已失效的連接請求報文段”的產生在這樣一種情況下:client發出的第一個連接請求報文段並沒有丟失,而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以後的某個時間纔到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段後,就誤認爲是client再次發出的一個新的連接請求。於是就向client發出確認報文段,同意建立連接。假設不採用“三次握手”,那麼只要server發出確認,新的連接就建立了。由於現在client並沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送數據。但server卻以爲新的運輸連接已經建立,並一直等待client發來數據。這樣,server的很多資源就白白浪費掉了。採用“三次握手”的辦法可以防止上述現象發生。例如剛纔那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連接。”

(3)主要的原因是:爲了防止服務器端的一直等待而浪費資源。

 

那麼又是爲什麼要採用四次分手呢?


TCP協議是一種面向連接的、可靠的、基於字節流的運輸層通信協議。TCP是全雙工模式,這就意味着,當主機1發出FIN報文段時,只是表示主機1已經沒有數據要發送了,主機1告訴主機2,它的數據已經全部發送完畢了;但是,這個時候主機1還是可以接受來自主機2的數據;當主機2返回ACK報文段時,表示它已經知道主機1沒有數據發送了,但是主機2還是可以發送數據到主機1的;當主機2也發送了FIN報文段時,這個時候就表示主機2也沒有數據要發送了,就會告訴主機1,我也沒有數據要發送了,之後彼此就會愉快的中斷這次TCP連接。如果要正確的理解四次分手的原理,就需要了解四次分手過程中的狀態變化。


FIN_WAIT_1: 這個狀態要好好解釋一下,其實FIN_WAIT_1和FIN_WAIT_2狀態的真正含義都是表示等待對方的FIN報文。而這兩種狀態的區別是:FIN_WAIT_1狀態實際上是當SOCKET在ESTABLISHED狀態時,它想主動關閉連接,向對方發送了FIN報文,此時該SOCKET即進入到FIN_WAIT_1狀態。而當對方迴應ACK報文後,則進入到FIN_WAIT_2狀態,當然在實際的正常情況下,無論對方何種情況下,都應該馬上回應ACK報文,所以FIN_WAIT_1狀態一般是比較難見到的,而FIN_WAIT_2狀態還有時常常可以用netstat看到。(主動方)


FIN_WAIT_2:上面已經詳細解釋了這種狀態,實際上FIN_WAIT_2狀態下的SOCKET,表示半連接,也即有一方要求close連接,但另外還告訴對方,我暫時還有點數據需要傳送給你(ACK信息),稍後再關閉連接。(主動方)


CLOSE_WAIT:這種狀態的含義其實是表示在等待關閉。怎麼理解呢?當對方close一個SOCKET後發送FIN報文給自己,你係統毫無疑問地會迴應一個ACK報文給對方,此時則進入到CLOSE_WAIT狀態。接下來呢,實際上你真正需要考慮的事情是察看你是否還有數據發送給對方,如果沒有的話,那麼你也就可以 close這個SOCKET,發送FIN報文給對方,也即關閉連接。所以你在CLOSE_WAIT狀態下,需要完成的事情是等待你去關閉連接。(被動方)


LAST_ACK: 這個狀態還是比較容易好理解的,它是被動關閉一方在發送FIN報文後,最後等待對方的ACK報文。當收到ACK報文後,也即可以進入到CLOSED可用狀態了。(被動方)


TIME_WAIT: 表示收到了對方的FIN報文,併發送出了ACK報文,就等2MSL後即可回到CLOSED可用狀態了。如果FINWAIT1狀態下,收到了對方同時帶FIN標誌和ACK標誌的報文時,可以直接進入到TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態。(主動方)


CLOSED: 表示連接中斷。


這就是爲什麼會採用四次握手啦

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章