Sự khác biệt giữa kết nối và thời gian chờ đọc cho ổ cắm là gì?


180

3 câu hỏi:

  1. Sự khác biệt giữa kết nối và thời gian chờ đọc cho ổ cắm là gì?

  2. Thời gian chờ kết nối được đặt thành "vô cực" nghĩa là gì? Trong tình huống nào nó có thể vẫn còn trong một vòng lặp nguyên bản? và cái gì có thể kích hoạt rằng vòng lặp vô cực chết?

  3. Thời gian chờ đọc được đặt thành "vô cực" nghĩa là gì? Trong tình huống nào nó có thể vẫn còn trong một vòng lặp nguyên bản? và cái gì có thể kích hoạt rằng vòng lặp vô cực chết?

Câu trả lời:


227

1) Sự khác biệt giữa thời gian kết nối và thời gian đọc cho ổ cắm là gì?

Thời gian chờ kết nối là thời gian chờ trong việc tạo kết nối ban đầu; tức là hoàn thành bắt tay kết nối TCP. Thời gian chờ đọc là thời gian chờ để đọc dữ liệu 1 . Cụ thể, nếu máy chủ không gửi được byte <thời gian chờ> giây sau byte cuối cùng, lỗi hết thời gian đọc sẽ được đưa ra.

2) Thời gian chờ kết nối được đặt thành "vô cực" nghĩa là gì? Trong tình huống nào nó có thể vẫn còn trong một vòng lặp nguyên bản? và cái gì có thể kích hoạt rằng vòng lặp vô cực chết?

Nó có nghĩa là nỗ lực kết nối có thể có khả năng chặn mãi mãi. Không có vòng lặp vô hạn, nhưng nỗ lực kết nối có thể được bỏ chặn bởi một luồng khác đóng ổ cắm. (Một Thread.interrupt()cuộc gọi cũng có thể thực hiện mánh khóe ... không chắc chắn.)

3) Thời gian chờ đọc được đặt thành "vô cực" nghĩa là gì? Trong tình huống nào nó có thể vẫn còn trong một vòng lặp vô hạn? Điều gì có thể kích hoạt vòng lặp vô hạn để kết thúc?

Điều đó có nghĩa là một cuộc gọi đến readtrên luồng socket có thể bị chặn vĩnh viễn. Một lần nữa, không có vòng lặp vô hạn, nhưng readcó thể được bỏ chặn bằng một Thread.interrupt()cuộc gọi, đóng ổ cắm và (tất nhiên) đầu kia gửi dữ liệu hoặc đóng kết nối.


1 - Không phải là ... như một người bình luận nghĩ ... thời gian chờ về thời gian một ổ cắm có thể mở hoặc không hoạt động.


8

Đây là các giá trị hết thời gian được thi hành bởi JVM cho thiết lập kết nối TCP và chờ đọc dữ liệu từ ổ cắm.

Nếu giá trị được đặt thành vô cùng, bạn sẽ không đợi mãi. Điều đó đơn giản có nghĩa là JVM không có thời gian chờ và HĐH sẽ chịu trách nhiệm cho tất cả thời gian chờ. Tuy nhiên, thời gian chờ trên HĐH có thể rất dài. Trên một số mạng chậm, tôi đã thấy thời gian chờ dài tới 6 phút.

Ngay cả khi bạn đặt giá trị thời gian chờ cho ổ cắm, nó có thể không hoạt động nếu thời gian chờ xảy ra trong mã gốc. Chúng tôi có thể tái tạo sự cố trên Linux bằng cách kết nối với máy chủ bị chặn bởi tường lửa hoặc rút cáp trên công tắc.

Cách tiếp cận an toàn duy nhất để xử lý thời gian chờ TCP là chạy mã kết nối trong một luồng khác và làm gián đoạn luồng khi mất quá nhiều thời gian.


"Nếu giá trị được đặt thành vô cùng, bạn sẽ không đợi mãi." Miễn là nó không phải là về cuộc thảo luận về ý nghĩa của "vô cực", chắc chắn có thể xảy ra rằng bạn chờ đợi rất lâu. Chúng tôi đã có một trường hợp ở đây, nơi một HttpURLConnection.getResponseCode()treo cho apprx. một tuần cho đến khi chúng tôi bắt đầu lại quá trình. Rõ ràng không có thời gian chờ nào được đặt ở phía JVM và cũng như không có thời gian chờ nào ở phía hệ điều hành Linux.
Tom Fink

Đoạn cuối không đúng. Một kết nối sẽ hết thời gian sau khoảng một phút. Một chủ đề riêng biệt là hoàn toàn không cần thiết. Bạn chắc chắn có thể có các bài đọc chạy mãi mãi nếu không có dữ liệu. Tuy nhiên, Javadoc sai về thời gian chờ kết nối mặc định là vô hạn. Không phải vậy.
Hầu tước Lorne

1
@comeGetSome Điều đó không đúng. Bạn có thể tắt ổ cắm cho đầu vào. Điều đó sẽ khiến việc đọc bị chặn gặp phải cuối luồng.
Hầu tước Lorne

@comeGetSome: Tôi đã phải thực hiện điều này bằng cách sử dụng một luồng chứa tham chiếu đến kết nối URL HTTP mở. Khi chủ đề được nói đóng kết nối, chủ đề khác sẽ ném "java.net.SocketException: socket đóng". Cảm ơn lỗi JDK-8075484 đã khiến tôi làm điều đó!
fmcato

@comeGetSome Chắc chắn bạn có thể gọi Socket.shutdownInput() mà không cần cầm tay? NB Các thời gian chờ này được thi hành bởi TCP, không phải JVM.
Hầu tước Lorne
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.