TCP三次握手建立連接和四次揮手?jǐn)嚅_連接(個人理解)
TCP協(xié)議通過三次握手的方式建立連接:
1.客戶端(李二狗)發(fā)送SYN請求給服務(wù)器(小紅):喂拉宗,小紅蓖乘,我是李二狗,我想和你說話
2.服務(wù)器收到SYN,并回復(fù)給客戶端一個確認(rèn)字段ACK:(我是小紅),我聽到了
3.客戶端收到ACK字段沈善,發(fā)送第二個SYN請求給服務(wù)器:嘿嘿,小紅椭蹄,我聽到了闻牡,咱倆開聊吧,嘻嘻绳矩!
于是服務(wù)器將這個連接狀態(tài)更改為established罩润,并將連接加入backlog隊列,等待應(yīng)用層收取數(shù)據(jù)包翼馆。
三次握手的目的是互相確認(rèn)雙方之間的信道暢通哨啃,有互相發(fā)送消息的能力,不是聾子或者啞巴写妥。
TCP協(xié)議通過四次揮手?jǐn)嚅_連接:
還是李二狗和小紅拳球,這次要說再見了:
1.客戶端(李二狗)發(fā)送FIN請求給服務(wù)器(小紅):小紅我有點事兒先不跟你聊了吧,咱倆掛斷吧珍特,你還有啥想說的嗎
2.服務(wù)器收到FIN祝峻,立刻回復(fù)一個確認(rèn)字段ACK:嗯,那行吧扎筒。
3.服務(wù)器緊接著主動向客戶端發(fā)送一個FIN請求:我也沒啥想說的了莱找,今天咱先這樣吧。
4.客戶端收到服務(wù)器發(fā)送的FIN請求嗜桌,再次回復(fù)一個ACK確認(rèn)字段:好奥溺,再見。
隨后客戶端仍然需要繼續(xù)等待2MSL的時間骨宠,期間沒有收到任何回復(fù)浮定,再徹底斷開連接。2MSL是網(wǎng)絡(luò)報文在網(wǎng)絡(luò)上存活的最長時間层亿,一般是一個經(jīng)驗值桦卒,從30秒到幾分鐘不等:我再等等吧,萬一小紅那邊有什么事沒說呢匿又,啊方灾,等30秒了,什么也沒收到碌更,她應(yīng)該確實是掛斷了裕偿,我也掛了吧
雙方就通過這樣四次交互徹底斷開連接洞慎。
之所以要四次揮手,就是要保證雙方都收到了彼此的斷開確認(rèn)
要點:
1.如果因為網(wǎng)絡(luò)故障嘿棘,客戶端多次發(fā)送了FIN拢蛋,那么只要收到一個服務(wù)器的ACK,就可以確認(rèn)服務(wù)器知道要斷開了蔫巩。如果服務(wù)器先回復(fù)FIN谆棱,那么客戶端就不能保證這個FIN是因為自己發(fā)送的FIN而觸發(fā)的。所以服務(wù)器必須先回復(fù)ACK
2.如果服務(wù)器不回復(fù)ACK圆仔,那么客戶端可以繼續(xù)單方面接收服務(wù)器發(fā)送的任何信息垃瞧,這種連接叫做半連接
3.客戶端在收到服務(wù)器的FIN之后,不回復(fù)ACK坪郭,服務(wù)器也可以繼續(xù)單向接收客戶端的信息个从,也繼續(xù)保持半連接。
4.最后一個ACK歪沃,服務(wù)器因為網(wǎng)絡(luò)故障嗦锐,很久才收到,或者沒有收到沪曙,只要在2MSL的時間內(nèi)奕污,都可以再次向客戶端發(fā)送一次FIN,再確認(rèn)一次液走,反復(fù)確認(rèn)直到雙方都確實斷開了連接碳默。
5(重點,考試要考的).在2MSL時間內(nèi)缘眶,雙方原來使用的通信端口不能再次建立連接嘱根,任何試圖綁定該端口的SOCKET請求都會失敗。因此巷懈,服務(wù)器應(yīng)該設(shè)置允許2MSL復(fù)用端口该抒,客戶端應(yīng)選擇新的端口與服務(wù)器建立連接(一般操作系統(tǒng)會隨機生成一個新端口,用戶不必操心)
TCP協(xié)議這樣設(shè)計的目的顶燕,就是為了最大限度的保證網(wǎng)絡(luò)連接的可靠性凑保。
以上都是個人的理解,憑借記憶的知識點手敲出來的割岛,如有紕漏和錯誤請見諒