Socket端口復用


在網絡應用中(如Java Socket Server),當服務關掉立馬重啟時,很多時候會提示端口仍被占用(因端口上有處於TIME_WAIT的連接)。此時可通過 SO_REUSEADDR 參數( socket.setReuseAddress(true); )來使得服務關掉重啟時立馬可使用該端口,而不是提示端口占用。

 如果端口忙,但TCP狀態位於 TIME_WAIT ,可以重用 端口。如果端口忙,而TCP狀態位於其他狀態,重用端口時依舊得到一個錯誤信息, 拋出“Address already in use: JVM_Bind”。如果你的服務程序停止后想立即重啟,不等60秒,而新套接字依舊 使用同一端口,此時 SO_REUSEADDR 選項非常有用。必須意識到,此時任何非期 望數據到達,都可能導致服務程序反應混亂,不過這只是一種可能,事實上很不可能。 

詳見:https://elf8848.iteye.com/blog/1739598

 

進階:

TCP關閉過程中的TIME_WAIT狀態就是client端的2MSL狀態,其作用是確保server端可以收到client端發送的確認報文:最后一個確認報文可能沒被server端收到,此時server端會重發fin報文,client端等待2MSL時間使得可以收到server端重發的fin報文。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM