一個作業5年的粉絲,最近去面試了很多公司,每次都被各種技術原理題問得語無倫次,
由于找了快1個月時間的作業,有點焦慮,來向我求助,
我能做的只是保證每天更新一個面試題,然后問他印象最深刻的一個面試題是什么,他說,
“TCP協議為什么要設計三次握手”,
好的,關于這個問題,我們來看看普通人和高手的回答,
普通人:
我認為就是因為TCP它是一個雙工協議,雙工協議就是意味著它可以雙向去進行資料傳輸,
那么既然是資料雙向傳輸的話,那么意味著我兩端都是建立一個通信連接,兩端都是彼此之間雙向建立連接,所有相當于說A要像B建立連接,B要像A建立連接,這兩個之間就是兩次,
在加上在這個建立連接程序中我還需要確認這個連接是不是建立成功,所以在客戶端發送給服務端建立連接的時候需要給個回應,
高手:
關于這個問題,我會從下面3個方面來回答,
-
TCP協議,是一種可靠的,基于位元組流的,面向連接的傳輸層協議,
-
可靠性體現在TCP協議通信雙方的資料傳輸是穩定的,即便是在網路不好的情況下,TCP都能夠保證資料傳輸到目標端,而這個可靠性是基于資料包確認機制來實作的,
-
TCP通信雙方的資料傳輸是通過位元組流來實作傳輸的
-
面向連接,是說資料傳輸之前,必須要建立一個連接,然后基于這個連接進行資料傳輸
-
-
因為TCP是面向連接的協議,所以在進行資料通信之前,需要建立一個可靠的連接,TCP采用了三次握手的方式來實作連接的建立,
所謂的三次握手,就是通信雙方一共需要發送三次請求,才能確保這個連接的建立,
- 客戶端向服務端發送連接請求并攜帶同步序列號SYN,
- 服務端收到請求后,發送SYN和ACK, 這里的SYN表示服務端的同步序列號,ACK表示對前面收到請求的一個確認,表示告訴客戶端,我收到了你的請求,
- 客戶端收到服務端的請求后,再次發送ACK,這個ACK是針對服務端連接的一個確認,表示告訴服務端,我收到了你的請求,

-
之所以TCP要設計三次握手,我認為有三個方面的原因:
- TCP是可靠性通信協議,所以TCP協議的通信雙方都必須要維護一個序列號,去標記已經發送出去的資料包,哪些是已經被對方簽收的,而三次握手就是通信雙方相互告知序列號的起始值,為了確保這個序列號被收到,所以雙方都需要有一個確認的操作,
- TCP協議需要在一個不可靠的網路環境下實作可靠的資料傳輸,意味著通信雙方必須要通過某種手段來實作一個可靠的資料傳輸通道,而三次通信是建立這樣一個通道的最小值,當然還可以四次、五次,只是沒必要浪費這個資源,
- 防止歷史的重復連接初始化造成的混亂問題,比如說在網路比較差的情況下,客戶端連續多次發送建立連接的請求,假設只有兩次握手,那么服務端只能選擇接受或者拒絕這個連接請求,但是服務端不知道這次請求是不是之前因為網路堵塞而過期的請求,也就是說服務端不知道當前客戶端的連接是有效還是無效,
以上就是我對這個問題的理解,
總結
網路通信這塊內容還是比較重要的,面對一些線上網路故障排查的時候,
可以快速的去幫助我們定位問題,并找到解決辦法,
如果有任何面試問題、職業發展問題、學習問題,都可以私信我,另還有Java面試資料和簡歷模板可以免費領取,
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491996.html
標籤:Java
