Tại sao phải mất đến vài phút để làm sạch cổng TCP sau khi chương trình bị chết?


27

Nếu tôi giết một chương trình đang nghe trên cổng TCP, sẽ mất đến vài phút cho đến khi cổng được hệ thống lấy lại và có thể sử dụng lại. Tôi đã thấy một số Q / A đề cập đến hiện tượng này, nhưng không có lời giải thích. Tại sao điều đó xảy ra, tại sao hệ thống không lấy lại cổng ngay lập tức? Nó cũng xảy ra trên các hệ thống khác, chẳng hạn như Windows hoặc Mac?

Câu trả lời:


25

Ý tưởng đằng sau điều này là để đảm bảo bạn không nhận được các gói được nhắm mục tiêu cho chương trình trước đó nghe trên cổng đó. Đây TIME_WAITtrạng thái được định nghĩa trong RFC793 như hai lần so với phân khúc đời tối đa.

Tôi không biết về các Hệ điều hành khác nhưng tôi cho rằng tất cả chúng đều có một số loại hành vi tương tự.

Một cách giải quyết cho vấn đề này là đặt SO_REUSEADDRtrên ổ cắm nên bỏ qua TIME_WAITtrạng thái.


3
Kiểm tra sơ đồ trạng thái TCP đáng tin cậy của tôi, tôi có thể thấy TIME_WAIT là trạng thái cuối cùng của ổ cắm và thường tồn tại trong 2MSL - tức là gấp đôi thời gian phân đoạn tối đa. Thông số kỹ thuật (RFC793) nêu rõ điều này là 2 phút, tổng cộng 4 phút. Điều này cho phép đủ thời gian cho bất kỳ yêu cầu và trả lời nào vẫn "trong chuyến bay" được xử lý và hạ cánh đúng chương trình - hoặc bị loại bỏ nếu ổ cắm ở trong TIME_WAIT.
Faelkle

Tôi có thể xác nhận rằng điều này cũng xảy ra trong Windows.
Thomas Bratt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.