SYN:同步標志。
ACK:確認標志。
FIN: 結束標志。
三次握手,建立Tcp連接。
例子一:
比如在紅軍時代,A連和B連分在左右翼,約定在幾時幾分一同發(fā)起打擊。這個幾時幾分的信息就需要人工通過通訊員來走路傳遞。所以A連指揮官派出通訊員。這是第一次。
假設通訊員到達了B連,并且告知了B連指揮官幾時幾分,B連指揮官一定會讓通訊員再回去通知A連指揮官,可憐的通訊員只能冒著危險返回A連,因為A連指揮官看不到通訊員返回的話,不知道幾時幾分這個信息到底傳達到了B連沒有。
這是第二次。
現(xiàn)在B連指揮官開始擔心通訊員是否回到了A連,如果沒回到,B連指揮官會設身處地的想一想A連指揮官見不到返回的通訊員,肯定是不敢打的,所以B連指揮官最盼望的是再次看到通訊員出現(xiàn)在B連,所以A連指揮官會讓通訊員再回B連一次。
這是第三次。
例子二:
晚上11點,到該睡覺的時間了。
A:“11點了,該睡了。(SYN)”
B:“好的。晚安。(SYN+ACK)”
A:“晚安。(ACK)”
然后兩個人都睡覺了。
這就是三次握手。
客戶端和客戶端建立了Tcp連接后,之間就可以相互通信,客戶端發(fā)請求,服務端處理請求或向客戶端發(fā)送文件。
四次揮手,斷開Tcp連接。
注意:中斷連接端可以是Client端,也可以是Server端。
下圖是客戶端中斷連接:
假設Client端發(fā)起中斷連接請求,也就是發(fā)送FIN報文。Server端接到FIN報文后,意思是說"我Client端沒有數(shù)據(jù)要發(fā)給你了",但是如果你還有數(shù)據(jù)沒有發(fā)送完成,則不必急著關閉Socket,可以繼續(xù)發(fā)送數(shù)據(jù)。所以你先發(fā)送ACK,"告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續(xù)你等我的消息"。這個時候Client端就進入FIN_WAIT狀態(tài),繼續(xù)等待Server端的FIN報文。當Server端確定數(shù)據(jù)已發(fā)送完成,則向Client端發(fā)送FIN報文,"告訴Client端,好了,我這邊數(shù)據(jù)發(fā)完了,準備好關閉連接了"。Client端收到FIN報文后,"就知道可以關閉連接了,但是他還是不相信網(wǎng)絡,怕Server端不知道要關閉,所以發(fā)送ACK后進入TIME_WAIT狀態(tài),如果Server端沒有收到ACK則可以重傳。“,Server端收到ACK后,"就知道可以斷開連接了"。Client端等待了2MSL后依然沒有收到回復,則證明Server端已正常關閉,那好,我Client端也可以關閉連接了。Ok,TCP連接就這樣關閉了!
在TIME_WAIT狀態(tài)中,如果TCP client端最后一次發(fā)送的ACK丟失了,它將重新發(fā)送。TIME_WAIT狀態(tài)中所需要的時間是依賴于實現(xiàn)方法的。典型的值為30秒、1分鐘和2分鐘。等待之后連接正式關閉,并且所有的資源(包括端口號)都被釋放。
2MSL等待的原因:報文段有生存時間,當連接關閉時,有可能收到遲到的報文段。這時,若立馬就建立新的連接(同一端口),那么新的連接就會接收遲到的報文,誤以為是發(fā)給自己的。另一個原因是可靠的實現(xiàn)全雙工連接的終止。
嗯。不打王者榮耀了,換時間來學習!(堅定臉= =)