Linux上TCP的shutdown/close(備忘)
Linux的版本是kernel-2.6.21:
1,只要TCP棧的讀緩沖里還有未讀?。╮ead)數(shù)據(jù),則調(diào)用close時會直接向?qū)Χ税l(fā)送RST。
2,shutdown與socket描述符沒有關(guān)系,即使調(diào)用shutdown(fd,
SHUT_RDWR)也不會關(guān)閉fd,最終還需close(fd)。
3,可以認(rèn)為shutdown(fd,
SHUT_RD)是空操作,因?yàn)閟hutdown后還可以繼續(xù)從該socket讀取數(shù)據(jù),這點(diǎn)也許還需要進(jìn)
一步證實(shí)。
4,在已發(fā)送FIN包后write該socket描述符會引發(fā)EPIPE/SIGPIPE。
5,當(dāng)有多個socket描述符指向同一socket對象時,調(diào)用close時首先會遞減該對象的引用計數(shù),計數(shù)為0時才會發(fā)送FIN包結(jié)束TCP連接。
shutdown不同,只要以SHUT_WR/SHUT_RDWR方式調(diào)用即發(fā)送FIN包。
6,SO_LINGER與close,當(dāng)SO_LINGER選項(xiàng)開啟但超時值為0時,調(diào)用close直接發(fā)送RST(這樣可以避免進(jìn)入TIME_WAIT
狀態(tài),但破壞了TCP協(xié)議的正常工作方式),SO_LINGER對shutdown無影響。
7,TCP連接上出現(xiàn)RST與隨后可能的TIME_WAIT狀態(tài)沒有直接關(guān)系,主動發(fā)FIN包方必然會進(jìn)入TIME_WAIT狀態(tài),除非不發(fā)送FIN而直
接以發(fā)送RST結(jié)束連接。