在面試中,三次握手和四次揮手可以說是問的最頻繁的一個知識點了逞刷,我相信大家也都看過很多關于三次握手與四次揮手的文章嘉涌,今天的這篇文章,重點是圍繞著面試夸浅,我們應該掌握哪些比較重要的點仑最,哪些是比較被面試官給問到的,我覺得如果你能把我下面列舉的一些點都記住题篷、理解词身,我想就差不多了厅目。
三次握手
當面試官問你為什么需要有三次握手番枚、三次握手的作用、講講三次三次握手的時候损敷,我想很多人會這樣回答:
首先很多人會先講下握手的過程:
第一次握手: 客戶端給服務器發(fā)送一個 SYN(0) 報文葫笼。
第二次握手: 服務器收到 SYN(0) 報文之后,會應答一個 SYN(1)+ACK(0) 報文拗馒。
第三次握手: 客戶端收到 SYN(1)+ACK(0) 報文之后路星,會回應一個 ACK(1) 報文。
服務器收到 ACK 報文之后,三次握手建立完成洋丐。
作用是為了確認雙方的接收與發(fā)送能力是否正常呈昔。
這里我順便解釋一下為啥只有三次握手才能確認雙方的接受與發(fā)送能力是
否正常,而兩次卻不可以:第一次握手: 客戶端發(fā)送網絡包友绝,服務端收到了堤尾。這樣服務端就能得出結論:客戶端的發(fā)送能力、服務端的接收能力是正常的迁客。
第二次握手: 服務端發(fā)包郭宝,客戶端收到了。這樣客戶端就能得出結論:服務端的接收掷漱、發(fā)送能力粘室,客戶端的接收、發(fā)送能力是正常的卜范。不過此時服務器并不能確認客戶端的接收能力是否正常衔统。
第三次握手: 客戶端發(fā)包,服務端收到了先朦。這樣服務端就能得出結論:客戶端的接收缰冤、發(fā)送能力正常,服務器自己的發(fā)送喳魏、接收能力也正常棉浸。
因此,需要三次握手才能確認雙方的接收與發(fā)送能力是否正常刺彩。
這樣回答其實也是可以的迷郑,但我覺得,這個過程的我們應該要描述的更詳細一點创倔,因為三次握手的過程中嗡害,雙方是由很多狀態(tài)的改變的,而這些狀態(tài)畦攘,也是面試官可能會問的點霸妹。所以我覺得在回答三次握手的時候,我們應該要描述的詳細一點知押,而且描述的詳細一點意味著可以扯久一點叹螟。加分的描述我覺得應該是這樣:
剛開始客戶端處于 closed 的狀態(tài),服務端處于 listen 狀態(tài)台盯。然后
第一次握手: 客戶端給服務端發(fā)一個 SYN 報文罢绽,并指明客戶端的初始化序列號ISN(c)。此時客戶端處于 SYN_Send 狀態(tài)静盅。
第二次握手: 服務器收到客戶端的 SYN 報文之后良价,會以自己的 SYN 報文作為應答,并且也是指定了自己的初始化序列號 ISN(s),同時會把客戶端的 ISN + 1 作為 ACK 的值明垢,表示自己已經收到了客戶端的 SYN蚣常,此時服務器處于 SYN_REVD 的狀態(tài)。
第三次握手: 客戶端收到 SYN 報文之后痊银,會發(fā)送一個 ACK 報文史隆,當然,也是一樣把服務器的 ISN + 1 作為 ACK 的值曼验,表示已經收到了服務端的 SYN 報文泌射,此時客戶端處于 establised 狀態(tài)。
服務器收到 ACK 報文之后鬓照,也處于 establised 狀態(tài)熔酷,此時,雙方以建立起了鏈接豺裆。
三次握手的作用
三次握手的作用也是有好多的拒秘,多記住幾個,保證不虧臭猜。例如:
確認雙方的接受能力躺酒、發(fā)送能力是否正常。
指定自己的初始化序列號蔑歌,為后面的可靠傳送做準備羹应。
如果是 https 協議的話,三次握手這個過程次屠,還會進行數字證書的驗證以及加密密鑰的生成到园匹。
單單這樣還不足以應付三次握手,面試官可能還會問一些其他的問題劫灶,例如:
1裸违、(ISN)是固定的嗎?
三次握手的一個重要功能是客戶端和服務端交換ISN(Initial Sequence Number), 以便讓對方知道接下來接收數據的時候如何按序列號組裝數據。
如果ISN是固定的本昏,攻擊者很容易猜出后續(xù)的確認號供汛,因此 ISN 是動態(tài)生成的。
2涌穆、什么是半連接隊列
服務器第一次收到客戶端的 SYN 之后怔昨,就會處于 SYN_RCVD 狀態(tài),此時雙方還沒有完全建立其連接蒲犬,服務器會把此種狀態(tài)下請求連接放在一個隊列里朱监,我們把這種隊列稱之為半連接隊列岸啡。當然還有一個全連接隊列原叮,就是已經完成三次握手,建立起連接的就會放在全連接隊列中。如果隊列滿了就有可能會出現丟包現象奋隶。
這里在補充一點關于SYN-ACK 重傳次數的問題:服務器發(fā)送完SYN-ACK包擂送,如果未收到客戶確認包,服務器進行首次重傳唯欣,等待一段時間仍未收到客戶確認包嘹吨,進行第二次重傳,如果重傳次數超 過系統(tǒng)規(guī)定的最大重傳次數境氢,系統(tǒng)將該連接信息從半連接隊列中刪除蟀拷。注意,每次重傳等待的時間不一定相同萍聊,一般會是指數增長问芬,例如間隔時間為 1s, 2s, 4s, 8s, ….
3、三次握手過程中可以攜帶數據嗎
很多人可能會認為三次握手都不能攜帶數據寿桨,其實第三次握手的時候此衅,是可以攜帶數據的。也就是說亭螟,第一次挡鞍、第二次握手不可以攜帶數據,而第三次握手是可以攜帶數據的预烙。
為什么這樣呢?大家可以想一個問題墨微,假如第一次握手可以攜帶數據的話,如果有人要惡意攻擊服務器扁掸,那他每次都在第一次握手中的 SYN 報文中放入大量的數據欢嘿,因為攻擊者根本就不理服務器的接收、發(fā)送能力是否正常也糊,然后瘋狂著重復發(fā) SYN 報文的話炼蹦,這會讓服務器花費很多時間、內存空間來接收這些報文狸剃。也就是說掐隐,第一次握手可以放數據的話,其中一個簡單的原因就是會讓服務器更加容易受到攻擊了钞馁。
而對于第三次的話虑省,此時客戶端已經處于 established 狀態(tài),也就是說僧凰,對于客戶端來說探颈,他已經建立起連接了,并且也已經知道服務器的接收训措、發(fā)送能力是正常的了伪节,所以能攜帶數據頁沒啥毛病光羞。
關于三次握手的,https 的認證過程能知道一下最好怀大,不過我就不說了纱兑,留著寫 http 面試相關時的文章再說。
四次揮手
四次揮手也一樣化借,千萬不要對方一個 FIN 報文潜慎,我方一個 ACK 報文,再我方一個 FIN 報文蓖康,我方一個 ACK 報文铐炫。然后結束,最好是說的詳細一點蒜焊,例如想下面這樣就差不多了驳遵,要把每個階段的狀態(tài)記好,我上次面試就被問了幾個了山涡,呵呵堤结。我答錯了,還以為自己答對了鸭丛,當時還解釋的頭頭是道竞穷,呵呵。
剛開始雙方都處于 establised 狀態(tài)鳞溉,假如是客戶端先發(fā)起關閉請求瘾带,則:
第一次揮手: 客戶端發(fā)送一個 FIN 報文,報文中會指定一個序列號熟菲。此時客戶端處于CLOSED_WAIT1狀態(tài)看政。
第二次握手: 服務端收到 FIN 之后,會發(fā)送 ACK 報文抄罕,且把客戶端的序列號值 + 1 作為 ACK 報文的序列號值允蚣,表明已經收到客戶端的報文了,此時服務端處于CLOSE_WAIT2狀態(tài)呆贿。
第三次揮手: 如果服務端也想斷開連接了嚷兔,和客戶端的第一次揮手一樣,發(fā)給 FIN 報文做入,且指定一個序列號冒晰。此時服務端處于 LAST_ACK 的狀態(tài)。
第四次揮手: 客戶端收到 FIN 之后竟块,一樣發(fā)送一個 ACK 報文作為應答壶运,且把服務端的序列號值 + 1 作為自己 ACK 報文的序列號值,此時客戶端處于 TIME_WAIT 狀態(tài)浪秘。需要過一陣子以確保服務端收到自己的 ACK 報文之后才會進入 CLOSED 狀態(tài)
服務端收到 ACK 報文之后蒋情,就處于關閉連接了埠况,處于 CLOSED 狀態(tài)。
這里特別需要主要的就是TIME_WAIT這個狀態(tài)了恕出,這個是面試的高頻考點,就是要理解违帆,為什么客戶端發(fā)送 ACK 之后不直接關閉浙巫,而是要等一陣子才關閉。這其中的原因就是刷后,要確保服務器是否已經收到了我們的 ACK 報文的畴,如果沒有收到的話,服務器會重新發(fā) FIN 報文給客戶端尝胆,客戶端再次收到 FIN 報文之后丧裁,就知道之前的 ACK 報文丟失了,然后再次發(fā)送 ACK 報文含衔。
至于 TIME_WAIT 持續(xù)的時間至少是一個報文的來回時間煎娇。一般會設置一個計時,如果過了這個計時沒有再次收到 FIN 報文贪染,則代表對方成功就是 ACK 報文缓呛,此時處于 CLOSED 狀態(tài)。
這里我給出每個狀態(tài)所包含的含義杭隙,有興趣的可以看看哟绊。
LISTEN - 偵聽來自遠方TCP端口的連接請求;
SYN-SENT -在發(fā)送連接請求后等待匹配的連接請求;
SYN-RECEIVED - 在收到和發(fā)送一個連接請求后等待對連接請求的確認;
ESTABLISHED - 代表一個打開的連接,數據可以傳送給用戶;
FIN-WAIT-1 - 等待遠程TCP的連接中斷請求痰憎,或先前的連接中斷請求的確認;
FIN-WAIT-2 - 從遠程TCP等待連接中斷請求;
CLOSE-WAIT - 等待從本地用戶發(fā)來的連接中斷請求;
CLOSING -等待遠程TCP對連接中斷的確認;
LAST-ACK - 等待原來發(fā)向遠程TCP的連接中斷請求的確認;
TIME-WAIT -等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認;
CLOSED - 沒有任何連接狀態(tài);
再放個三次握手與四次揮手的圖
簡述一下在瀏覽器中輸入www.baidu.com的過程
先要解析出www.baidu.com對應的ip地址
- 先要知道默認網關的mac地址
- 使用arp獲取默認網關的mac地址
- 組織數據發(fā)送給默認網關(IP還是DNS服務器的IP票髓,但是mac地址是默認網關的mac地址)
- 默認網關擁有轉發(fā)數據的能力,把數據轉發(fā)給路由器
- 路由器根據自己的路由協議铣耘,來選擇一個合適的較快的路徑洽沟,轉發(fā)數據給目的網關
- 目的網關(DNS服務器所在的網管),把數據轉發(fā)給DNS服務器
- DNS服務器查詢解析出baidu.com對應的IP地址蜗细,并將它原路返回給請求這個域名的clinet
得到了baidu.com對應的IP地址之后玲躯,會發(fā)送tcp的三次握手,進行連接
使用http協議發(fā)送請求數據給web服務器
web服務器收到數據請求之后鳄乏,通過查詢自己的服務器得到相應的結果跷车,原路返回給瀏覽器
瀏覽器收到數據后,通過瀏覽器自己的渲染功能來顯示這個網頁
瀏覽器關閉TCP連接橱野,即4次揮手
完成整個訪問過程