TCP三次握手建立連接和四次揮手斷開連接(個人理解)
TCP協(xié)議通過三次握手的方式建立連接:
1.客戶端(李二狗)發(fā)送SYN請求給服務器(小紅):喂,小紅,我是李二狗,我想和你說話
2.服務器收到SYN,并回復給客戶端一個確認字段ACK:(我是小紅),我聽到了
3.客戶端收到ACK字段,發(fā)送第二個SYN請求給服務器:嘿嘿,小紅,我聽到了,咱倆開聊吧,嘻嘻!
于是服務器將這個連接狀態(tài)更改為established,并將連接加入backlog隊列,等待應用層收取數(shù)據(jù)包。
三次握手的目的是互相確認雙方之間的信道暢通,有互相發(fā)送消息的能力,不是聾子或者啞巴。
TCP協(xié)議通過四次揮手斷開連接:
還是李二狗和小紅,這次要說再見了:
1.客戶端(李二狗)發(fā)送FIN請求給服務器(小紅):小紅我有點事兒先不跟你聊了吧,咱倆掛斷吧,你還有啥想說的嗎
2.服務器收到FIN,立刻回復一個確認字段ACK:嗯,那行吧。
3.服務器緊接著主動向客戶端發(fā)送一個FIN請求:我也沒啥想說的了,今天咱先這樣吧。
4.客戶端收到服務器發(fā)送的FIN請求,再次回復一個ACK確認字段:好,再見。
隨后客戶端仍然需要繼續(xù)等待2MSL的時間,期間沒有收到任何回復,再徹底斷開連接。2MSL是網(wǎng)絡報文在網(wǎng)絡上存活的最長時間,一般是一個經(jīng)驗值,從30秒到幾分鐘不等:我再等等吧,萬一小紅那邊有什么事沒說呢,啊,等30秒了,什么也沒收到,她應該確實是掛斷了,我也掛了吧
雙方就通過這樣四次交互徹底斷開連接。
之所以要四次揮手,就是要保證雙方都收到了彼此的斷開確認
要點:
1.如果因為網(wǎng)絡故障,客戶端多次發(fā)送了FIN,那么只要收到一個服務器的ACK,就可以確認服務器知道要斷開了。如果服務器先回復FIN,那么客戶端就不能保證這個FIN是因為自己發(fā)送的FIN而觸發(fā)的。所以服務器必須先回復ACK
2.如果服務器不回復ACK,那么客戶端可以繼續(xù)單方面接收服務器發(fā)送的任何信息,這種連接叫做半連接
3.客戶端在收到服務器的FIN之后,不回復ACK,服務器也可以繼續(xù)單向接收客戶端的信息,也繼續(xù)保持半連接。
4.最后一個ACK,服務器因為網(wǎng)絡故障,很久才收到,或者沒有收到,只要在2MSL的時間內(nèi),都可以再次向客戶端發(fā)送一次FIN,再確認一次,反復確認直到雙方都確實斷開了連接。
5(重點,考試要考的).在2MSL時間內(nèi),雙方原來使用的通信端口不能再次建立連接,任何試圖綁定該端口的SOCKET請求都會失敗。因此,服務器應該設置允許2MSL復用端口,客戶端應選擇新的端口與服務器建立連接(一般操作系統(tǒng)會隨機生成一個新端口,用戶不必操心)
TCP協(xié)議這樣設計的目的,就是為了最大限度的保證網(wǎng)絡連接的可靠性。
以上都是個人的理解,憑借記憶的知識點手敲出來的,如有紕漏和錯誤請見諒