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

? ? ? ? ? 簡析TCP的三次握手與四次揮手

TCP是什么?

具體的關于TCP是什么,我不打算詳細的說了;當你看到這篇文章時,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我們就繼續。它只是一個超級麻煩的協議,而它又是互聯網的基礎,也是每個程序員必備的基本功。首先來看看OSI的七層模型:(osi開放式系統互聯)

我們需要知道TCP工作在網絡OSI的七層模型中的第四層——Transport層,IP在第三層——Network層,ARP在第二層——Data Link層;在第二層上的數據,我們把它叫Frame,在第三層上的數據叫

Packet,第四層的數據叫Segment。同時,我們需要簡單的知道,數據從應用層發下來,會在每一層都會加上頭部信息,進行封裝,然后再發送到數據接收端。這個基本的流程你需要知道,就是每個數據都會經過數據的封裝和解封裝的過程。在OSI七層模型中,每一層的作用和對應的協議如下:

TCP是一個協議,那這個協議是如何定義的,它的數據格式是什么樣子的呢?要進行更深層次的剖析,就需要了解,甚至是熟記TCP協議中每個字段的含義。哦,來吧。

特別重要:

上面就是TCP協議頭部的格式,由于它太重要了,是理解其它內容的基礎,下面就將每個字段的信息都詳細的說明一下。

Source Port和Destination

Port:分別占用16位,表示源端口號和目的端口號;用于區別主機中的不同進程,而IP地址是用來區分不同的主機的,源端口號和目的端口號配合上IP首部中的源IP地址和目的IP地址就能唯一的確定一個TCP連接;

Sequence Number:用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的的第一個數據字節在數據流中的序號;主要用來解決網絡報亂序的問題;

Acknowledgment Number:32位確認序列號包含發送確認的一端所期望收到的下一個序號,因此,確認序號應當是上次已成功收到數據字節序號加1。不過,只有當標志位中的ACK標志(下面介紹)為1時該確認序列號的字段才有效。主要用來解決不丟包的問題;

Offset:給出首部中32 bit字的數目,需要這個值是因為任選字段的長度是可變的。這個字段占4bit

(最多能表示15個32bit的的字,即4*15=60個字節的首部長度),因此TCP最多有60字節的首部。然而,沒有任選字段,正常的長度是20字節;

TCP Flags:TCP首部中有6個標志比特,它們中的多個可同時被設置為1,主要是用于操控TCP的狀態機的,依次為URG,ACK,PSH,RST,SYN,FIN。每個標志位的意思如下:

URG:此標志表示TCP包的緊急指針域(后面馬上就要說到)有效,用來保證TCP連接不被中斷,并且督促中間層設備要盡快處理這些數據;

ACK:此標志表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP數據包中;有兩個取值:0和1,為1的時候表示應答域有效,反之為0;

PSH:這個標志位表示Push操作。所謂Push操作就是指在數據包到達接收端以后,立即傳送給應用程序,而不是在緩沖區中排隊;

RST:這個標志表示連接復位請求。用來復位那些產生錯誤的連接,也被用來拒絕錯誤和非法的數據包;

SYN:表示同步序號,用來建立連接。SYN標志位和ACK標志位搭配使用,當連接請求的時

候,SYN=1,ACK=0;連接被響應的時候,SYN=1,ACK=1;這個標志的數據包經常被用來進行端口掃描。掃描者發送一個只有SYN的數據包,如果對方主機響應了一個數據包回來,就表明這臺主機存在這個端口;但是由于這種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機器不很安全,一臺安全的主機將會強制要求一個連接嚴格的進行TCP的三次握手;

FIN:表示發送端已經達到數據末尾,也就是說雙方的數據傳送完成,沒有數據可以傳送了,發送FIN標志位的TCP數據包后,連接將被斷開。這個標志的數據包也經常被用于進行端口掃描。

Window:窗口大小,也就是有名的滑動窗口,用來進行流量控制;這是一個復雜的問題,這篇博文中并不會進行總結的;

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

