詳解tcp ip連線建立與釋放

2021-06-10 03:21:36 字數 4648 閱讀 1530

最近一段時間參加一些公司的筆試,多次遇到tcp協議關於連線建立與釋放方面的題目,雖然能答對一些,但未能回答完整,事後查閱資料總結如下。

也稱作tcp傳輸控制協議,transport control protocol。可靠的主機到主機層協議。這裡要先強調一下,傳輸控制協議是 osi 網路的第四層的叫法,tcp 傳輸控制協議是 tcp/ip 傳輸的 6 個基本協議的一種。兩個tcp意思非相同。tcp 是一種可靠的面向連線的傳送服務。它在傳送資料時是分段進行的,主機交換資料必須建立乙個會話。它用位元流通訊,即資料被作為無結構的位元組流。通過每個tcp傳輸的字段指定順序號,以獲得可靠性。是在 osi 參考模型中的第四層,tcp是使用ip的網間互聯功能而提供可靠的資料傳輸,ip不停的把報文放到網路上,而tcp是負責確信報文到達。在協同ip的操作中 tcp 負責:握手過程、報文管理、流量控制、錯誤檢測和處理(控制),可以根據一定的編號順序 對非正常順序的報文給予從新排列順序。關於tcp的rfc文件有 rfc793、rfc791、rfc1700。在tcp會話初期,有所謂的「三握手」:對每次傳送的資料量是怎樣跟蹤進行協 商使資料段的傳送和接收同步,根據所接收到的資料量而確定的資料確認數及數 據傳送、接收完畢後何時撤消聯絡,並建立虛連線。為了提供可靠的傳送,tcp在傳送新的資料之前,以特定的順序將資料報的序號,並需要這些包傳送給目標 機之後的確認訊息。 tcp 總是用來傳送大批量的資料。當應用程式在收到資料 後要做出確認時也要用到 tcp。由於tcp需要時刻跟蹤,這需要額外開銷,使得tcp的格式有些顯得複雜。下面就讓我們看乙個tcp的經典案例,這是後來被稱為mitnick攻擊中kevin開創了兩種攻擊技術:tcp會話劫持syn flood(同步洪流)在這裡我們討論的時tcp會話劫持的問題。先讓我們明白 tcp 建立連線的基本簡單的過程。為了建設乙個小型的模仿環境我們假設有3臺接入網際網路的機器。a為攻擊者操縱的攻擊機。b 為中介跳板機器(受信任的伺服器)。c為受害者使用的機器(多是伺服器),這裡把c機器鎖定為目標機器。a機器向b機器傳送syn包,請求建立連線,這時已經響應請求的b機器會向a機器回應 syn/ack 表明同意建立連線,a機器接受到b機器髮當送的syn/ack回應時,傳送應答ack建立a機器與b機器的網路連線。這樣乙個兩台機器之間的tcp通話通道就建立成功了。b終端受信任的伺服器向c機器發起tcp連線,a機器對伺服器發起syn資訊,使c機器不能響應b機器。在同時a機器也向b機器傳送虛假的c機器回應的syn資料報,接收到 syn 資料報的b機器(被c機器信任)開始傳送應答連線建 立的 syn/ack資料報,這時c機器正在忙於響應以前傳送的syn資料而無暇回應b機器,而a機器的攻擊者**出b機器包的序列號(現在的tcp序列號**難度有所加大)假冒c機器向b機器傳送應答ack這時攻擊者騙取b機器的信任,假冒c機器與b機器建立起tcp協議的對話連線。這個時候的c機器還是在響應攻擊者a機器傳送的syn資料。tcp協議棧的弱點:tcp連線的資源消耗,其中包括:資料報資訊、條件狀態、 序列號等。通過故意不完成建立連線所需要的三次握手過程,造成連線一方的資源耗盡。通過攻擊者有意的不完成建立連線所需要的三次握手的全過程,從而造成了c機器的資源耗盡。序列號的可**性,目標主機應答連線請求時返回的syn/ack的序列號時可**的。(早期 tcp 協議棧, 具體的可以參見 1981 年出的關於tcp雛形的rfc793文件)

tcp頭結構tcp協議頭最少20個位元組,包括以下的區域。

