參考視頻鏈接:b站蛋老師視頻鏈接
握手機制的核心:怎樣的握手能判斷出那些請求或者哪些響應需要丟棄指孤,并不是只能三次握手宾袜,而是至少三次握手才能保證可岂。
TCP報文中有:SYN(synchronization 同步的意思),ACK(acknowledgment 確認的意思),FIN(finish 結束的意思)等標識旗吁,如果設置為1則為開啟,設置為0則為關閉哮肚。
三次握手:
1.客戶端開啟SYN登夫,表示想和服務端進行數(shù)據(jù)的同步,并生成一個序號A允趟,同步以后(即三次握手之后恼策,客戶端就可以和服務端互相發(fā)送消息);
2.服務器收到SYN拼窥,做出響應:在TCP報文中把SYN和ACK開啟(確認同步)戏蔑,服務器也生成一個序號B蹋凝,并生成一個確認號為客戶端的序號A+1;
3.客戶端收到SYN和ACK以及服務器生成的序號B、確認號(A+1)总棵,通過確認號-1對比自身的序號鳍寂,就可以知道握手的對象對不對,再通過服務端給到的序號B和確認號A+1生成自己的序號和確認號情龄,客戶端向服務端發(fā)送迄汛,開啟ACK標識,序號為服務端的確認號骤视,確認號為服務端的序號+1鞍爱;
注:如果每次客戶端發(fā)送SYN,服務器都記住其序號并生成自己需要記住的序號专酗,那服務器需要掛起很多資源睹逃,如果有黑客不斷發(fā)送SYN又不進行下一步,服務器會原地崩潰(DDoS攻擊 )祷肯,所以服務器不保存自己的序號沉填,根據(jù)服務器的ip、端口號等私有信息進行運算得到序號佑笋。
在握手的過程中翼闹,兩端可以根據(jù)序號、確認號蒋纬,或者控制位(1.SYN,2.SYN+ACK,3.ACK)來區(qū)分進行到哪一個步驟,丟棄一些不必要的報文猎荠。
握手之后就建立了連接,客戶端就可以發(fā)送HTTP請求了蜀备,然后服務器做出響應关摇。
假設兩端交互完畢,各自可能發(fā)起關閉連接的要求(四次揮手)(客戶端琼掠、服務端都能主動發(fā)起關閉請求)拒垃。
四次揮手:
假設客戶端主動發(fā)起關閉要求:
1.客戶端開啟FIN和ACK兩個控制位,此時序號和確認號不用固定數(shù)字表示瓷蛙;
2.服務端先發(fā)送ACK確認悼瓮,服務端生成序號、確認號的過程與握手時一致艰猬;
3.此時客戶端不會直接關閉通道横堡,也許服務端還有需要發(fā)送的數(shù)據(jù),等服務端發(fā)送完之后冠桃,會再發(fā)送一個FIN+ACK進行最后確認命贴,此時序號、確認號不需要改變。
4.客戶端得到服務端最終的確認污茵,發(fā)送ACK進行確認,生成序號與確認號規(guī)則與握手時一致葬项;
為什么需要至少四次揮手:可能存在未發(fā)送完畢的數(shù)據(jù)。