TCP協議之<你好——再見>

1:TCP協議簡介

2:TCP協議報頭的結構分析

3:TCP協議三次握手

4:TCP協議四次揮手

5:抓包實驗過程呈現

一、TCP協議簡介

作爲TCP/IP協議棧的核心協議之一,TCP協議早已成爲可靠數據傳輸的首選協議之一,衆多的協議都是基於TCP協議之上的,例如:遠程連接協議Telnet、ssh協議、http協議等。

TCP傳輸控制協議是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,在1981年由IETF的RFC793正式提出。

TCP協議的特性有:工作在傳輸層的面向連接的協議、全雙工協議、半關閉、錯誤檢查、數據打包成段爲報文進行排序、確認機制、錯誤檢查、恢復重傳、流量控制、擁塞控制四部分:慢啓動、擁塞控制、快速重傳和快速恢復。

TCP的主要功能是在互聯網中爲提供可靠的、面向連接的進程間通信服務。其基本的功能如下:

1)基本數據傳輸

    TCP能夠在通信雙方間的每個方向(即全雙工)傳送一個連續的字節流,並將一定數量的字節封裝成段然後通過互聯網傳輸。

2)可靠性

    TCP能夠將數據從損壞、丟失、重複、亂序中恢復。

3)流控制

    TCP能爲數據發送者提供控制發送數據數量的手段。

4)複用

     允許一個主機內的多個進程同時使用TCP。

5)面向連接

TCP是面向連接的協議,意味着通信雙方必須先建立連接,然後才能傳輸數據,數據傳輸結束後必須關閉連接。使用面向連接的方式提供服務使得TCP能夠通過保存連接信息等手段,更好地提供可靠數據交付。這意味着TCP無法支持多播,多播只能使用UDP一類無連接的協議來完成。

二、TCP報頭的結構分析

TCP最重要的特性就是其傳輸的可靠性,要想連接TCP的可靠傳輸過程,那我們必須先從TCP報文頭部的結構分析入手。接下來由小編帶大家參觀一下TCP報文的頭部。

wKiom1mpXw7AM6wHAADxfYPsj_U720.png

TCP報文首部的字段進行解讀:

源端口 :本機應用進程端口

目的端口:目的主機應用進程端口

序列號:主機發送的數據報的序號(第幾個)

確認號:發送給對方下次要發送的數據報的序列號(暗示上個數據幀已經接收到了)

數據偏移:指數據報中的數據在本報文中的起始位置,反過來也就是TCP頭部的長度。TCP報文頭部是以4個字節爲單位的,數據偏移位爲四個字節,雖大表示15,所以最大能表示TCP報文頭部的長度爲15*4=60字節。報文的選項位是可以不要的,所最小的長度是20字節。

保留位:顧名思義,正在保留。

URG:表示報文段中發送的數據是否包含緊急數據。後面的緊急指針字段(urgent pointer)只有當URG=1時纔有效

ACK:表示是否前面的確認號字段是否有效。ACK=1,表示有效。只有當ACK=1時,前面的確認號字段纔有效。TCP規定,連接建立後,ACK必須爲1,帶ACK標誌的TCP報文段稱爲確認報文段。(ack小寫表示確認號)

PSH:提示接收端應用程序應該立即從TCP接收緩衝區中讀走數據,爲接收後續數據騰出空間。如果爲1,則表示對方應當立即把數據提交給上層應用,而不是緩存起來,如果應用程序不將接收到的數據讀走,就會一直停留在TCP接收緩衝區中。

RST:如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然後再重新建立連接。或者說明上次發送給主機的數據有問題,主機拒絕響應,帶RST標誌的TCP報文段稱爲復位報文段

SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置爲1,帶SYN標誌的TCP報文段稱爲同步報文段。

FIN:表示通知對方本端要關閉連接了,標記數據是否發送完畢。如果FIN=1,即告訴對方:“我的數據已經發送完畢,你可以釋放連接了”,帶FIN標誌的TCP報文段稱爲結束報文段

窗口大小:表示現在充許對方發送的數據量,也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量

校驗和:提供額外的可靠性

緊急指針:標記緊急數據在數據字段中的位置

選項部分:其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,選項部分最長爲40字節

最大報文段長度:Maxium Segment Size,MSS

指明自己期望對方發送TCP報文段時那個數據字段的長度。默認是536字節。數據字段的長度加上TCP首部的長度纔等於整個TCP報文段的長度。

窗口擴大:Windows Scaling

TCP首部的窗口大小字段長度是16位,所以其表示的最大數是65535。但是隨着時延和帶寬比較大的通信產生(如衛星通信),需要更大的窗口來滿足性能和吞吐率,所以產生了這個窗口擴大選項。

時間戳: Timestamps

可以用來計算RTT(往返時間),發送方發送TCP報文時,把當前的時間值放入時間戳字段,接收方收到後發送確認報文時,把這個時間戳字段的值複製到確認報文中,當發送方收到確認報文後即可計算出RTT。也可以用來防止迴繞序號PAWS,也可以說可以用來區分相同序列號的不同報文。因爲序列號用32爲表示,每2^32個序列號就會產生迴繞,那麼使用時間戳字段就很容易區分相同序列號的不同報文。

一、TCP三次握手

通過對上面TCP報文首部的字段進行了一些認識,接下來跟隨小編去看看TCP是如何進行連接的。廢話不多說,直接上圖解釋:

wKioL1mpXyTQ1BKiAAQ6lW2ppUE156.png

TCP三次握手的建立中,主動發出請求的一方稱爲客戶端,被動提供服務的一方是服務器端。從圖中,我們可以看出,在整個建立連接的過程中,客戶端和服務器端共有5種狀態:Closed LISTENSYN-SENTSYN-RCVDESTAB-LISHED

CLOSED 沒有任何連接狀態

LISTEN 偵聽狀態,等待來自遠方TCP端口的連接請求

SYN-SENT 在發送連接請求後,等待對方確認

SYN-RECEIVED 在收到和發送一個連接請求後,等待對方確認

ESTABLISHED 代表傳輸連接建立,雙方進入數據傳送狀態

整個傳輸過程如下:

請求方發送請求建立連接的報文,報文中攜帶的標誌位SYN=1,seq=0,ACK=0,由上面我們瞭解到SYN標誌位爲同步標誌位,表明,客戶端要與服務器建立連接,seq=0是攜帶包的序列號,因爲這是傳輸過程中的第一個包,所以沒有ack的值,在首次請求的時候,這是ACK標誌位唯一一次等於0的時候,因爲,TCP協議規定,在建立連接後,ACK標誌位,必須爲1。

請求端發送完請求之後,立馬進入SYN-SENT 狀態進行同步等待,而處於監聽狀態的服務器端接收到請求後,如果條件滿足,就給客戶端迴應一個統一進入同步狀態的報文,並立即進入SYN-RCVD狀態。

客戶端收到服務器的同意建立連接報文後,再給服務器反饋一個確認收到的報文,並立即進入ESTAB-LISHED狀態。

服務器收到客戶的確認後,立馬進入ESTAB-LISHED。

在發送建立連接的報文中需要將SYN標誌位標記爲1,在確認報文中,並不需要SYN,但必須要使ACK=1。

一、TCP協議四次揮手

有聚必有散,在雙方都進行傳輸完成後,需要斷開連接,同樣的爲了體現TCP的可靠性,斷開連接的時候也不能草草斷開,必須確保雙方都同意了斷開,並確認斷開才行。不廢話,上圖說明:

wKioL1mpX0yiomJfAAUITBmOYNg887.png

看到沒,建立連接容易,可是斷開可不是那麼簡單,所謂的有始有終,也許正是TCP的體現吧。猛地看去貌似有些亂,但是仔細的分析一下發現,斷開的過程中一共有ESTAB-LISHEDFIN-WAIT1FIN-WAIT2CLOSE-WAITLAST-ACKTIME-WAITCLOSED七種狀態。

CLOSED 沒有任何連接狀態

FIN-WAIT-1 主動關閉,主機已發送關閉連接請求,等待對方確認

FIN-WAIT-2主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求

TIME-WAIT 完成雙向傳輸連接關閉,等待所有分組消失

CLOSE-WAIT 被動關閉,收到對方發來的關閉連接請求,並已確認

LAST-ACK 被動關閉,等待最後一個關閉傳輸連接確認,並等待所有分組消失

CLOSING 雙方同時嘗試關閉傳輸連接,等待對方確認

過程說明:

當一方覺得沒什麼服務需要的時候,請求斷開連接,發送的報文中攜帶的FIN標誌位爲1,表示這是一個終結會話的報文。

當服務器收到後,一看這是一個請求斷開連接的報文,這個時候服務器就會考慮,看是否還有數據需要發送或者正在發送,這個時候分兩種情況,我們先說一種,另一種,在下文進行說明,當服務器還有數據需要發送或者正在發送的時候,服務器給客戶端發送一個確認收到斷開連接請求的報文,這個報文是不攜帶標誌位FIN=1的,因爲,只是一個確認收到客戶端信息的報文,並沒有同意立馬斷開,因爲服務器有數據正在傳輸。

當客戶端收到服務器的確認報文後,一看報文中標誌位FIN沒有爲1,說明服務器可能還沒傳輸完畢,於是,客戶端就進入FIN-WAIT2階段進行等待。

當服務器數據傳輸完畢之後,會主動向客戶端發送請求斷開連接的報文,並攜帶標誌位FIN=1 的報文,這個時候服務器進入LAST-ACK(最後確認階段),它要等客戶端收到我的請求後才能斷開呀,所以進入最後的確認等待階段。

客戶端收到斷開連接的報文後,立馬發送確認報文,確認收到了服務器的斷開請求,攜帶標誌位ACK=1的報文,並立即進入最後的TIME-WAIT階段,這個階段時長爲兩個最大傳輸時長(2MSL),是爲了確保正在路上的數據包在斷開接收端口之前能全部到達。計時一到就關閉。

服務器端收到客戶端的確認報文後立即進入關閉狀態,一個完整的TCP連接正式結束。

額外補充:

如果客戶端和服務器端同時發送請求斷開連接報文,就會同時進入closeing狀態。發送確認報文,進行斷開,中間的FIN-WAIT2階段會省略。

五、抓包實驗過程呈現

到這裏,一個完整的TCP連接建立並且成功斷開。接下來小編帶你去捉幾個包看看,驗證這個過程,廢話不說,截圖爲證:

wKioL1mpX4CDmUU6AAA-z-URDlA313.png

    三次握手的包,頭兩個包帶有標誌位SYN=1,最後一個位ACK=1進行確認。

wKiom1mpX5fRYG3hAABOTKZ1O_8850.png

    哈哈,看吧,是不是與文中介紹的對上號了呢。說明這個實驗是一個完美的實驗,每一步都非常的準確。到這裏,小編的實驗就結束了,如果有什麼不足的地方,請多多指教,如果你有疑問,小編很樂於幫助你解答疑惑。

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