tcp 源埠(source port):16 位的源埠其中包含初始化通訊的埠。源埠 和源 ip 位址的作用是標示報問的返回位址。 tcp 目的埠(destination port):16 位的目的埠域定義傳輸的目的。這個端 口指明報文接收計算機上的應用程式位址介面。 tcp 序列號(序列碼,sequence number):32位的序列號由接收端計算機使用,重新分段的報文成最初形式。當syn出現,序列碼實際上是初始序列碼(isn), 而第乙個資料位元組是 isn+1。這個序列號(序列碼)是可以補償傳輸中的 不一 致。 tcp 應答號(acknowledgment number):32 位的序列號由接收端計算機使用,重 組分段的報文成最初形式。如果設定了 ack 控制位,這個值表示乙個準備接收 的包的序列碼。資料偏移量(hlen):4 位包括 tcp 頭大小,指示何處資料開始。保留(reserved):6 位值域,這些位必須是 0。為了將來定義新的用途所保留。標誌(code bits):6 位標誌域。表示為:緊急標誌、有意義的應答標誌、推、重置連線標誌、同步序列號標誌、完成傳送資料標誌。按照順序排列是:urg、ack、psh、rst、syn、fin。視窗(window):16 位,用來表示想收到的每個 tcp 資料段的大小。 校驗位(checksum):16 位 tcp 頭。源機器基於資料內容計算乙個數值,收資訊 機要與源機器數值 結果完全一樣,從而證明資料的有效性。 優先指標(緊急,urgent pointer):16 位,指向後面是優先資料的位元組,在 urg 標誌設定了時才有效。如果 urg 標誌沒有被設定,緊急域作為填充。加快處理標 示為緊急的資料段。

選項(option):長度不定,但長度必須以位元組。如果 沒有 選項就表示這個一字 節的域等於 0。 填充:不定長,填充的內容必須為 0,它是為了數學目的而存在。目的是確保空 間的可**性。保證包頭的結合和資料的開始處偏移量能夠被 32 整除,一般額 外的零以保證 tcp 頭是 32 位的整數倍。

標誌控制功能 urg:緊急標誌 緊急(the urgent pointer) 標誌有效。緊急標誌置位, ack:確認標誌 確認編號(acknowledgement number)欄有效。大多數情況下該標誌位是置位的。 tcp 報頭內的確認編號欄內包含的確認編號(w+1,figure:1)為下乙個預期的序 列編號,同時提示遠端系統已經成功接收所有資料。 psh:推標誌 該標誌置位時,接收端不將該資料進行佇列處理,而是盡可能快將資料轉由應用 處理。在處理 telnet 或 rlogin 等互動模式的連線時,該標誌總是置位的。 rst:復位標誌 復位標誌有效。用於復位相應的 tcp 連線。 syn:同步標誌 同步序列編號(synchronize sequence numbers)欄有效。該標誌僅在三次握手建 立 tcp 連線時有效。它提示 tcp 連線的服務端檢查序列編號,該序列編號為 tcp 連線初始端(一般是客戶端)的初始序列編號。在這裡,可以把 tcp 序列編號看作 是乙個範圍從 0 到 4,294,967,295 的 32 位計數器。通過 tcp 連線交換的資料 中每乙個位元組都經過序列編號。 tcp 報頭中的序列編號欄包括了 tcp 分段中第 在 乙個位元組的序列編號。 fin:結束標誌 帶有該標誌置位的資料報用來結束乙個 tcp 回話,但對應埠仍處於開放狀 態,準備接收後續資料。 服務端處於監聽狀態,客戶端用於建立連線請求的資料報(ip packet)按照 tcp/ip 協議堆疊組合成為 tcp 處理的分段(segment)。

分析報頭資訊: tcp 層接收到相應的 tcp 和 ip 報頭, 將這些資訊儲存到記憶體中。

