簡析TCP的三次握手與四次分手《轉》

2021-09-07 11:36:55 字數 3101 閱讀 5904

tcp是什麼?

具體的關於tcp是什麼,我不打算詳細的說了;當你看到這篇文章時,我想你也知道tcp的概念了,想要更深入的了解tcp的工作,我們就繼續。它只是乙個超級麻煩的協議,而它又是網際網路的基礎,也是每個程式設計師必備的基本功。首先來看看osi的七層模型:

window:視窗大小,也就是有名的滑動視窗,用來進行流量控制;這是乙個複雜的問題,這篇博文中並不會進行總結的;

好了,基本知識都已經準備好了,開始下一段的征程吧。

三次握手又是什麼?

tcp是面向連線的,無論哪一方向另一方傳送資料之前,都必須先在雙方之間建立一條連線。在tcp/ip協議中,tcp協議提供可靠的連線服務,連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp視窗大小資訊。這就是面試中經常會被問到的tcp三次握手。只是了解tcp三次握手的概念,對你獲得乙份工作是沒有任何幫助的,你需要去了解tcp三次握手中的一些細節。先來看圖說話。

第一次握手:建立連線。客戶端傳送連線請求報文段,將sequence number為x;然後,客戶端進入syn報文段。伺服器收到客戶端的syn報文段進行確認,設定sequence number+1);同時,自己自己還要傳送syn位置為1,syn+ack報文段)中,一併傳送給客戶端,此時伺服器進入syn+ack報文段。然後將ack報文段,這個報文段傳送完畢以後,客戶端和伺服器端都進入完成了三次握手,客戶端和伺服器端就可以開始傳送資料。以上就是tcp三次握手的總體介紹。

那四次分手呢?

當客戶端和伺服器通過三次握手建立了tcp連線以後,當資料傳送完畢,肯定是要斷開tcp連線的啊。那對於tcp的斷開連線,這裡就有了神秘的「四次分手」。

第一次分手:主機1(可以使客戶端,也可以是伺服器端),設定acknowledgment number,向主機2傳送乙個fin_wait_1狀態;這表示主機1沒有資料要傳送給主機2了;

第二次分手:主機2收到了主機1傳送的ack報文段,sequence number加1;主機1進入fin報文段,請求關閉連線,同時主機2進入fin報文段,向主機2傳送time_wait狀態;主機2收到主機1的至此,tcp的四次分手就這麼愉快的完成了。當你看到這裡,你的腦子裡會有很多的疑問,很多的不懂,感覺很凌亂;沒事,我們繼續總結。

為什麼要三次握手

既然總結了tcp的三次握手,那為什麼非要三次呢?怎麼覺得兩次就可以完成了。那tcp為什麼非要進行三次連線呢?在謝希仁的《計算機網路》中是這樣說的:

為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤。
在書中同時舉了乙個例子,如下:

「已失效的連線請求報文段」的產生在這樣一種情況下:client發出的第乙個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。本來這是乙個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的乙個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用「三次握手」,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。採用「三次握手」的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連線。」
這就很明白了,防止了伺服器端的一直等待而浪費資源。

根本目的在於建立的連線讓雙方都知道已經建立了,兩次的話如果第一次的client的請求被耽擱了很久,client超時之後知道上一次沒建立成功。可是這時候建立連線的請求到達了server,那麼server會在發出確認後建立連線。server端會占用資源,而真正的連線並沒有建立成功。引入三次握手之後,同樣的場景,server不會在發出確認後就建立連線,而是要等待client的ack確認,但是由於client傳送的請求超時了,client認為不會建立了,即使收到了server的建立成功確認,client也不會響應而直接拋棄,那麼server等待超時之後也就放棄了本次連線。

為什麼要四次分手

那四次分手又是為何呢?tcp協議是一種面向連線的、可靠的、基於位元組流的運輸層通訊協議。tcp是全雙工模式,這就意味著,當主機1發出ack報文段時,表示它已經知道主機1沒有資料傳送了,但是主機2還是可以傳送資料到主機1的;當主機2也傳送了

fin_wait_1fin_wait_1狀態實際上是當socket在established狀態時,它想主動關閉連線,向對方傳送了fin_wait_1狀態。而當對方回應ack報文後,則進入到fin_wait_1狀態一般是比較難見到的,而fin_wait_2:上面已經詳細解釋了這種狀態,實際上close_wait:這種狀態的含義其實是表示在等待關閉。怎麼理解呢?當對方close乙個socket後傳送close_wait狀態。接下來呢,實際上你真正需要考慮的事情是察看你是否還有資料傳送給對方,如果沒有的話,那麼你也就可以 close這個socket,傳送close_wait狀態下,需要完成的事情是等待你去關閉連線。(被動方)

fin報文後,最後等待對方的ack報文。當收到ack報文後,也即可以進入到closed可用狀態了。(被動方)

time_wait狀態,而無須經過closed: 表示連線中斷。

我想你應該懂了

總結到這裡,也該結束了,但是對於tcp的學習遠還沒有結束。tcp是乙個非常複雜的協議,這裡稍微總結了一下tcp的連線與斷開連線是發生的事情,其中還有很多的「坑」,讓我們後續有時間再繼續填吧。好了,完畢!

簡析TCP的三次握手與四次分手

tcp是什麼?具體的關於tcp是什麼,我不打算詳細的說了 當你看到這篇文章時,我想你也知道tcp的概念了,想要更深入的了解tcp的工作,我們就繼續。它只是乙個超級麻煩的協議,而它又是網際網路的基礎,也是每個程式設計師必備的基本功。首先來看看osi的七層模型 我們需要知道tcp工作在網路osi的七層模...

簡析TCP的三次握手與四次分手

原文 tcp是什麼?具體的關於tcp是什麼,我不打算詳細的說了 當你看到這篇文章時,我想你也知道tcp的概念了,想要更深入的了解tcp的工作,我們就繼續。它只是乙個超級麻煩的協議,而它又是網際網路的基礎,也是每個程式設計師必備的基本功。首先來看看osi的七層模型 我們需要知道tcp工作在網路osi的...

10004 簡析TCP的三次握手與四次分手

原文 具體的關於tcp是什麼,我不打算詳細的說了 當你看到這篇文章時,我想你也知道tcp的概念了,想要更深入的了解tcp的工作,我們就繼續。它只是乙個超級麻煩的協議,而它又是網際網路的基礎,也是每個程式設計師必備的基本功。首先來看看osi的七層模型 我們需要知道tcp工作在網路osi的七層模型中的第...