Có thể kết nối TCP vẫn mở khi máy khách bị ngắt kết nối không?


12

Chúng tôi có một ứng dụng máy chủ đang đối mặt với vấn đề cạn kiệt TCP với khoảng 4000 kết nối. Điều này sẽ xảy ra cứ sau 3 hoặc 4 tuần (khoảng). Nhà cung cấp, người đã tạo ra ứng dụng máy chủ này cho chúng tôi biết sau khi kiểm tra đầu ra của netstat -b rằng một số kết nối vẫn mở ngay cả khi các máy khách bị hủy.

Tôi đã được giao nhiệm vụ điều tra lý do tại sao một ứng dụng khách cụ thể không đóng kết nối TCP đúng cách. Tôi tin rằng nếu một máy khách bị tắt, thì nó không thể báo cáo KHẢ NĂNG từ máy chủ rằng kết nối TCP vẫn được thiết lập với máy khách đó. Thật không may, tôi không thể tìm thấy bất kỳ thông tin nào để xác thực quan điểm của tôi. Tôi không muốn lãng phí thêm thời gian để điều tra một vấn đề tiềm ẩn mà tôi không nghĩ có thể là một vấn đề.

tldr;

Máy chủ có thể báo cáo kết nối đã thiết lập với máy tính bị tắt không?

Câu trả lời:


13

TCP không nỗ lực phát hiện kết nối chết ngoại trừ một bên đang truyền dữ liệu. Trách nhiệm của mã ứng dụng gọi vào ngăn xếp TCP để thực hiện việc này. Giao thức nào có liên quan ở đây? (Cái trên cùng của TCP.)

Đó là một "giải pháp" xấu xí khủng khiếp, nhưng bạn có thể kích hoạt các thủ tục TCP . Có nhiều hơn trong bài viết này .


Bạn có thể có nghĩa là lớp và lớp phiên của nó ở trên cùng của lớp vận chuyển, đó là nơi TCP cư trú.
Rilindo

1
@Rilindo: Trong thực tế và trong trường hợp cụ thể này, bạn có một ứng dụng thực hiện cuộc gọi đến ngăn xếp TCP. Giao thức trên TCP (HTTP, POP hoặc bất cứ thứ gì) thường chỉ định cách thực hiện việc này, bởi vì các nhà thiết kế của các giao thức đó biết rằng TCP không thể tự làm điều này.
David Schwartz

Rất tiếc, lỗi của tôi. Lớp 7 của nó, sau đó.
Rilindo

Tôi sẽ không kích hoạt thủ tục vào thời điểm này, nhưng thật hữu ích khi biết tùy chọn tồn tại. Bài báo đó dường như cho thấy đã tồn tại thời gian chờ 2 giờ .. AFAIK, các kết nối đang được mở trong nhiều ngày / tuần.
Josh Smeaton

Nhiều khả năng, thủ tục không được kích hoạt. Một số đoạn mã phải kích hoạt chúng. Có vẻ như ứng dụng chỉ bị hỏng nếu nó thậm chí không kích hoạt tính năng bảo trì và không có cơ chế hết thời gian / gặt. Chúng ta đang nói về giao thức nào? (HTTP? SMTP? FTP?)
David Schwartz

8

Có nó là có thể. Như David và Paul đã nêu trong câu trả lời của họ, không có cơ chế nào trong TCP (ngoài các dịch vụ giữ TCP, là tùy chọn) để phát hiện kết nối nửa mở. Tùy thuộc vào nhà cung cấp ứng dụng để xác định trạng thái của kết nối và thực hiện hành động phù hợp.

Đối với TCP, không có sự phát hiện hay phân biệt giữa kết nối nửa mở và kết nối nhàn rỗi dài.

Bạn sẽ phải bắt đầu khắc phục sự cố này từ lớp 1 (vật lý) của mô hình OSI lên đến lớp 7 (ứng dụng) để tìm ra nơi xảy ra sự cố. Lời khuyên của tôi là cài đặt và chạy chương trình chụp gói trên một trong các máy khách bị ảnh hưởng cho đến khi xảy ra sự cố, sau đó phân tích chụp để thử và xác định điều gì khiến máy khách không đóng kết nối.


3
Hoặc yêu cầu nhà cung cấp thực hiện thời gian chờ hợp lý :)
Shane Madden

5

Khi một máy trạm muốn đóng kết nối với máy chủ, nó sẽ gửi TCP FIN. Nếu máy khách không hoạt động đúng và không đóng các kết nối của nó, thực tế chúng có thể vẫn được thiết lập trên máy chủ. Bạn có thể đặt thời gian chờ cho các kết nối mở trên máy chủ để dọn sạch chúng - mặc dù sẽ tốt hơn nếu tìm ra nguyên nhân. Cổng nào là kết nối mở đến? Khi bạn biết dịch vụ nào đang được truy cập, bạn có thể xác định ứng dụng khách đang truy cập máy chủ.


Chúng tôi biết khách hàng đó là vấn đề rõ ràng. Đây là một ứng dụng máy tính để bàn mà hàng trăm người dùng của chúng tôi sử dụng hàng ngày. Tôi cho rằng vấn đề là ứng dụng bị sập, thiết lập lại cứng hoặc tác vụ kết thúc. Tôi đã nghĩ rằng trong tất cả các tình huống đó, máy chủ sẽ nhận thức được kết nối bị mất.
Josh Smeaton

4
Theo như máy chủ liên quan, kết nối sẽ mở trừ khi nhận được FIN hoặc RST từ máy khách. Không có điều đó, máy chủ giả định rằng kết nối vẫn được thiết lập nhưng máy khách không có dữ liệu để gửi. Không có sự khác biệt giữa kết nối nửa mở và kết nối nhàn rỗi khi có liên quan đến máy chủ.
joeqwerty

@joeqwerty: Đúng, tuy nhiên, máy chủ có thể quyết định rằng nó không muốn mở kết nối vô thời hạn và có thể thực hiện một số cơ chế hết thời gian / đóng. Đó là những gì David Schwartz có nghĩa trong câu trả lời của mình bởi "đó là trách nhiệm của mã ứng dụng". Vì vậy, máy chủ có thể tạo sự khác biệt giữa kết nối nửa mở và kết nối nhàn rỗi nếu muốn. Tuy nhiên, đối với TCP, thực sự không có sự khác biệt giữa kết nối nửa mở và kết nối nhàn rỗi.
sleske

@sleske: Đồng ý rằng mã ứng dụng có thể thực hiện việc này, nhưng TCP không thể trừ khi bật tính năng giữ lại.
joeqwerty
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.