2009-12-16 45 views
9

Khách hàng đóng socket đầu tiên, khi không có nhiều dữ liệu từ máy chủ, kết nối tcp tắt máy là okay như:kết nối TCP treo trên status CLOSE_WAIT

FIN --> 
    <-- ACK 
    <-- FIN, ACK 
ACK --> 

Khi máy chủ đang bận việc gửi dữ liệu:

FIN --> 
    <-- ACK,PSH 
RST --> 

Và kết nối máy chủ đến trạng thái CLOSE_WAIT và treo ở đó trong một thời gian dài.

Sự cố ở đây là gì? khách hàng liên quan hoặc máy chủ có liên quan? Điều này xảy ra trên Redhat5 cho các ổ cắm cục bộ.

Điều này article nói về lý do tại sao "RST" được gửi, nhưng tôi không biết tại sao kết nối máy chủ bị kẹt trên CLOSE_WAIT và không gửi FIN.

[EDIT] Tôi bỏ qua thông tin quan trọng nhất, điều này xảy ra trên mô phỏng mạng slemp của qemu. Nó có vẻ là một vấn đề của lỗi slirp để đối phó với kết nối chặt chẽ.

Trả lời

0

Điều này được biết đến defect cho qemu.

+0

URL tốt hơn: http://lists.gnu.org/archive/html/qemu-devel/2008-06/msg00372.html – qerub

2

Điều này có nghĩa là có dữ liệu chưa đọc còn lại trong luồng mà khách hàng chưa đọc xong.

Bạn có thể tắt bằng cách sử dụng tùy chọn SO_LINGER. Here's relevant documentation cho Linux (cũng thấy tùy chọn, here) và [đây là hàm phù hợp2] cho Win32.

Đó là phía máy chủ vẫn còn mở, do đó, ở phía máy chủ, bạn có thể thử vô hiệu hóa SO_LINGER.

+0

Dường như SO_LINGER chỉ ảnh hưởng đến cuộc gọi close(), nhưng máy chủ treo trên write() gọi thay thế? –

+1

Nếu máy chủ treo trên một cuộc gọi viết thì bạn có thể đã lấp đầy cửa sổ TCP và ngăn xếp đang chờ ACK từ máy khách trước khi nó có thể chấp nhận nhiều dữ liệu hơn để gửi ... –

0

Điều đó có nghĩa là máy chủ chưa đóng socket. Bạn có thể dễ dàng nói điều này bằng cách sử dụng "lsof" để liệt kê các bộ mô tả tập tin được mở bởi quá trình đó sẽ bao gồm các cổng TCP. Việc sửa chữa là có quá trình luôn luôn đóng socket khi nó hoàn thành (ngay cả trong trường hợp lỗi vv)

+0

Vấn đề là máy chủ được treo trên máy ghi cuộc gọi và tôi không thể phát hiện lỗi. –

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