1. 程式人生 > >傳輸控制協議(TCP)

傳輸控制協議(TCP)

一、TCP頭部和封裝

在這裡插入得到圖片描述
源埠與目的埠: 每個TCP頭部包含了源和目的埠號,這兩個值與IP頭部中的源和目的IP地址一起,唯一地標識了每個連線。在TCP術語中,一個IP地址和一個埠的組合有時被稱為一個端點(endpoing)或套接字(socket)。每個TCP連線由一對端點或套接字(四元組,由客戶機IP地址、客戶機埠號、伺服器IP地址、伺服器埠號組成)唯一地標識。
序列號: 序列號欄位標識了TCP傳送端到TCP接收端的資料流的一個位元組,該位元組代表著包含該序列號的報文段的資料中的第一個位元組。
確認號: TCP可以被描述為“一種帶累積正向確認的滑動視窗協議”。收到報文段後用ACK或SACK進行確認。
頭部長度:


1.CWR------擁塞視窗減(傳送方降低它的傳送速率)
2.ECE-------ECN回顯(傳送方接受到了一個更早的擁塞報告)
3.URG------緊急(緊急指標有效欄位,很少被使用)
4.ACK------確認(確認號欄位有效,連線建立以後一般都是啟用狀態)
5.PSH------推送(接收方應儘快給應用程式傳這個資料)
6.RST------重置連線(連線取消,經常是因為錯誤)
7.SYN------用於初始化一個連線的同步序列號
8.FIN-----該報文段的傳送方已經結束向對方傳送資料
視窗大小: TCP的擁塞控制由每個端點使用視窗大小欄位來通告一個視窗大小來完成,這個視窗大小是位元組數,從ACK號指定。
TCP校驗和:
TCP校驗和欄位覆蓋了TCP的頭部和資料以及頭部中的一些欄位。由傳送方進行計算和儲存,然後由接收方驗證。
緊急指標: 緊急指標欄位只有在URG位欄位被設定時才有效。
選項: 最常見的選項欄位就是“最大段大小”選項,稱為MSS。MSS指定該選項的傳送者在相反方向上希望接收到的報文段的最大值。

二、TCP連線的建立

在這裡插圖片描述

1.主動開啟者(通常稱為客戶端)傳送一個SYN報文段(即一個在TCP頭部的SYN位欄位置位的TCP/IP資料包),並指明自己想要連線的埠號和它的客戶端初始序列號(記為ISN©,上圖中ISN©=x)。通常客戶端還會發送一個或多個選項,客戶端傳送的這個SYN報文段稱作段1。
2.伺服器端也傳送自己的SYN報文段作為響應,幷包含了它的初始序列號(記為ISN(s),上圖中ISN(s)=y),該段稱為段2。此外,為了確認客戶端的SYN,伺服器端將其包含的SYN©資料加1後作為返回的ACK數值。因此,每傳送一個SYN,序列號就會自動加1。這樣如果出現丟包的情況,該SYN段會重傳。
3.為了確認伺服器端的SYN,客戶端將ISN(s)的數值加1後作為返回的ACK數值。這稱為段3。
        通過上述3個報文段就完成了一個TCP連線的建立,它們也常稱作三次握手。三次握手的目的不僅在於讓通訊雙方瞭解一個連線正在建立,還在於利用資料包的選項來承載特殊資訊,交換初始序列號(Initial Sequence Number,ISN)。

三、TCP連線的終止

在這kk圖片描述
1.連線的主動關閉者傳送一個FIN段指明接收者希望看到的自己當前的序列號。FIN段還包含一個ACK段用於確認對方最近一次發來的資料(圖中未標出)。
2.連線的被動關閉者將K的數值加1作為響應的ACK值,以表明它已經成功接收到主動關閉者傳送的FIN。
3.此時,上層的應用程式會被告知連線的另一端已經提出了關閉的請求。通常,這會導致應用程式發起自己的關閉操作。接著,被動關閉者將身份轉換為主動關閉者,併發送自己的FIN。
4.為了完成連線的關閉,最後傳送的報文段還包含一個ACK用於確認上一個FIN。如果出現FIN丟失的情況,那麼傳送方將重新傳輸直到收到一個ACK確認。

四、TCP狀態轉換圖

1
1.TIME_WAIT狀態
TIME_WAIT狀態也稱為2MSL狀態。在該狀態中,TCP將會等待兩倍於最大段生存期(Maximum Segment Lifetime,MSL)的時間,有時也被稱作加倍等待。按照規則,當TCP執行一個主動關閉併發送最終的ACK時,連線必須處於TIME_WAIT狀態並持續兩倍於最大生存期的時間。這樣就能夠讓TCP重新發送最終的ACK以避免出現丟失的情況。
2.FIN_WAIT_2狀態
在FIN_WAIT_2狀態,某TCP通訊端已傳送一個FIN並已得到另一端的確認。