個人總結系列31TCP會話原理及TCP狀態學習總結

2021-03-10 05:40:55 字數 3580 閱讀 6356

tcp/ip 協議現在已經廣泛的被應用,資料在網路上應用tcp/ip 協議進行傳輸的時候,需要將資料分成多個資料報。目前在網路安全領域都將用到tcp會話的重組問題。只有將資料報重組以後,才能還原一次完整的tcp 會話。

由於網路問題,資料報可能會經過不同的路由傳輸到目的地,並且到達目的地的資料報可能順序會發生改變。在傳輸過程中,協議對資料的傳輸進行控制,對在傳輸過程中丟失的資料報協議將控制系統將丟失的資料報重新傳送。這些都是tcp 會話在重組的時候將遇到的問題。

tcp 是一種面向連線的協議,客戶與伺服器之間的任何一次會話都必須建立連線,退出會話時必須斷開連線。連線的時候需要3個報文,稱為tcp的三次握手;斷開的時候需要4個報文,稱為tcp的四次揮手。

首先介紹tcp建立連線的過程,一次tcp 會話建立的時候需要3個報文交換,即需要3 次握手(如下圖所示)。其seq和ack的關係如下:

(1)客戶傳送乙個syn 段,syn=1 表示發起乙個連線,生成隨機seq。

(2)對方收到後將seq+1 置於ack 發回給本機。表示對前者的確認,生成隨機seq

發回本機。

(3)本機收到後將seq+1 置於ack 發回給對方,將對方ack 置於seq。

圖3-1 tcp三次握手過程

tcp資料傳輸的過程為:當雙方建立tcp 連線以後,就可以傳輸資料了,傳輸過程中傳送方每傳送乙個資料報,接收方都要給予乙個應答。資料報的先後關係可以由tcp 首部的序號和確認序號確定。

雙方序號的及確認序號之間的關係為:設傳送方傳送的資料報長度為n,序號為seq,確認序號ack,則下乙個將要傳送的資料報的序號為seq+n;接收方應答的資料報序號為ack,確認序號為seq+n,表示對序號seq 長度為n 的資料報的確認。

建立乙個連線需要3 次握手,而終止乙個連線要經過4 次揮手(如下圖所示)。這是因為乙個tcp 連線是全雙工(即資料在兩個方向上能同時傳遞),每個方向必須單獨地進行關閉。四次揮手實際上就是雙方單獨關閉的過程。

圖3-2 tcp四次揮手過程

在tcp傳輸過程中,syn和ack標誌著tcp的各種狀態,而seq則標誌了各資料報的順序。在tcp 建立連線的以後,會為後續tcp 資料的傳輸設定乙個初始的序列號,以後每傳送乙個包含有效資料的tcp 包,後續緊接著傳送的乙個tcp 資料報的序列號都要做出相應的修改。在tcp連線中傳送的位元組都有乙個序列號,因為編了號,所以可以確認它們的收到。

對序列號的確認是累積性的。tcp必須進行的序列號比較操作種類包括以下幾種:

①決定一些傳送了的但未確認的序列號

②決定所有的序列號都已經收到了

③決定下乙個段中應該包括的序列號

序列號是為了保證tcp 資料報的按順序傳輸來設計的,可以有效的實現tcp 資料的完整傳輸,特別是在資料傳送過程中出現錯誤的時候可以有效的進行錯誤修正。在tcp會話的重新組合過程中我們需要按照資料報的序列號對接收到的資料報進行排序。一台主機即將發出的報文中的seq 值應等於它所剛收到的報文中的ack 值,而它所要傳送報文中的ack 值應為它所收到報文中的seq 值加上該報文中所傳送的tcp 資料的長度,即兩者存在如下關係:

(1)本次傳送的seq=上次收到的ack;

(2)本次傳送的ack=上次收到的seq+本次傳送的tcp 資料長度;

表1 tcp序列號與資料報長度的關係

以上我們討論的內容都是針對一次tcp 會話的情況,但是實際應用網路同時傳輸的數

據同時來自很多機器,對應很多個不同的tcp 會話。每個tcp 傳輸的報文過程都有乙個源、目的ip 位址和埠,根據這個四元組的可以確定唯一的一次tcp 會話。

根據tcp三次握手和四次揮手,可以將tcp分割成不同的狀態。主要包括closed、listen、syn_rcvd、syn_sent、established、fin_wait_1、fin_wait_2、time_wait、closing、close_wait、last_ack等狀態。對tcp會話進行重組時,需要根據tcp不同的狀態進行處理。

比如established表示連線建立,後面一般就開始傳輸資料了。tcp的各狀態的的轉換圖如下所示,各狀態的具體介紹如下。

圖3-3 tcp狀態轉換圖

closed:表示初始狀態

