原文:
tcp是什麼?
具體的關於tcp是什麼,我不打算詳細的說了;當你看到這篇文章時,我想你也知道tcp的概念了,想要更深入的了解tcp的工作,我們就繼續。它只是乙個超級麻煩的協議,而它又是網際網路的基礎,也是每個程式設計師必備的基本功。首先來看看osi的七層模型:
我們需要知道tcp工作在網路osi的七層模型中的第四層——transport層,ip在第三層——network層,arp在第二層——data link層;在第二層上的資料,我們把它叫frame,在第三層上的資料叫packet,第四層的資料叫segment。 同時,我們需要簡單的知道,資料從應用層發下來,會在每一層都會加上頭部資訊,進行封裝,然後再傳送到資料接收端。這個基本的流程你需要知道,就是每個資料都會經過資料的封裝和解封裝的過程。 在osi七層模型中,每一層的作用和對應的協議如下:
tcp是乙個協議,那這個協議是如何定義的,它的資料格式是什麼樣子的呢?要進行更深層次的剖析,就需要了解,甚至是熟記tcp協議中每個欄位的含義。哦,來吧。
上面就是tcp協議頭部的格式,由於它太重要了,是理解其它內容的基礎,下面就將每個欄位的資訊都詳細的說明一下。
window:視窗大小,也就是有名的滑動視窗,用來進行流量控制;這是乙個複雜的問題,這篇博文中並不會進行總結的;
好了,基本知識都已經準備好了,開始下一段的征程吧。
三次握手又是什麼?
tcp是面向連線的,無論哪一方向另一方傳送資料之前,都必須先在雙方之間建立一條連線。在tcp/ip協議中,tcp協議提供可靠的連線服務,連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp視窗大小資訊。這就是面試中經常會被問到的tcp三次握手。只是了解tcp三次握手的概念,對你獲得乙份工作是沒有任何幫助的,你需要去了解tcp三次握手中的一些細節。先來看圖說話。
多麼清晰的一張圖,當然了,也不是我畫的,我也只是引用過來說明問題了。
第一次握手:建立連線。客戶端傳送連線請求報文段,將syn
位置為1,sequence number
為x;然後,客戶端進入syn_send
狀態,等待伺服器的確認;
第二次握手:伺服器收到syn
報文段。伺服器收到客戶端的syn
報文段,需要對這個syn
報文段進行確認,設定acknowledgment number
為x+1(sequence number
+1);同時,自己自己還要傳送syn
請求資訊,將syn
位置為1,sequence number
為y;伺服器端將上述所有資訊放到乙個報文段(即syn+ack
報文段)中,一併傳送給客戶端,此時伺服器進入syn_recv
狀態;
第三次握手:客戶端收到伺服器的syn+ack
報文段。然後將acknowledgment number
設定為y+1,向伺服器傳送ack
報文段,這個報文段傳送完畢以後,客戶端和伺服器端都進入established
狀態,完成tcp三次握手。
完成了三次握手,客戶端和伺服器端就可以開始傳送資料。以上就是tcp三次握手的總體介紹。
那四次分手呢?
當客戶端和伺服器通過三次握手建立了tcp連線以後,當資料傳送完畢,肯定是要斷開tcp連線的啊。那對於tcp的斷開連線,這裡就有了神秘的「四次分手」。
第一次分手:主機1(可以使客戶端,也可以是伺服器端),設定sequence number
和acknowledgment number
,向主機2傳送乙個fin
報文段;此時,主機1進入fin_wait_1
狀態;這表示主機1沒有資料要傳送給主機2了;
第二次分手:主機2收到了主機1傳送的fin
報文段,向主機1回乙個ack
報文段,acknowledgment number
為sequence number
加1;主機1進入fin_wait_2
狀態;主機2告訴主機1,我「同意」你的關閉請求;
第三次分手:主機2向主機1傳送fin
報文段,請求關閉連線,同時主機2進入last_ack
狀態;
第四次分手:主機1收到主機2傳送的fin
報文段,向主機2傳送ack
報文段,然後主機1進入time_wait
狀態;主機2收到主機1的ack
報文段以後,就關閉連線;此時,主機1等待2msl後依然沒有收到回覆,則證明server端已正常關閉,那好,主機1也可以關閉連線了。
至此,tcp的四次分手就這麼愉快的完成了。當你看到這裡,你的腦子裡會有很多的疑問,很多的不懂,感覺很凌亂;沒事,我們繼續總結。
為什麼要三次握手
既然總結了tcp的三次握手,那為什麼非要三次呢?怎麼覺得兩次就可以完成了。那tcp為什麼非要進行三次連線呢?在謝希仁的《計算機網路》中是這樣說的:
為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤。在書中同時舉了乙個例子,如下:
「已失效的連線請求報文段」的產生在這樣一種情況下:client發出的第乙個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。本來這是乙個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的乙個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用「三次握手」,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。採用「三次握手」的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連線。」這就很明白了,防止了伺服器端的一直等待而浪費資源。
為什麼要四次分手
那四次分手又是為何呢?tcp協議是一種面向連線的、可靠的、基於位元組流的運輸層通訊協議。tcp是全雙工模式,這就意味著,當主機1發出fin
報文段時,只是表示主機1已經沒有資料要傳送了,主機1告訴主機2,它的資料已經全部傳送完畢了;但是,這個時候主機1還是可以接受來自主機2的資料;當主機2返回ack
報文段時,表示它已經知道主機1沒有資料傳送了,但是主機2還是可以傳送資料到主機1的;當主機2也傳送了fin
報文段時,這個時候就表示主機2也沒有資料要傳送了,就會告訴主機1,我也沒有資料要傳送了,之後彼此就會愉快的中斷這次tcp連線。如果要正確的理解四次分手的原理,就需要了解四次分手過程中的狀態變化。
我想你應該懂了
簡析TCP的三次握手與四次分手
tcp是什麼?具體的關於tcp是什麼,我不打算詳細的說了 當你看到這篇文章時,我想你也知道tcp的概念了,想要更深入的了解tcp的工作,我們就繼續。它只是乙個超級麻煩的協議,而它又是網際網路的基礎,也是每個程式設計師必備的基本功。首先來看看osi的七層模型 我們需要知道tcp工作在網路osi的七層模...
10004 簡析TCP的三次握手與四次分手
原文 具體的關於tcp是什麼,我不打算詳細的說了 當你看到這篇文章時,我想你也知道tcp的概念了,想要更深入的了解tcp的工作,我們就繼續。它只是乙個超級麻煩的協議,而它又是網際網路的基礎,也是每個程式設計師必備的基本功。首先來看看osi的七層模型 我們需要知道tcp工作在網路osi的七層模型中的第...
簡析TCP的三次握手與四次分手《轉》
tcp是什麼?具體的關於tcp是什麼,我不打算詳細的說了 當你看到這篇文章時,我想你也知道tcp的概念了,想要更深入的了解tcp的工作,我們就繼續。它只是乙個超級麻煩的協議,而它又是網際網路的基礎,也是每個程式設計師必備的基本功。首先來看看osi的七層模型 window 視窗大小,也就是有名的滑動視...