檢查 tcp 校驗和(checksum):標準的校驗和位於分段之中(figure:2)。如 果檢驗失敗,不返回確認,該分段丟棄,並等待客戶端進行重傳。查詢協議控制塊(pcb):tcp 查詢與該連線相關聯的協議控制塊。如果沒 有找到,tcp 將該分段丟棄並返回 rst。(這就是 tcp 處理沒有埠監聽情況下的 機制) 如果該協議控制塊存在,但狀態為關閉,服務端不呼叫 connect()或 listen()。該分段丟棄,但不返回 rst。客戶端會嘗試重新建立連線請求。 建立新的 socket:當處於監聽狀態的 socket 收到該分段時,會建立乙個子 socket,同時還有 socket(),tcpcb()和pub()建立。這時如果有錯誤發生,會通過標誌位來拆除相應的socket和釋放記憶體,tcp 連線失敗。如果快取佇列處 於填滿狀態,tcp 認為有錯誤發生,所有的後續連線請求會被拒絕。這裡可以看 出 syn flood 攻擊是如何起作用的。 丟棄:如果該分段中的標誌為 rst 或 ack,或者沒有 syn 標誌,則該分段丟 棄。並釋放相應的記憶體。

tcp連線過程中各種狀態的意義:listen(監聽來自遠方 tcp 埠的連線請求),syn-sent(在傳送連線請求後等待匹配的連線請求),syn-received(在收到和傳送乙個連線請求後等待對連線請求的確認),established(代表乙個開啟的連線,資料可以傳送給使用者),fin-wait-1(等待遠端 tcp 的連線中斷請求,或先前的連線中斷請求的確認),fin-wait-2(從遠端 tcp 等待連線中斷請求),close-wait(等待從本地使用者發來的連線中斷請求),closing(等待遠端 tcp 對連線中斷的確認),last-ack(等待原來發向遠端 tcp 的連線中斷請求的確認),time-wait (等待足夠的時間以確保遠端 tcp 接收到連線中斷請求的確認),closed(沒有任何連線狀態)。tcp連線過程是狀態的轉換,促使發生狀態轉換的是使用者呼叫:open,send,receive,close,abort 和 status。

序列號請注意,我們在tcp連線中傳送的位元組都有乙個序列號。因為編了號,所以可以確認它們的收到。對序列號的確認是累積性的。tcp 必須進行的序列號比較操作種類包括以下幾種:①決定一些傳送了的但未確認的序列號。②決定所有的序列號都已經收到了。③決定下乙個段中應該包括的序列號。對於傳送的資料 tcp 要接收確認,確認時必須進行的: snd.una = 最老的確認了的序列號。 snd.nxt = 下乙個要傳送的序列號。 seg.ack = 接收 tcp 的確認,接收 tcp 期待的下乙個序列號。 seg.seq = 乙個資料段的第乙個序列號。 seg.len = 資料段中包括的位元組數。 seg.seq+seg.len-1 = 資料段的最後乙個序列號。 如果乙個資料段的序列號小於等於確認號的值,那麼整個資料段就被確認了。而在接收資料時下面的比較操作是必須的:rcv.nxt = 期待的序列號和接收視窗的最低沿。 rcv.nxt+rcv.wnd:1 = 最後乙個序列號和接收視窗的最高沿。seg.seq = 接收到的第乙個序列號。 seg.seq+seg.len:1=接收到的最後乙個序列號。

TCP建立連線與釋放連線

tcp建立連線與釋放連線 tcp建立連線與釋放連線 最近複習準備 計算機網路 考試,感覺tcp協議建立連線與釋放連線這兩個過程比較重要,所以把自己理解的部分寫下來。1.建立連線 三次握手 1 客戶端傳送乙個syn包給伺服器,然後等待應答。2 伺服器端回應給客戶端乙個ack 1 syn 1的tcp資料...

TCP IP TCP建立連線與釋放連線

tcp ip tcp建立連線與釋放連線 小狼 1.建立連線 三次握手 客戶端傳送乙個syn包給伺服器,然後等待應答 伺服器端回應給客戶端乙個ack 1 syn 1的tcp資料段 客戶必須再次回應伺服器端乙個ack確認資料段 2.釋放連線 四次握手 tcp客戶端傳送乙個fin,關閉客戶端到伺服器端的資...

TCP建立連線與釋放連線

tcp建立連線與釋放連線 最近複習準備 計算機網路 考試,感覺tcp協議建立連線與釋放連線這兩個過程比較重要,所以把自己理解的部分寫下來。1.建立連線 三次握手 1 客戶端傳送乙個syn包給伺服器,然後等待應答。2 伺服器端回應給客戶端乙個ack 1 syn 1的tcp資料段。3 客戶必須再次回應伺...