• QQ咨詢:4001806960
  • 咨詢熱線:400-180-6960

理解TCP/IP協議(二)

作者:珠峰架構課學員日期:2018-04-15 19:37:55 點擊:530

五、TCP報文

數據包

IP 數據包在以太網數據包的負載裏面,TCP數據包在IP數據包的負載裏。

TCP 首部各字段的意義和作用

TCP首部最小爲20字節,這20字節分爲5行,每行4個字節也就是32個位。

源端口和目的端口 Port

  • 源端口號:16位的源端口中包含初始化通信的端口。源端口和源IP地址的作用是標識報文的返回地址。
  • 目的端口號:16位的目的端口域定義傳輸的目的。這個端口指明報文接收計算機上的應用程序地址接口。計算機通過端口號識別訪問哪個服務,比如http服務或ftp服務,發送方端口號是進行隨機端口,目標端口號決定了接收方哪個程序來接收 分別占用16位,也就是端口號最大是2^16,所以端口號的範圍是0~65536

端口號的分配:

  • 知名端口號一般位于:1 — 255 之間
  • 256 — 1023的端口號,通常是由Unix系統占用(系統占用)
  • 1024 —5000 是大多數TCP、IP實現的臨時分配
  • 大于5000的一般是給其他服務預留的(Internet上並不常用的服務)

序號 Sequence Number

TCP用序列號對數據包進行標記,以便在到達目的地後重新重裝,假設當前的序列號爲 s,發送數據長度爲 l,則下次發送數據時的序列號爲 s + l。在建立連接時通常由計算機生成一個隨機數作爲序列號的初始值。

確認號 Acknowledgemt Number

占 4 個字節,表示期望收到對方下一個報文段的序號值。 TCP 的可靠性,是建立在「每一個數據報文都需要確認收到」的基礎之上的。

就是說,通訊的任何一方在收到對方的一個報文之後,都要發送一個相對應的「確認報文」,來表達確認收到。 那麽,確認報文,就會包含確認號。 例如,通訊的一方收到了第一個 25kb 的報文,該報文的 序號值=0,那麽就需要回複一個確認報文,其中的確認號 = 25600.

數據偏移 Offset

占 0.5 個字節 (4 位)。 這個字段實際上是指出了 TCP 報文段的首部長度 ,它指出了 TCP報文段的數據起始處 距離 TCP報文的起始處 有多遠。(注意 數據起始處 和 報文起始處 的意思)

一個數據偏移量 = 4 byte,由于 4 位二進制數能表示的最大十進制數字是 15,因此數據偏移的最大值是 60 byte,這也側面限制了 TCP 首部的最大長度。

保留 Reserved

占 0.75 個字節 (6 位)。 保留爲今後使用,但目前應置爲 0。

標志位 TCP Flags

標志位,一共有 6 個,分別占 1 位,共 6 位 。 每一位的值只有 0 和 1,分別表達不同意思。

  • ACK:確認序號有效
  • RST:重置連接
  • SYN:發起了一個新連接
  • FIN:釋放一個連接

確認 ACK (Acknowlegemt)

當 ACK = 1 的時候,確認號(Acknowledgemt Number)有效。 一般稱攜帶 ACK 標志的 TCP 報文段爲「確認報文段」。爲0表示數據段不包含確認信息,確認號被忽略。

TCP 規定,在連接建立後所有傳送的報文段都必須把 ACK 設置爲 1。

推送 PSH (Push)

當 PSH = 1 的時候,表示該報文段高優先級,接收方 TCP 應該盡快推送給接收應用程序,而不用等到整個 TCP 緩存都填滿了後再交付。

複位 RST (Reset)

當 RST = 1 的時候,表示 TCP 連接中出現嚴重錯誤,需要釋放並重新建立連接。 一般稱攜帶 RST 標志的 TCP 報文段爲「複位報文段」。

同步 SYN (SYNchronization)

當 SYN = 1 的時候,表明這是一個請求連接報文段。 一般稱攜帶 SYN 標志的 TCP 報文段爲「同步報文段」。 在 TCP 三次握手中的第一個報文就是同步報文段,在連接建立時用來同步序號。

對方若同意建立連接,則應在響應的報文段中使 SYN = 1 和 ACK = 1。

終止 FIN (Finis)

當 FIN = 1 時,表示此報文段的發送方的數據已經發送完畢,並要求釋放 TCP 連接。

一般稱攜帶 FIN 的報文段爲「結束報文段」。

在 TCP 四次揮手釋放連接的時候,就會用到該標志。

窗口大小 Window Size

占 2 字節。

