TCP三次握手
客戶端–發送帶有 SYN 標志的數據包–一次握手–服務端
服務端–發送帶有 SYN/ACK 標志的數據包–二次握手–客戶端
客戶端–發送帶有帶有 ACK 標志的數據包–三次握手–服務端
為什么不是兩次握手?
三次握手的目的是建立可靠的通信信道,說到通訊,簡單來說就是數據的發送與接收,而三次握手最主要的目的就是雙方確認自己與對方的發送與接收是正常的。
如果是兩次握手,服務器端沒有確定客戶端有接受收能力,在傳輸鏈路遇到故障發送時間特別長下,會造成資源浪費 。Client反復發送, 滯后的包傳到了Server,Server又會返回包確認 , 但是由於Client已經清除了上次的包,所以Client會丟棄掉這個包,但是Server又會保持這個相當於“僵屍”的連接.
為什么不是四次握手?
為什么不是四次握手?
沒有必要將第二步的ack+syn拆開發送
第2次握手傳回了ACK,為什么還要傳回SYN?
接收端傳回發送端所發送的ACK是為了告訴客戶端,我接收到的信息確實就是你所發送的信號了,這表明從客戶端到服務端的通信是正常的。而回傳SYN則是為了建立並確認從服務端到客戶端的通信。
第三次沒有收到ACK包會怎樣?
由於Server沒有收到ACK確認,因此會重發之前的SYN+ACK(默認重發五次,之后自動關閉連接),Client收到后會重新傳ACK給Server。如果 Client向服務器發送數據,服務器會以RST包響應。
如果已經建立了連接,但客戶端出現了故障怎么辦?
服務器每收到一次客戶端的請求后都會重新復位一個計時器,時間通常是設置為2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以后每隔75秒鍾發送一次。若一連發送10個探測報文仍然沒反應,服務器就認為客戶端出了故障,接着就關閉連接。
初始序列號是什么?
TCP連接的一方A,隨機選擇一個
32位的序列號作為發送數據的初始序列號,比如為1000,以該序列號為原點,對要傳送的數據進行編號:1001、1002...三次握手時,把這個初始序列號傳送給另一方B,以便在傳輸數據時,B可以確認什么樣的數據編號是合法的;同時在進行數據傳輸時,
A還可以確認B收到的每一個字節,如果A收到了B的確認編號(acknowledge number)是2001,就說明編號為1001-2000的數據已經被B成功接受。