2009-04-22 27 views
27

Trong lập trình mạng trong Unix, tôi luôn đặt tùy chọn SO_REUSEADDR trên socket đang được máy chủ sử dụng để nghe kết nối. Điều này về cơ bản nói rằng một ổ cắm khác có thể được mở trên cùng một cổng trên máy. Điều này rất hữu ích khi khôi phục từ sự cố và ổ cắm không được đóng đúng cách - ứng dụng có thể được khởi động lại và nó sẽ chỉ mở một ổ cắm khác trên cùng một cổng và tiếp tục nghe.Sử dụng SO_REUSEADDR - Điều gì sẽ xảy ra với ổ cắm mở trước đó?

Câu hỏi của tôi là, điều gì sẽ xảy ra với ổ cắm cũ? Không nghi ngờ gì, tất cả dữ liệu/kết nối vẫn sẽ được nhận trên ổ cắm cũ. Liệu nó có được đóng tự động bởi hệ điều hành không?

+1

Để làm rõ: Sau khi chương trình bị treo, hệ điều hành ví dụ: Linux Kernel, sẽ tự động đóng socket. Có các lý do giao thức (TCP) tại sao bạn không muốn mở lại kết nối ngay lập tức. – unixman83

+2

A phải đọc về chủ đề này: http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html –

Trả lời

24

Có, HĐH sẽ tự động đóng socket trước đó khi quá trình cũ kết thúc. Lý do bạn không thể bình thường lắng nghe trên cùng một cổng ngay lập tức là bởi vì các ổ cắm, mặc dù đóng cửa, vẫn còn trong trạng thái 2MSL cho một số lượng thời gian (thường là một vài phút). Hệ điều hành sẽ tự động chuyển đổi ổ cắm cũ ra khỏi trạng thái này khi hết thời gian chờ.

+0

Ahh. . tất nhiên. Ổ cắm chỉ là một tập tin xử lý sau khi tất cả và sẽ được làm sạch bởi hệ điều hành. Cảm ơn bạn rất nhiều :) – Naren

+4

Để chính xác, điểm cuối TCP vẫn ở trạng thái 2MSL. Ổ cắm đã biến mất. –

+1

Thời gian chờ đã được thêm vào spec cho một lý do. Sử dụng SO_REUSEADDR làm cho ngăn xếp TCP vi phạm khoảng thời gian chờ đợi. (Trạng thái 2MSL của bạn) – unixman83

29

Ổ cắm được coi là đóng khi chương trình đang sử dụng thiết bị này bị chết. Điều đó được xử lý bởi hệ điều hành và HĐH sẽ từ chối chấp nhận bất kỳ thông tin liên lạc nào khác từ cuộc trò chuyện đã chết. Tuy nhiên, nếu ổ cắm bị đóng đột ngột, máy tính ở đầu kia có thể không biết cuộc đàm thoại đã kết thúc và có thể vẫn đang cố giao tiếp.

Đó là lý do tại sao có, được thiết kế trong thông số TCP, một khoảng thời gian chờ trước khi có thể sử dụng lại cùng một số cổng đó. Bởi vì trong lý thuyết, tuy nhiên, có thể có thể cho một gói từ cuộc hội thoại cũ đến với địa chỉ IP, số cổng và số thứ tự thích hợp sao cho máy chủ nhận nhầm chèn nhầm vào luồng TCP sai.

Tùy chọn SO_REUSEADDR ghi đè hành vi đó, cho phép bạn sử dụng lại cổng ngay lập tức. Có hiệu quả, bạn đang nói: "Tôi hiểu những rủi ro và muốn sử dụng cổng anyway."

Các vấn đề liên quan