三次握手又是什么?

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

多么清晰的一張圖,當然了,也不是我畫的,我也只是引用過來說明問題了。

1.第一次握手:建立連接。客戶端發送連接請求報文段,將SYN位置為1,Sequence Number為x;然后,客戶端進入SYN_SEND狀態,等待服務器的確認;

2.第二次握手:服務器收到SYN報文段。

服務器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設置Acknowledgment

Number為x+1(Sequence Number+1);同時,自己還要發送SYN請求信息,將SYN位置為1,Sequence

Number為y;服務器端將上述所有信息放到一個報文段

(即SYN+ACK報文段)中,一 并發送給客戶端,此時服務器進入SYN_RECV狀態;

3.第三次握手:客戶端收到服務器的SYN+ACK報文段。然后將Acknowledgment Number設置為y+1,向服務器發送ACK報文段,這個報文段發送完畢以后,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。完成了三次握手,客戶端和服務器端就可以開始傳送數據。以上就是TCP三次握手的總體介紹。

那四次分手呢?

當客戶端和服務器通過三次握手建立了TCP連接以后,當數據傳送完畢,肯定是要斷開TCP連接的啊。

那對于TCP的斷開連接,這里就有了神秘的“四次分手”。

1.第一次分手:主機1(可以使客戶端,也可以是服務器端),設

置Sequence Number和Acknowledgment Number,向主機2發送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有數據要發送給主機2了;

主機1—FIN—>主機2(確認沒有數據傳了)

2.第二次分手:主機2收到了主機1發送的FIN報文段,向主機1回一個ACK報文

段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機

1,我也沒有數據要發送了,可以進行關閉連接了;

主機2—ACK—>主機1(確認沒有數據傳了)

3.第三次分手:主機2向主機1發送FIN報文段,請求關閉連接,同時主機2進入CLOSE_WAIT狀態;

主機2—FIN—>主機1(請求關閉)

4.第四次分手:主機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連接。如果要正確的理解四次分手的原理,就需要了解四次分手過程中的狀態變化。

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狀態還有時常常可以用netstat看到。(主動方)

FIN_WAIT_2:上面已經詳細解釋了這種狀態,實際上FIN_WAIT_2狀態下的SOCKET,表示半連接,也即有一方要求close連接,但另外還告訴對方,我暫時還有點數據需要傳送給你(ACK信息),稍后再關閉連接。(主動方)

CLOSE_WAIT:這種狀態的含義其實是表示在等待關閉。怎么理解呢?當對方close一個SOCKET后發送FIN報文給自己,你系統毫無疑問地會回應一個ACK報文給對方,此時則進入到CLOSE_WAIT狀態。接下來呢,實際上你真正需要考慮的事情是察看你是否還有數據發送給對方,如果沒有的話,那么你也就可以close這個SOCKET,發送FIN報文給對方,也即關閉連接。所以你在CLOSE_WAIT狀態下,需要完成的事情是等待你去關閉連接。(被動方)

LAST_ACK:這個狀態還是比較容易好理解的,它是被動關閉一方在發送FIN報文后,最后等待對方

的ACK報文。當收到ACK報文后,也即可以進入到CLOSED可用狀態了。(被動方)

TIME_WAIT:表示收到了對方的FIN報文,并發送出了ACK報文,就等2MSL后即可回到CLOSED可用狀態了。如果FINWAIT1狀態下,收到了對方同時帶FIN標志和ACK標志的報文時,可以直接進入

到TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態。(主動方)

CLOSED:表示連接中斷。

我想你應該懂了

總結到這里,也該結束了,但是對于TCP的學習遠還沒有結束。TCP是一個非常復雜的協議,這里稍微總結了一下TCP的連接與斷開連接是發生的事情,其中還有很多的“坑”,讓我們后續有時間再繼續填吧。好了,完畢!

2016年3月28日于大連

王輝

[王輝1]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容