運輸層(三)TCP協議

前言:

來源於《計算機網絡自頂向下方法》,終於來到了TCP協議,TCP協議也是面試中問的最多的知識點之一了。

面向連接的運輸:tcp

  • tcp被稱爲是面向連接的。這是因爲一個應用進程可以開始向另一個應用進程發送數據之前,這兩個進程必須先相互握手。即他們必須相互發送某些預備報文,以建立確保數據傳輸的參數。作爲tcp連接建立的一部分。連接雙方都將初始化與tcp連接相關的許多tcp狀態變量。
  • tcp連接是面向字節流的。TCP是有緩衝區,TCP發送報文時,是將應用層數據寫入TCP緩衝區中,然後由TCP協議來控制發送這裏面的數據,tcp可以從發送緩存中取出並放入報文段的數據數量受限於最大報文段長度(MMS)。MMS通常由本地發送主機發送的最大鏈路層幀長度,即所謂的最大傳輸單元MTU。設置該mms要保證一個tcp報文段加上tcp/ip首部長度將適合單個鏈路層幀。(因爲ip層是不可靠的,這樣子丟包的話也是一整個tcp包丟掉,而不是丟掉tcp包的一部分。方便後面的檢測並且重傳。) MMS是指在報文段裏應用層數據的最大長度。不包含首部的tcp報文長度。
  • tcp提供可靠交付的服務。通過TCP連接傳送的數據,無差錯、不丟失、不重複、 並且按序到達
  • tcp連接提供的是雙工服務,應用層的數據可以從進程a流入進程b,也可以從進程b流入進程a
  • tcp連接是點對點的。即單個發送方與單個連接方之間的連接。
    面向報文(UDP)和麪向字節流(TCP)的區別

tpc協議的運作圖

在這裏插入圖片描述

tcp的報文結構在這裏插入圖片描述

由於書上的圖拍出來不夠清晰,這裏找了張網圖。
TCP報文段由首部字段和一個數據字段組成。數據字段包含一塊應用數據。如上部分介紹tcp是面向字節流的協議,MSS限制了報文段數據字段的最大長度,當tcp發送一個大文件的時候,tcp通常是將該文件劃分爲長度mss的若干款,然後傳輸。

TCP報文段首部字段:
  • 源端口號和目的端口號:與udp一樣,被用於多路複用以及多路分解
  • 檢驗和字段:提供了差錯檢測功能
  • 32bit的序號字段(sequence window field----seq)和32bit的確認號字段(acknowledgement number field—ack)。這些字段被tcp發送方和接收方用於實現可靠數據傳輸服務,三次四次握手。
  • 16bit的接收窗口字段:該字段用於流量控制,
  • 4bit的首部長度字段:該字段指示了以32bit的字爲單位的tcp首部長度。由於tcp選項字段的原因,tcp首部的長度是可變的,通常,選項字段爲空,所以一般tcp首部的典型長度爲20bit(接收窗口+首部長度)
  • 可選和變長的選項字段:該字段用於發送方與接收方協商最大報文段MSS時或者在高速網絡環境下用在窗口調節因子時使用
  • 6bit的標誌字段: ACK bit用於確認字段中的值是有效的,即該報文包括一個對已成功接收報文的確定。RST、SYN和FIN用於連接建立和拆除。在明確擁塞通告中使用到了CWR ECE.當PSH被置位時,就指示接收方應立即將數據交給上層。URG用來指示報文段中存在着被髮送端上層實體設置爲緊急的數據,緊急數據的最後一個字節由16bit的緊急數據指針字段指出

序號和確認號

序號

tcp把數據看成是一個無結構、有序的字節流。序號是建立在傳送的字節流之上的,而不是建立在傳送的報文段序列之上的。一個報文段的序號應該是該報文段首字節的字節流編號。
如下圖所示,第一個報文段的序號是0,第二個報文段的序號是1000,第三個報文段的序號就是2000ß
在這裏插入圖片描述

確認號

其實本質就是將接收報文中的序列號加1,即是確認號,用於表明之前傳輸的數據已經接收好了,並且等待下一個字節。
假如傳輸的0-500,500-1000兩個報文段,接收方只收到了500-100的報文段,沒有收到0-500報文段,接收方爲了重新構建,則回傳的確認號則一直是上一個序列號。表明需要0-500的報文段。這也就是累積確認。保證該流中至第一個丟失字節爲止的字節都是完整的。

流量控制

閱讀此博客即可。
https://blog.csdn.net/qq_22238021/article/details/80332750

瞭解握手之前我們先了解之前的標誌字段,後面會用到

  • ACK : TCP協議規定,只有ACK=1時有效,也規定連接建立後所有發送的報文的ACK必須爲1

  • SYN(SYNchronization) : 在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同意建立連接,則應在響應報文中使SYN=1和ACK=1. 因此, SYN置1就表示這是一個連接請求或連接接受報文。

  • FIN (finis)即完,終結的意思, 用來釋放一個連接。當 FIN = 1 時,表明此報文段的發送方的數據已經發送完畢,並要求釋放連接。

TCP三次握手

在這裏插入圖片描述

  • 第一次握手:建立連接時,客戶端發送SYN報文段到服務器,SYN=1 ACK=0,並進入SYN_SENT狀態,等待服務器確認;該SYN報文段不包含應用層數據。客戶端會隨機選擇初始序號seq=x,將其放到SYN報文段的序號字段中。該報文段被封裝在一個IP數據報中併發送給服務器。SYN:同步序列編號(Synchronize Sequence Numbers)。

  • 第二次握手:服務器收到包含SYN報文段的IP數據報,服務器從數據報中提取SYN報文段,併爲該TCP連接分配TCP緩存和變量,並向客戶端發送允許連接的報文段:SYNACK報文段。該報文段不包含應用層數據。服務器選擇自己的初始序號y放入該報文段首部的序號字段中。SYN=1,ACK=1,seq=y,確認號字段ack=x+1。此時服務器進入SYN_RECV狀態;(後面爲了放置syn攻擊採用cookie機制,即先不爲tcp連接分配tcp緩存和變量,完成三次握手後再分配)

  • 第三次握手:客戶端收到服務器的SYNACK報文段後,客戶也要爲該連接分配緩存和變量。客戶向服務器發送確認ACK=1,置ack=y+1,因連接已建立,故SYN=0。seq=x+1。此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。該確認報文段可以攜帶客戶到服務器的數據。

其實本質上3次握手就是爲了讓雙方都清楚對方的初始化序列號,並且確認對方都清楚。並且初始化tcp緩存和變量

TCP四次握手

在這裏插入圖片描述
由於TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味着這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。

  • 第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
  • 第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
  • 第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
  • 第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手

參考:
《計算機網絡自頂向下》
https://blog.csdn.net/qq_22238021/article/details/80333279

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