【計網】TCP

1、TCP協議的特點和報文格式

     1.1 特點

          TCP是面向鏈接(虛連接不是真實的物理線路)的傳輸層協議。每一條TCP鏈接都是點對點的全雙工通信。TCP提供可靠交         付的服務,可靠有序、不丟不重。

          發送緩存:已發送但未接收到確認的報文&待發送的報文

          接收緩存:按序到達但未被上層讀取的數據&未按序到達的數據

          TCP將上層的數據看作是連續的一串字節數據流。

          TCP協議將多個字節包裝爲一個數據包,並添加TCP首部發送出去。

     1.2 報文格式

          TCP報文包括數據部分和首部字段兩部分。數據部分就是上層數據的多個字節。

          首部字段格式如下:

          

          網路層通過IP找到主機,那怎麼找到是這臺主機的哪個進程需要這個TCP數據包呢,就是通過端口來區分。因此首部包含了源端口和目的端口。TCP爲每一個數據字節都編了號,首部序號是當前報文中第一個字節的序號。確認號x表示當前需要對方發送的下一個數據包的序號是x,也表示x之前的數據包都收到了。窗口字段表示流量控制使用的字段,表示要求對方將窗口調整爲該字段大小,控制發送方發送速率,實現流量控制,窗口=min{接收窗口,擁塞窗口}。校驗和是對報文數據部分的正確性校驗,從而提供一個保證可靠的手段。

          ACK位是指首部中的確認號是否有效;SYN位是標識當前是請求鏈接建立或者應答請求建立鏈接的數據報文;FIN是標識當前是請求拆除鏈接的報文。

2、TCP鏈接管理

     鏈接管理主要是建立鏈接和拆除鏈接的機制。

     三次握手(建立鏈接)

     

     1)客戶端請求建立鏈接:SYN=1,ACK=0,seq=x,ack=無效;此時無需確認因此ACK等於0,ack無效,請求鏈接SYN=1,seq是發送方隨機的序號初始碼

     2)服務器發送應答:SYN=1,ACK=1,seq=y,ack=x+1;此時需要確認,因此ACK=1,ack=已接受序號+1

     3)第三次握手:SYN=0,ACK=1,seq=x+1,ack=y+1;

     爲什麼是三次握手,不是兩次或者四次?首先四次沒必要,三次已經滿足要求,繼續增加徒增時延。不是兩次是因爲,如果沒有第三次握手,服務端發出確認就開始監聽客戶端數據,對服務端可能造成資源浪費,因爲連接建立請求可能是在網絡中滯留很久的數據包,已經無效了,再爲其監聽等待客戶端數據無意義。

     四次揮手(拆除鏈接)

     

     1)TCP鏈接全雙工通信,一方請求拆除鏈接只是拆除單方向的鏈接,另一方向的鏈路還可以繼續發送數據。

     2)爲什麼要有等待2MSL的過程?因爲服務端發送了FIN後,客戶端爲其發送應答,如果此應答丟包了,那麼服務端一直處於半關閉狀態,等待2MSL,期間服務端可能重發FIN,那麼客戶端可以接收到併發送響應。MSL是單向數據包傳輸最大時間,因此2MSL剛好是發送出去應答(最大MSL),對方沒收到再此發送FIN(最大MSL)的時間和。這裏有個疑問,如果2MSL期間,服務器端重發的FIN丟失了,直到2MSL結束客戶端都沒有再收到,但是服務端也沒有收到響應一直重發FIN?此時客戶端會直接關閉嗎,那麼這樣服務器端豈不是存在半關閉狀態的鏈接?

3、可靠傳輸

     保證可靠傳輸的機制是:校驗、序號、確認、重傳(包括快重傳)

     校驗就如上首部字段介紹的。序號是爲上層數據的每個字節標一個序號,數據包的序號是包範圍字節的首字節序號。確認是首部字段ACK和ack,ack的值x表示x之前的都收到了,就算是亂序收到了後面的,也會應答第一個沒收到的序號。發送方在超過收到確認的時間後會重傳,而如果連續收到三個冗餘的確認,則不等時間到立即快速重傳。

4、流量控制

     流量控制與擁塞控制都是控制發送方的發送速率,但是其目的是不同的。流量控制關注的局部,是點對點的雙方通信過程中,接收方接收速率跟不上發送方的發送速率,因此需要通過控制發送方速度。擁塞控制關注的是全局,是整個網絡已經達到瓶頸,必須減少各個發送方的發送速度,從而避免網絡阻塞。

     流量控制的手段就是通過在接收方發送應答的中攜帶接收窗口值,來實現對發送方窗口的控制。

     當然發送方窗口還受到擁塞窗口的影響,發送窗口=min{接收窗口,擁塞窗口}

5、擁塞控制

     擁塞控制是避免整個網絡擁塞,需要控制發送到網絡的所有發送方的速度。擁塞控制不像流量控制那樣是點對點的,因此無法實現一方直接發送窗口大小約束來實現控制,只能通過控制算法由發送方主動實現窗口大小的調整。分別是慢開始、擁塞避免算法和快重傳、快恢復算法。

     1)慢開始、擁塞避免

     一開始擁塞窗口大小是1,然後呈指數增長,每次*2,直到到達擁塞避免閾值(初始16),開始以擁塞避免的加法增加(每次加1),直到出現網路擁塞,然後掉回慢開始初始窗口1,並調整擁塞避免閾值爲出現網絡擁塞是窗口大小的一半。重複慢開始過程。。。。。。

     2)快重傳、快恢復

     不同於慢開始擁塞避免,快重傳、快恢復算法中一旦遇到網絡擁塞,不是掉回1,而是調回新的擁塞避免閾值,新的閾值爲擁塞出現時窗口的一半大小。然後繼續加法增大。這個過程避免了掉回1再經過慢開始的過程,使得發送方遇到網絡阻塞時快速恢復發送速度,而不是從1開始慢慢恢復。適合突發網路阻塞,整體網絡狀態比較好的情況。