1. 程式人生 > >Internet傳輸協議:TCP

Internet傳輸協議:TCP

傳輸控制協議(TCP,transmission control protocol)設計它的目的是為了在網際網路上提供一種可靠的端到端的位元組流。

TCP段的頭

下面的這張圖是TCP段的結構,由三部分組成,一是固定長度的頭,共20個位元組;二是可選欄位;三是資料欄位,資料欄位也可以為空,這類TCP段通常被用作確認和控制資訊。
來源於網路
下面我們看一下各個欄位的含義;
源埠(source port)和目的埠(destination port),顧名思義就是指傳送方和接收方的埠。
序號(sequence number)和確認號(ackonwledgement number),TCP中的每一個位元組都有其都有的序號,確認號指的是下一個期待的位元組,而不是已經接收到的最後一個位元組。
TCP頭長度(TCP header length)指明瞭TCP頭中包含了多少個32位(4位元組)的字。由於可選部分是可變長的,所以必需明確地指出頭的長度。
和IP頭類似,TCP頭也有一些保留位,原先是6位,不過現在有兩位被重新宣告使用了。分別是CWR和ECE,他們都是用作擁塞控制訊號的。當接收方收到網路擁塞的訊號時,就設定ECE,給傳送端發ECN-Echo訊號,告訴傳送端放慢傳送的速度;傳送端收到這個訊號後,會設定CWR給接收端,告訴接收端我已經放慢了速度,你不用再給我發ECN-Echo訊號了。
URG(urgent pointer),表示是否使用緊急指標。
ACK表示確認號是否有效,ACK為1表示有效。
PSH表示這是被推送的資料,接收端一旦接收到資料後馬上交給應用程式,而不是等緩衝區滿了在提交。
RST被用於突然重置一個已經變得混亂的連線,如果這個欄位被標識了說明你遇到問題了。
SYN用於建立連線過程。它和ACK配合使用,在連線請求中SYN=1,ACK=0表示該段沒用使用捎帶確認欄位。但是連線應答捎帶一個確認資訊SYN=1,ACK=1。本質上SYN即表示connection request又表示connection accepted,然後用ACK進一步區分。
FIN用於釋放一個連線,表示傳送端已經把資料傳送完了。
視窗大小(Window size),TCP中的流量控制是通過一個可變大小的滑動視窗來處理的,視窗大小欄位從被確認的位元組算起還可以傳送多少個位元組。視窗大小可以為0,表示希望別再傳送資料了。
校驗和(checksum),它是對TCP頭和資料的校驗。
選項(options),提供了一種新增額外設施的途徑,主要針對常規頭覆蓋不到的方面。最長可以擴充套件到40位元組。用途最廣的選項允許每臺主機制定他願意接受的最大段長,大段比小段效率高,預設是536位元組的有效載荷。

TCP三次握手

建立一個連線似乎很簡單,傳送方給接收方發一個connection request然後等待接收方給自己回覆一個connection accept就可以了。但是事實卻很複雜,讓我們考慮一下這種情況:使用者建立一個與銀行的連線,告訴銀行把一大筆錢轉給另一個人,不過這個資料包走的那條路由路徑遇到了擁塞,然後,傳送端超時,所以使用者再次傳送這個訊息,這次資料包順利的到達了,所以傳送端釋放鏈。可是,問題出現了,原來那個被堵塞資料包現在也到達了,要求銀行建立一個新的連線和匯款。銀行沒法得知這些是重複的請求,於是就把它當做一個新的請求,再次進行轉賬。這就是延遲重複問題。為了解決這個問題人們提出了幾種方案;
1、為每一個連線分配一個唯一的識別符號,就是一個序號,每建立一個連線序號就遞增,把這個識別符號放入段中,包括請求建立連線的那個段,這樣一來,每個傳輸實體就可以知道所有已經過期的連線。不過這種方法有一個巨大的缺陷,就是每個傳輸實體必須維護一張巨大的表,用來存放那些過期的序號。這樣做的代價太大了。
2、第二種方法就是我們不允許資料包在網路中無限期的存活,可以設計一種機制來殺死那些在網路中停留時間過長的資料包。主要有兩種方式:一、為每個資料包新增一個跳計數器;二、為每個資料包打時間戳。為了確保這個資料包確實死了,我們引入週期T,它是資料包最大生存週期的某個不太大的倍數(120秒的倍數),也就是說資料包傳送出去T秒後,我們就可以確信這個資料包就徹底死了。
這樣一來我們就有一種萬無一失的方法來解決延遲重複問題了,其核心就是:源端用序號作為段的標識,使得該段在T秒內不得重複使用,也就是說序號空間足夠大,當序號迴圈使用了一遍時,已經過了T秒。
三次握手過程:1、主機1傳送序號為x的連線請求給主機2;2、主機2收到請求後,迴應一個ACK段作為對x的確認,並且宣告它自己的序號y,最後,主機1在他傳送的第一個資料段中,對主機2選擇的初始序號進行確認。如下圖;
這裡寫圖片描述