listen:這個也是非常容易理解的乙個狀態,表示伺服器端的某個socket處於監聽狀態,可以接受連線了

syn_rcvd: 這個狀態表示接受到了syn報文,在正常情況下,這個狀態是伺服器端的socket在建立tcp連線時的三次握手會話過程中的乙個中間狀態,很短暫,基本上用***stat你是很難看到這種狀態的,除非你特意寫了乙個客戶端測試程式,故意將三次tcp握手過程中最後乙個ack報文不予傳送。因此這種狀態時,當收到客戶端的ack報文後,它會進入到established狀態

syn_sent: 這個狀態與syn_rcvd遙相呼應,當客戶端socket執行connect連線時,它首先傳送syn報文,因此也隨即它會進入到了syn_sent狀態,並等待服務端的傳送三次握手中的第2個報文。syn_sent狀態表示客戶端已傳送syn報文

established:這個容易理解了,表示連線已經建立了

fin_wait_1: fin_wait_1和fin_wait_2狀態的真正含義都是表示等待對方的fin報文。而這兩種狀態的區別是:

fin_wait_1狀態實際上是當socket在established狀態時,它想主動關閉連線,向對方傳送了fin報文,此時該socket即進入到fin_wait_1狀態。而當對方回應ack報文後,則進入到fin_wait_2狀態,當然在實際的正常情況下,無論對方何種情況下,都應該馬上回應ack報文,所以fin_wait_1狀態一般是比較難見到的,而fin_wait_2狀態還有時常常可以用***stat看到

fin_wait_2:上面已經詳細解釋了這種狀態,實際上fin_wait_2狀態下的socket,表示半連線,也即有一方要求close連線,但另外還告訴對方,我暫時還有點資料需要傳送給你,稍後再關閉連線

time_wait: 表示收到了對方的fin報文,並傳送出了ack報文,就等2msl後即可回到closed可用狀態了。如果fin_wait_1狀態下,收到了對方同時帶 fin標誌和ack標誌的報文時,可以直接進入到time_wait狀態,而無須經過fin_wait_2狀態

closing: 這種狀態比較特殊,實際情況中應該是很少見,屬於一種比較罕見的例外狀態。正常情況下,當你傳送fin報文後,按理來說是應該先收到(或同時收到)對方的 ack報文,再收到對方的fin報文。

但是closing狀態表示你傳送fin報文後,並沒有收到對方的ack報文,反而卻也收到了對方的fin報文。什麼情況下會出現此種情況呢?其實細想一下,也不難得出結論:

那就是如果雙方幾乎在同時close乙個socket的話,那麼就出現了雙方同時傳送fin報文的情況,也即會出現closing狀態,表示雙方都正在關閉socket連線

close_wait: 這種狀態的含義其實是表示在等待關閉。當對方close乙個socket後傳送fin報文給自己,你系統毫無疑問地會回應乙個ack報文給對方,此時則進入到close_wait狀態。

接下來呢,實際上你真正需要考慮的事情是察看你是否還有資料傳送給對方,如果沒有的話,那麼你也就可以 close這個socket,傳送fin報文給對方,也即關閉連線。所以你在close_wait狀態下,需要完成的事情是等待你去關閉連線

last_ack: 這個狀態還是比較容易好理解的,它是被動關閉一方在傳送fin報文後,最後等待對方的ack報文。當收到ack報文後,也即可以進入到closed可用狀態了。

個人總結系列 53 Matlab學習總結

matlab是美國mathworks公司出品的商業數學軟體,用於演算法開發 資料視覺化 資料分析以及數值計算的高階技術計算語言和互動式環境。首先簡單介紹一下matlab的主要功能,首先是數值計算和符號計算功能 matlab以矩陣作為資料操作的基本單位,還提供了十分豐富的數值計算函式 其次是繪圖功能 ...

個人總結系列36防毒軟體調研

總體來說,防毒軟體的工作流程是 採集樣本 使用者舉報 防毒廠商共享 病毒分析工程師擷取特徵碼 特徵碼加入特徵庫 使用者公升級特徵庫。特徵庫匹配是查殺已知病毒很有效的一項技術,也是防毒引擎賴以工作的基礎 掃瞄 監控都需要呼叫特徵庫 一直被防毒軟體沿用下來,國內外無數反病毒工作者為擷取病毒特徵碼付出了巨...

「重溫經典 系列經典誦讀會」主題團日活動總結

資訊學院電信11 5班團支部 重溫經典 系列經典誦讀會 主題團日活動總結 一 活動目的 通過活動,讓同學們對經典文學認識與理解進一步加強,同時進一步引導同學們養成 愛讀書,會讀書,讀好書 的良好習慣,使同學重拾經典文學,提高對國學的認識,昇華自我的思想,重新審視自己的價值觀念,從經典中學習並傳承優秀...