2.4.1 數(shù)據(jù)發(fā)送完畢后斷開連接
- 協(xié)議棧在設(shè)計(jì)上允許任何一方先發(fā)起斷開過程刁卜。
- 以服務(wù)器斷開為例:
首先,服務(wù)器一方的應(yīng)用程序會調(diào)用Socket庫的close程序。
然后肆氓,服務(wù)器的協(xié)議棧會生成包含斷開信息的TCP頭部,就是將控制位的FIN比特設(shè)置為1底瓣。
當(dāng)收到服務(wù)器發(fā)來的FIN為1的TCP頭部時谢揪,客戶端協(xié)議棧會將自己的套接字標(biāo)記為進(jìn)入斷開操作狀態(tài),然后為了告知服務(wù)器已收到FIN為1的包捐凭,客戶端向服務(wù)器返回一個ACK號拨扶。
當(dāng)客戶端應(yīng)用程序把全部返回?cái)?shù)據(jù)都讀取完畢后,客戶端應(yīng)用程序會調(diào)用close來結(jié)束收據(jù)收發(fā)操作茁肠,這時客戶端會向服務(wù)器發(fā)送FIN為1的包患民,然后服務(wù)器返回ACK號確認(rèn)斷開。
2.4.2 刪除套接字
- 通信結(jié)束之后不會立刻刪除套接字而是會等待一段時間垦梆,這是為了防止誤操作匹颤。
比如客戶端主動發(fā)起斷開連接發(fā)送FIN,服務(wù)器返回ACK托猩,服務(wù)器發(fā)送FIN印蓖,客戶端返回ACK。如果最后客戶端返回的ACK丟失了京腥,服務(wù)器會重發(fā)FIN赦肃,而此時客戶端把套接字刪除了,并且這個端口被另外新啟動的應(yīng)用程序占用了,那么這個FIN就會錯誤的跑道新套接字里面他宛,新套接字就開始執(zhí)行斷開操作了船侧。 - 等待時間和包重傳的操作方式有關(guān)。