三次握手和四次揮手

在面試中,三次握手和四次揮手可以說是問的最頻繁的一個知識點了,我相信大家也都看過很多關于三次握手與四次揮手的文章,今天的這篇文章,重點是圍繞著面試,我們應該掌握哪些比較重要的點,哪些是比較被面試官給問到的,我覺得如果你能把我下面列舉的一些點都記住、理解,我想就差不多了。

三次握手

當面試官問你為什么需要有三次握手、三次握手的作用、講講三次三次握手的時候,我想很多人會這樣回答:
首先很多人會先講下握手的過程:

  • 第一次握手: 客戶端給服務器發送一個 SYN(0) 報文。

  • 第二次握手: 服務器收到 SYN(0) 報文之后,會應答一個 SYN(1)+ACK(0) 報文。

  • 第三次握手: 客戶端收到 SYN(1)+ACK(0) 報文之后,會回應一個 ACK(1) 報文。

服務器收到 ACK 報文之后,三次握手建立完成。

三次握手過程

作用是為了確認雙方的接收與發送能力是否正常。

這里我順便解釋一下為啥只有三次握手才能確認雙方的接受與發送能力是
否正常,而兩次卻不可以:

第一次握手: 客戶端發送網絡包,服務端收到了。這樣服務端就能得出結論:客戶端的發送能力、服務端的接收能力是正常的。

第二次握手: 服務端發包,客戶端收到了。這樣客戶端就能得出結論:服務端的接收、發送能力,客戶端的接收、發送能力是正常的。不過此時服務器并不能確認客戶端的接收能力是否正常。

第三次握手: 客戶端發包,服務端收到了。這樣服務端就能得出結論:客戶端的接收、發送能力正常,服務器自己的發送、接收能力也正常。

因此,需要三次握手才能確認雙方的接收與發送能力是否正常。

這樣回答其實也是可以的,但我覺得,這個過程的我們應該要描述的更詳細一點,因為三次握手的過程中,雙方是由很多狀態的改變的,而這些狀態,也是面試官可能會問的點。所以我覺得在回答三次握手的時候,我們應該要描述的詳細一點,而且描述的詳細一點意味著可以扯久一點。加分的描述我覺得應該是這樣:
剛開始客戶端處于 closed 的狀態,服務端處于 listen 狀態。然后

  • 第一次握手: 客戶端給服務端發一個 SYN 報文,并指明客戶端的初始化序列號ISN(c)。此時客戶端處于 SYN_Send 狀態。

  • 第二次握手: 服務器收到客戶端的 SYN 報文之后,會以自己的 SYN 報文作為應答,并且也是指定了自己的初始化序列號 ISN(s),同時會把客戶端的 ISN + 1 作為 ACK 的值,表示自己已經收到了客戶端的 SYN,此時服務器處于 SYN_REVD 的狀態。

  • 第三次握手: 客戶端收到 SYN 報文之后,會發送一個 ACK 報文,當然,也是一樣把服務器的 ISN + 1 作為 ACK 的值,表示已經收到了服務端的 SYN 報文,此時客戶端處于 establised 狀態。
    服務器收到 ACK 報文之后,也處于 establised 狀態,此時,雙方以建立起了鏈接。

三次握手的作用

三次握手的作用也是有好多的,多記住幾個,保證不虧。例如:

確認雙方的接受能力、發送能力是否正常。
指定自己的初始化序列號,為后面的可靠傳送做準備。
如果是 https 協議的話,三次握手這個過程,還會進行數字證書的驗證以及加密密鑰的生成到。

單單這樣還不足以應付三次握手,面試官可能還會問一些其他的問題,例如:

1、(ISN)是固定的嗎?

三次握手的一個重要功能是客戶端和服務端交換ISN(Initial Sequence Number), 以便讓對方知道接下來接收數據的時候如何按序列號組裝數據。

如果ISN是固定的,攻擊者很容易猜出后續的確認號,因此 ISN 是動態生成的。

2、什么是半連接隊列

服務器第一次收到客戶端的 SYN 之后,就會處于 SYN_RCVD 狀態,此時雙方還沒有完全建立其連接,服務器會把此種狀態下請求連接放在一個隊列里,我們把這種隊列稱之為半連接隊列。當然還有一個全連接隊列,就是已經完成三次握手,建立起連接的就會放在全連接隊列中。如果隊列滿了就有可能會出現丟包現象。

這里在補充一點關于SYN-ACK 重傳次數的問題:服務器發送完SYN-ACK包,如果未收到客戶確認包,服務器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超 過系統規定的最大重傳次數,系統將該連接信息從半連接隊列中刪除。注意,每次重傳等待的時間不一定相同,一般會是指數增長,例如間隔時間為 1s, 2s, 4s, 8s, ….

3、三次握手過程中可以攜帶數據嗎

