Mengapa perlu beberapa menit untuk membersihkan port TCP yang mendengarkan setelah sebuah program mati?

27

Jika saya mematikan program yang mendengarkan pada port TCP, dibutuhkan hingga beberapa menit hingga port tersebut direklamasi oleh sistem dan dapat digunakan kembali. Saya telah melihat beberapa Q / A menyebutkan fenomena ini, tetapi tanpa penjelasan. Mengapa itu terjadi, mengapa sistem tidak mengklaim kembali port langsung? Apakah itu juga terjadi pada sistem lain, seperti Windows atau Mac?

Petr Pudlák
sumber

Jawaban:

25

Gagasan di balik ini adalah untuk memastikan Anda tidak menerima paket yang ditargetkan untuk program sebelumnya yang mendengarkan pada port itu. Ini TIME_WAITnegara didefinisikan dalam RFC793 sebagai dua kali segmen seumur hidup maksimal.

Saya tidak tahu tentang Sistem Operasi lain tetapi saya berasumsi bahwa semua ini memiliki semacam perilaku yang serupa.

Solusi untuk masalah ini adalah dengan memasang SO_REUSEADDRsoket yang harus mengabaikan TIME_WAITstatus.

Ulrich Dangel
sumber
3
Memeriksa diagram keadaan TCP terpercaya saya, saya dapat melihat bahwa TIME_WAIT adalah status terakhir dari sebuah soket dan umumnya bertahan untuk 2MSL - yang merupakan dua kali umur segmen maksimum. Spec (RFC793) menyatakan ini sebagai 2 menit, memberikan total 4 menit. Ini memungkinkan cukup waktu untuk setiap permintaan dan balasan yang masih "dalam penerbangan" untuk diproses dan mendarat di program yang tepat - atau dibuang jika soketnya dalam TIME_WAIT.
Faelkle
Saya dapat mengkonfirmasi bahwa ini juga terjadi pada Windows.
Thomas Bratt