一個工作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帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!