很多人可能會認為三次握手都不能攜帶數據,其實第三次握手的時候,是可以攜帶數據的。也就是說,第一次、第二次握手不可以攜帶數據,而第三次握手是可以攜帶數據的。

為什么這樣呢?大家可以想一個問題,假如第一次握手可以攜帶數據的話,如果有人要惡意攻擊服務器,那他每次都在第一次握手中的 SYN 報文中放入大量的數據,因為攻擊者根本就不理服務器的接收、發送能力是否正常,然后瘋狂著重復發 SYN 報文的話,這會讓服務器花費很多時間、內存空間來接收這些報文。也就是說,第一次握手可以放數據的話,其中一個簡單的原因就是會讓服務器更加容易受到攻擊了。

而對于第三次的話,此時客戶端已經處于 established 狀態,也就是說,對于客戶端來說,他已經建立起連接了,并且也已經知道服務器的接收、發送能力是正常的了,所以能攜帶數據頁沒啥毛病。

關于三次握手的,https 的認證過程能知道一下最好,不過我就不說了,留著寫 http 面試相關時的文章再說。

四次揮手

四次揮手也一樣,千萬不要對方一個 FIN 報文,我方一個 ACK 報文,再我方一個 FIN 報文,我方一個 ACK 報文。然后結束,最好是說的詳細一點,例如想下面這樣就差不多了,要把每個階段的狀態記好,我上次面試就被問了幾個了,呵呵。我答錯了,還以為自己答對了,當時還解釋的頭頭是道,呵呵。

剛開始雙方都處于 establised 狀態,假如是客戶端先發起關閉請求,則:

  1. 第一次揮手: 客戶端發送一個 FIN 報文,報文中會指定一個序列號。此時客戶端處于CLOSED_WAIT1狀態。

  2. 第二次握手: 服務端收到 FIN 之后,會發送 ACK 報文,且把客戶端的序列號值 + 1 作為 ACK 報文的序列號值,表明已經收到客戶端的報文了,此時服務端處于CLOSE_WAIT2狀態。

  3. 第三次揮手: 如果服務端也想斷開連接了,和客戶端的第一次揮手一樣,發給 FIN 報文,且指定一個序列號。此時服務端處于 LAST_ACK 的狀態。

  4. 第四次揮手: 客戶端收到 FIN 之后,一樣發送一個 ACK 報文作為應答,且把服務端的序列號值 + 1 作為自己 ACK 報文的序列號值,此時客戶端處于 TIME_WAIT 狀態。需要過一陣子以確保服務端收到自己的 ACK 報文之后才會進入 CLOSED 狀態

  5. 服務端收到 ACK 報文之后,就處于關閉連接了,處于 CLOSED 狀態。

image

這里特別需要主要的就是TIME_WAIT這個狀態了,這個是面試的高頻考點,就是要理解,為什么客戶端發送 ACK 之后不直接關閉,而是要等一陣子才關閉。這其中的原因就是,要確保服務器是否已經收到了我們的 ACK 報文,如果沒有收到的話,服務器會重新發 FIN 報文給客戶端,客戶端再次收到 FIN 報文之后,就知道之前的 ACK 報文丟失了,然后再次發送 ACK 報文。

至于 TIME_WAIT 持續的時間至少是一個報文的來回時間。一般會設置一個計時,如果過了這個計時沒有再次收到 FIN 報文,則代表對方成功就是 ACK 報文,此時處于 CLOSED 狀態。

這里我給出每個狀態所包含的含義,有興趣的可以看看。

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 - 沒有任何連接狀態;

再放個三次握手與四次揮手的圖

三次握手與四次揮手

簡述一下在瀏覽器中輸入www.baidu.com的過程

  1. 先要解析出www.baidu.com對應的ip地址

    • 先要知道默認網關的mac地址
      • 使用arp獲取默認網關的mac地址
    • 組織數據發送給默認網關(IP還是DNS服務器的IP,但是mac地址是默認網關的mac地址)
    • 默認網關擁有轉發數據的能力,把數據轉發給路由器
    • 路由器根據自己的路由協議,來選擇一個合適的較快的路徑,轉發數據給目的網關
    • 目的網關(DNS服務器所在的網管),把數據轉發給DNS服務器
    • DNS服務器查詢解析出baidu.com對應的IP地址,并將它原路返回給請求這個域名的clinet
  2. 得到了baidu.com對應的IP地址之后,會發送tcp的三次握手,進行連接

  3. 使用http協議發送請求數據給web服務器

  4. web服務器收到數據請求之后,通過查詢自己的服務器得到相應的結果,原路返回給瀏覽器

  5. 瀏覽器收到數據后,通過瀏覽器自己的渲染功能來顯示這個網頁

  6. 瀏覽器關閉TCP連接,即4次揮手

完成整個訪問過程

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

推薦閱讀更多精彩內容