tcpip協議中最核心的協議是 tcpip協議( 三 )


tcpip協議中最核心的協議是  tcpip協議

文章插圖
三次握手
之一次握手:客戶端將標志位SYN置為1,隨機產生一個值seq=J,并將該數據包發送給服務器端,客戶端進入SYN_SENT狀態,等待服務器端確認 。第二次握手:服務器端收到數據包后由標志位SYN=1知道客戶端請求建立連接,服務器端將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,并將該數據包發送給客戶端以確認連接請求,服務器端進入SYN_RCVD狀態 。第三次握手:客戶端收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,并將該數據包發送給服務器端,服務器端檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,客戶端和服務器端進入ESTABLISHED狀態,完成三次握手,隨后客戶端與服務器端之間可以開始傳輸數據了 。3.2 四次揮手(重點)
四次揮手即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開 。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發 。由于TCP連接是全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務后,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN 。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉 。下面來看看四次揮手的流程圖:
tcpip協議中最核心的協議是  tcpip協議

文章插圖
四次揮手
中斷連接端可以是客戶端,也可以是服務器端 。之一次揮手:客戶端發送一個FIN=M,用來關閉客戶端到服務器端的數據傳送,客戶端進入FIN_WAIT_1狀態 。意思是說"我客戶端沒有數據要發給你了",但是如果你服務器端還有數據沒有發送完成,則不必急著關閉連接,可以繼續發送數據 。第二次揮手:服務器端收到FIN后,先發送ack=M+1,告訴客戶端,你的請求我收到了,但是我還沒準備好,請繼續你等我的消息 。這個時候客戶端就進入FIN_WAIT_2 狀態,繼續等待服務器端的FIN報文 。第三次揮手:當服務器端確定數據已發送完成,則向客戶端發送FIN=N報文,告訴客戶端,好了,我這邊數據發完了,準備好關閉連接了 。服務器端進入LAST_ACK狀態 。第四次揮手:客戶端收到FIN=N報文后,就知道可以關閉連接了,但是他還是不相信 ***,怕服務器端不知道要關閉,所以發送ack=N+1后進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳 。服務器端收到ACK后,就知道可以斷開連接了 ??蛻舳说却?MSL后依然沒有收到回復,則證明服務器端已正常關閉,那好,我客戶端也可以關閉連接了 。最終完成了四次握手 。上面是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況,
具體流程如下圖:
tcpip協議中最核心的協議是  tcpip協議

文章插圖
同時揮手
3.3 通過序列號與確認應答提高可靠性
在 TCP 中,當發送端的數據到達接收主機時,接收端主機會返回一個已收到消息的通知 。這個消息叫做確認應答(ACK) 。當發送端將數據發出之后會等待對端的確認應答 。如果有確認應答,說明數據已經成功到達對端 。反之,則數據丟失的可能性很大 。在一定時間內沒有等待到確認應答,發送端就可以認為數據已經丟失,并進行重發 。由此,即使產生了丟包,仍然能夠保證數據能夠到達對端,實現可靠傳輸 。未收到確認應答并不意味著數據一定丟失 。也有可能是數據對方已經收到,只是返回的確認應答在途中丟失 。這種情況也會導致發送端誤以為數據沒有到達目的地而重發數據 。此外,也有可能因為一些其他原因導致確認應答延遲到達,在源主機重發數據以后才到達的情況也屢見不鮮 。此時,源主機只要按照機制重發數據即可 。對于目標主機來說,反復收到相同的數據是不可取的 。為了對上層應用提供可靠的傳輸,目標主機必須放棄重復的數據包 。為此我們引入了序列號 。序列號是按照順序給發送數據的每一個字節(8位字節)都標上號碼的編號 。接收端查詢接收數據 TCP 首部中的序列號和數據的長度,將自己下一步應該接收的序列號作為確認應答返送回去 。通過序列號和確認應答號,TCP 能夠識別是否已經接收數據,又能夠判斷是否需要接收,從而實現可靠傳輸 。

推薦閱讀