在了解三次握手和四次揮手之前,先知道TCP報文內部包含了哪些東西。
TCP報頭中的源端口號和目的端口號同IP數據報中的源IP與目的IP唯一確定一條TCP連
接。TCP在發(fā)送數據前必須在彼此間建立連接,這里連接意思是:雙方需要內保存對方
信息(例如:IP,Port…)
報文主要段的意思
序號:表示發(fā)送的數據字節流,確保TCP傳輸有序,對每個(gè)字節編號
確認序號:發(fā)送方期待接收的下一序列號,接收成功后的數據字節序列號加 1。只有ACK=1時(shí)才有效。
ACK:確認序號的標志,ACK=1表示確認號有效,ACK=0表示報文不含確認序號信息
SYN:連接請求序號標志,用于建立連接,SYN=1表示請求連接
FIN:結束標志,用于釋放連接,為1表示關(guān)閉本方數據流
建立TCP連接時(shí),需要客戶(hù)端和服務(wù)器共發(fā)送3個(gè)包。
第一次:客戶(hù)端發(fā)送初始序號x和syn=1請求標志
第二次:服務(wù)器發(fā)送請求標志syn,發(fā)送確認標志ACK,發(fā)送自己的序號seq=y,
發(fā)送客戶(hù)端的確認序號ack=x+1
第三次:客戶(hù)端發(fā)送ACK確認號,發(fā)送自己的序號seq=x+1,發(fā)送對方的確認號
ack=y+1
第一次:客戶(hù)端發(fā)送請求到服務(wù)器,服務(wù)器知道客戶(hù)端發(fā)送,自己接收正常。
SYN=1,seq=x
第二次:服務(wù)器發(fā)給客戶(hù)端,客戶(hù)端知道自己發(fā)送、接收正常,服務(wù)器接收、發(fā)送正常。ACK=1,ack=x+1,SYN=1,seq=y
第三次:客戶(hù)端發(fā)給服務(wù)器:服務(wù)器知道客戶(hù)端發(fā)送,接收正常,自己接收,發(fā)送也正常.seq=x+1,ACK=1,ack=y+1
上面分析過(guò)程可以看出,握手兩次達不到讓雙方都得出自己、對方的接收、發(fā)送能力都正常的結論的。
第一次揮手:客戶(hù)端發(fā)出釋放FIN=1,自己序列號seq=u,進(jìn)入FIN-WAIT-1狀態(tài)
第二次揮手:服務(wù)器收到客戶(hù)端的后,發(fā)出ACK=1確認標志和客戶(hù)端的確認號ack
=u+1,自己的序列號seq=v,進(jìn)入CLOSE-WAIT狀態(tài)
第三次揮手:客戶(hù)端收到服務(wù)器確認結果后,進(jìn)入FIN-WAIT-2狀態(tài)。此時(shí)服務(wù)器發(fā)
送釋放FIN=1信號,確認標志ACK=1,確認序號ack=u+1,自己序號seq=w,服
務(wù)器進(jìn)入LAST-ACK(最后確認態(tài))
第四次揮手:客戶(hù)端收到回復后,發(fā)送確認ACK=1,ack=w+1,自己的seq=u+1,
客戶(hù)端進(jìn)入TIME-WAIT(時(shí)間等待)??蛻?hù)端經(jīng)過(guò)2個(gè)最長(cháng)報文段壽命后,客戶(hù)端
CLOSE;服務(wù)器收到確認后,立刻進(jìn)入CLOSE狀態(tài)。
第一次:客戶(hù)端請求斷開(kāi)FIN,seq=u
第二次:服務(wù)器確認客戶(hù)端的斷開(kāi)請求ACK,ack=u+1,seq=v
第三次:服務(wù)器請求斷開(kāi)FIN,seq=w,ACK,ack=u+1
第四次:客戶(hù)端確認服務(wù)器的斷開(kāi)ACK,ack=w+1,seq=u+1
三次握手時(shí),服務(wù)器同時(shí)把ACK和SYN放在一起發(fā)送到了客戶(hù)端那里
四次揮手時(shí),當收到對方的 FIN 報文時(shí),僅僅表示對方不再發(fā)送數據了但是還能接收
數據,己方是否現在關(guān)閉發(fā)送數據通道,需要上層應用來(lái)決定,因此,己方 ACK 和
FIN 一般都會(huì )分開(kāi)發(fā)送。
客戶(hù)端需要保證最后一次發(fā)送的ACK報文到服務(wù)器,如果服務(wù)器未收到,可以請求客戶(hù)
端重發(fā),這樣客戶(hù)端還有時(shí)間再發(fā),重啟2MSL計時(shí)。
聯(lián)系客服