SYN:同步標志山析。
ACK:確認標志堰燎。
FIN: 結(jié)束標志。
三次握手笋轨,建立Tcp連接秆剪。
例子一:
比如在紅軍時代,A連和B連分在左右翼爵政,約定在幾時幾分一同發(fā)起打擊仅讽。這個幾時幾分的信息就需要人工通過通訊員來走路傳遞。所以A連指揮官派出通訊員钾挟。這是第一次洁灵。
假設(shè)通訊員到達了B連,并且告知了B連指揮官幾時幾分掺出,B連指揮官一定會讓通訊員再回去通知A連指揮官徽千,可憐的通訊員只能冒著危險返回A連,因為A連指揮官看不到通訊員返回的話汤锨,不知道幾時幾分這個信息到底傳達到了B連沒有罐栈。
這是第二次。
現(xiàn)在B連指揮官開始擔(dān)心通訊員是否回到了A連泥畅,如果沒回到荠诬,B連指揮官會設(shè)身處地的想一想A連指揮官見不到返回的通訊員琅翻,肯定是不敢打的,所以B連指揮官最盼望的是再次看到通訊員出現(xiàn)在B連柑贞,所以A連指揮官會讓通訊員再回B連一次方椎。
這是第三次。
例子二:
晚上11點钧嘶,到該睡覺的時間了棠众。
A:“11點了,該睡了有决。(SYN)”
B:“好的闸拿。晚安。(SYN+ACK)”
A:“晚安书幕。(ACK)”
然后兩個人都睡覺了新荤。
這就是三次握手。
客戶端和客戶端建立了Tcp連接后台汇,之間就可以相互通信苛骨,客戶端發(fā)請求,服務(wù)端處理請求或向客戶端發(fā)送文件苟呐。
四次揮手痒芝,斷開Tcp連接。
注意:中斷連接端可以是Client端牵素,也可以是Server端严衬。
下圖是客戶端中斷連接:
假設(shè)Client端發(fā)起中斷連接請求,也就是發(fā)送FIN報文笆呆。Server端接到FIN報文后瞳步,意思是說"我Client端沒有數(shù)據(jù)要發(fā)給你了",但是如果你還有數(shù)據(jù)沒有發(fā)送完成腰奋,則不必急著關(guān)閉Socket单起,可以繼續(xù)發(fā)送數(shù)據(jù)。所以你先發(fā)送ACK劣坊,"告訴Client端嘀倒,你的請求我收到了,但是我還沒準備好局冰,請繼續(xù)你等我的消息"测蘑。這個時候Client端就進入FIN_WAIT狀態(tài),繼續(xù)等待Server端的FIN報文康二。當(dāng)Server端確定數(shù)據(jù)已發(fā)送完成碳胳,則向Client端發(fā)送FIN報文,"告訴Client端沫勿,好了挨约,我這邊數(shù)據(jù)發(fā)完了味混,準備好關(guān)閉連接了"。Client端收到FIN報文后诫惭,"就知道可以關(guān)閉連接了翁锡,但是他還是不相信網(wǎng)絡(luò),怕Server端不知道要關(guān)閉夕土,所以發(fā)送ACK后進入TIME_WAIT狀態(tài)馆衔,如果Server端沒有收到ACK則可以重傳≡剐澹“角溃,Server端收到ACK后,"就知道可以斷開連接了"篮撑。Client端等待了2MSL后依然沒有收到回復(fù)减细,則證明Server端已正常關(guān)閉,那好咽扇,我Client端也可以關(guān)閉連接了邪财。Ok陕壹,TCP連接就這樣關(guān)閉了质欲!
在TIME_WAIT狀態(tài)中,如果TCP client端最后一次發(fā)送的ACK丟失了糠馆,它將重新發(fā)送嘶伟。TIME_WAIT狀態(tài)中所需要的時間是依賴于實現(xiàn)方法的。典型的值為30秒又碌、1分鐘和2分鐘九昧。等待之后連接正式關(guān)閉,并且所有的資源(包括端口號)都被釋放毕匀。
2MSL等待的原因:報文段有生存時間铸鹰,當(dāng)連接關(guān)閉時,有可能收到遲到的報文段皂岔。這時蹋笼,若立馬就建立新的連接(同一端口),那么新的連接就會接收遲到的報文躁垛,誤以為是發(fā)給自己的剖毯。另一個原因是可靠的實現(xiàn)全雙工連接的終止。
嗯教馆。不打王者榮耀了逊谋,換時間來學(xué)習(xí)!(堅定臉= =)