Linux上TCP的shutdown/close(備忘)
Linux上TCP的shutdown/close(備忘)
Linux的版本是kernel-2.6.21:
1,只要TCP棧的讀緩沖里還有未讀?。╮ead)數據,則調用close時(shí)會(huì )直接向對端發(fā)送RST。
2,shutdown與socket描述符沒(méi)有關(guān)系,即使調用shutdown(fd, SHUT_RDWR)也不會(huì )關(guān)閉fd,最終還需close(fd)。
3,可以認為shutdown(fd, SHUT_RD)是空操作,因為shutdown后還可以繼續從該socket讀取數據,這點(diǎn)也許還需要進(jìn) 一步證實(shí)。
4,在已發(fā)送FIN包后write該socket描述符會(huì )引發(fā)EPIPE/SIGPIPE。
5,當有多個(gè)socket描述符指向同一socket對象時(shí),調用close時(shí)首先會(huì )遞減該對象的引用計數,計數為0時(shí)才會(huì )發(fā)送FIN包結束TCP連接。 shutdown不同,只要以SHUT_WR/SHUT_RDWR方式調用即發(fā)送FIN包。
6,SO_LINGER與close,當SO_LINGER選項開(kāi)啟但超時(shí)值為0時(shí),調用close直接發(fā)送RST(這樣可以避免進(jìn)入TIME_WAIT 狀態(tài),但破壞了TCP協(xié)議的正常工作方式),SO_LINGER對shutdown無(wú)影響。
7,TCP連接上出現RST與隨后可能的TIME_WAIT狀態(tài)沒(méi)有直接關(guān)系,主動(dòng)發(fā)FIN包方必然會(huì )進(jìn)入TIME_WAIT狀態(tài),除非不發(fā)送FIN而直 接以發(fā)送RST結束連接。
創(chuàng )建于: 2007-07-10 18:51:09,修改于: 2007-07-10 18:51:09,已瀏覽806次,有評論3條
網(wǎng)友評論
網(wǎng)友:本站網(wǎng)友 時(shí) 間:2007-07-22 15:16:24 IP地址:218.247.216.★
再補充一條:
TCP半關(guān)閉狀態(tài)只是在shutdown后有效,而使用close關(guān)閉連接后,對端向本端發(fā)送數據會(huì )造成本斷發(fā)送RST。
網(wǎng)友:西郵 時(shí) 間:2007-11-28 15:22:49 IP地址:123.138.241.★
第3條不同意。man手冊里這么說(shuō):“If how is SHUT_RD, further receptions will be disallowed.”如果是空操作的話(huà),這個(gè)是實(shí)現不了的。
網(wǎng)友:本站網(wǎng)友 時(shí) 間:2007-11-28 16:17:48 IP地址:218.247.216.★
你可以實(shí)驗看看,我看2.6.21代碼的時(shí)候沒(méi)發(fā)現有任何對SHUT_RD的處理.