該字段明確指出了現在允許對方發送的數據量,它告訴對方本端的 TCP 接收緩沖區還能容納多少字節的數據,這樣對方就可以控制發送數據的速度。 窗口大小的值是指,從本報文段首部中的確認號算起,接收方目前允許對方發送的數據量。

例如,假如確認號是 701 ,窗口字段是 1000。這就表明,從 701 號算起,發送此報文段的一方還有接收 1000 (字節序號是 701 ~ 1700) 個字節的數據的接收緩存空間。

校驗和 TCP Checksum

占 2 個字節。 由發送端填充,接收端對 TCP 報文段執行 CRC 算法,以檢驗 TCP 報文段在傳輸過程中是否損壞,如果損壞這丟棄。

檢驗範圍包括首部和數據兩部分,這也是 TCP 可靠傳輸的一個重要保障。

緊急指針 Urgent Pointer

占 2 個字節。 僅在 URG = 1 時才有意義,它指出本報文段中的緊急數據的字節數。 當 URG = 1 時,發送方 TCP 就把緊急數據插入到本報文段數據的最前面,而在緊急數據後面的數據仍是普通數據。

因此,緊急指針指出了緊急數據的末尾在報文段中的位置。

六、三次握手,四次揮手

需要了解的信息:

  • ACK : TCP協議規定,只有ACK=1時有效,也規定連接建立後所有發送的報文的ACK必須爲1
  • SYN(SYNchronization) : 在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同意建立連接,則應在響應報文中使SYN=1和ACK=1. 因此, SYN置1就表示這是一個連接請求或連接接受報文。
  • FIN (finis)即完,終結的意思, 用來釋放一個連接。當 FIN = 1 時,表明此報文段的發送方的數據已經發送完畢,並要求釋放連接。

三次握手 建立連接

TCP(Transmission Control Protocol,傳輸控制協議)是 面向連接的協議,也就是說在收發數據之前,必須先和對方建立連接

一個TCP連接必須要經過三次“對話”才能建立起來,其中的過程非常複雜,只簡單的 描述下這三次對話的簡單過程:主機A向主機B發出連接請求數據包:“我想給你發數據,可以嗎?”,這是第一次對話;主機B向主機A發送同意連接和要求同步 (同步就是兩台主機一個在發送,一個在接收,協調工作)的數據包:“可以,你什麽時候發?”,這是第二次對話;主機A再發出一個數據包確認主機B的要求同 步:“我現在就發,你接著吧!”,這是第三次對話。三次“對話”的目的是使數據包的發送和接收同步,經過三次“對話”之後,主機A才向主機B正式發送數 據。

首先由Client發出請求連接即 SYN=1 ACK=0 (請看頭字段的介紹), TCP規定SYN=1時不能攜帶數據,但要消耗一個序號,因此聲明自己的32位序號是 seq=x,然後 Server 進行回複確認,即 SYN=1 ACK=1 seq=y, ack=x+1, 再然後 Client 再進行一次確認,但不用SYN 了,這時即爲 ACK=1, seq=x+1, ack=y+1.

四次揮手 釋放連接

當客戶A 沒有東西要發送時就要釋放 A 這邊的連接,A會發送一個報文(沒有數據),其中 FIN 設置爲1, 服務器B收到後會給應用程序一個信,這時A那邊的連接已經關閉,即A不再發送信息(但仍可接收信息)。 A收到B的確認後進入等待狀態,等待B請求釋放連接, B數據發送完成後就向A請求連接釋放,也是用FIN=1 表示, 並且用 ack = u+1(如圖), A收到後回複一個確認信息,並進入 TIME_WAIT 狀態, 等待 2MSL 時間。

關于 TIME_WAIT 過渡到 CLOSED 狀態說明: 從 TIME_WAIT 進入 CLOSED 需要經過 2MSL,其中 MSL 就叫做 最長報文段壽命(Maxinum Segment Lifetime),根據 RFC 793 建議該值這是爲 2 分鍾,也就是說需要經過 4 分鍾,才進入 CLOSED 狀態。

爲什麽要等待呢?

爲了這種情況: B向A發送 FIN = 1 的釋放連接請求,但這個報文丟失了, A沒有接到不會發送確認信息, B 超時會重傳,這時A在 WAIT_TIME 還能夠接收到這個請求,這時再回複一個確認就行了。(A收到 FIN = 1 的請求後 WAIT_TIME會重新記時)

另外服務器B存在一個保活狀態,即如果A突然故障死機了,那B那邊的連接資源什麽時候能釋放呢? 就是保活時間到了後,B會發送探測信息, 以決定是否釋放連接

爲什麽連接的時候是三次握手,關閉的時候卻是四次握手?

答:因爲當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回複一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

上一篇: 理解TCP/IP協議(一)

下一篇: 返回列表