Tôi có cần đập mạnh để giữ kết nối TCP mở không?


94

Tôi có hai thành phần giao tiếp qua TCP / IP. Thành phần A hoạt động như một máy chủ / người nghe và Thành phần B là máy khách. Hai người nên giao tiếp càng nhanh càng tốt. Chỉ có thể có một kết nối tại bất kỳ thời điểm nào (mặc dù đó là một bên cho câu hỏi này). Một nhà phát triển cấp cao tại công ty của tôi đã nói rằng tôi cần sử dụng nhịp tim cấp ứng dụng giữa hai thành phần để đảm bảo kết nối luôn mở.

Tôi nghĩ rằng kết nối vẫn mở với TCP / IP nhưng tôi đã đọc một số blog / trang web nói rằng đó là một thực tiễn khá chuẩn đối với nhịp tim giữa các ứng dụng này.

Tôi biết một phần lý do thành phần A nhịp tim nên thành phần B có thể thông báo cho bộ phận hỗ trợ nếu có sự cố liên lạc với thành phần B (liên kết bị ngắt hoặc thành phần B không chạy). Nhịp tim có cần vì lý do nào khác không? Chẳng hạn như để đảm bảo rằng thường xuyên có một cái gì đó "trong đường ống" để giữ cho nó mở?

Thành phần A hiện đang đập thành phần B sau mỗi 20 giây và đóng kết nối nếu không nhận được gì từ thành phần B trong 120 giây. Sau đó, nó tiếp tục lắng nghe các kết nối với giả định rằng thành phần B sẽ định kỳ thử kết nối lại nếu liên kết bị hỏng. Điều này hoạt động thành công.

Để nhắc lại câu hỏi của tôi: Nhịp tim có cần thiết để duy trì kết nối TCP / IP không?


1
Hành vi này cũng có thể phụ thuộc vào việc triển khai? Đây có phải là thứ được chỉ định trong tiêu chuẩn TCP hay nó được để dưới dạng chi tiết triển khai? Hy vọng rằng ai đó cũng có thể trả lời điều đó.
dss539

1
Đó là một chi tiết triển khai mà tôi muốn nói vì không phải tất cả các giao thức dựa trên TCP / IP đều triển khai như vậy, nó hoàn toàn phụ thuộc vào bạn.
Lloyd

5
Có - không phải do TCP / IP - mà do phần cứng hoặc phần mềm khác mà kết nối của bạn có thể đi qua, chẳng hạn như tường lửa và 'bộ định tuyến' gia đình có xu hướng bỏ kết nối TCP không hoạt động, liên quan: stackoverflow.com/questions/3907537/…
markmnl

Câu trả lời:


54

Kết nối sẽ vẫn mở bất kể nhưng có, người ta thường thấy các giao thức triển khai nhịp tim để giúp phát hiện các kết nối đã chết, ví dụ như IRC với lệnh PING .


34
Một lý do phổ biến khác cho keepalives là o giữ cho kết nối luôn mở thông qua cổng nat. Mặc dù bản thân TCP không cần keepalives để hoạt động, các cổng nat thường "thả" kết nối tcp sau một thời gian chờ nhất định.
nos

4
Thời gian chờ bình thường là gì? giây, phút, giờ?
MiniGod

@Lloyd Tôi "nghĩ" MiniGod có nghĩa là "Thời gian chờ bình thường sẽ là bao lâu ?" (câu trả lời được đưa ra trong vài giây, phút, giờ, ...)
jeromej

@JeromeJ Ai biết được, đã vài năm rồi;)
Lloyd

Ngoài ra, nếu kết nối của bạn đang đi qua proxy, bạn có thể mong đợi kết nối của mình bị ngắt nếu bị coi là cũ. Mặc dù vậy, tôi không nghĩ rằng việc tiếp tục tồn tại sẽ giúp ích trong trường hợp này, bởi vì khía cạnh này của tcp không phổ biến với ứng dụng.
Ghita

49

Như nhiều người khác đã lưu ý, kết nối TCP sẽ duy trì nếu được để cho các thiết bị của chính nó. Tuy nhiên, nếu bạn có một thiết bị ở giữa kết nối theo dõi trạng thái của nó (chẳng hạn như tường lửa), bạn có thể cần các vật lưu giữ để giữ cho mục nhập bảng trạng thái không hết hạn.


Kết nối TCP sẽ tồn tại mãi mãi?
user7817808

22

Nếu các thành phần của bạn:

  • đang ở trong một mạng có dây thông thường
  • không có tường lửa hoặc bộ định tuyến NAT giữa chúng
  • cả hai đều không bị rơi

thì bạn không cần phải có nhịp tim.

Nếu bất kỳ giả định nào trong số này là sai (tôi đang nhìn bạn, GPRS!), Nhịp tim trở nên cần thiết khá nhanh.


1
Tuy nhiên, đây là mạng nói chung. Hãy xem xét các Sự sụp đổ của Máy tính Phân tán của Peter Deutsch; chúng tôi biết rằng mạng vốn dĩ không đáng tin cậy và vì vậy nên được coi như một điểm lỗi gần như chắc chắn trong ứng dụng của bạn. Trong bối cảnh này, mạng có dây thông thường hay không, giả sử bạn sẽ gặp thất bại tại một số điểm và thiết kế ứng dụng của bạn để xử lý tình huống đó.
Steven Bakhtiari

11

Bạn không cần phải tự gửi nhịp tim. Kết nối TCP sẽ vẫn mở bất kể việc sử dụng.

Lưu ý rằng TCP dụng cụ tùy chọn keepalive cơ chế, có thể được sử dụng để xác định một kết nối khép kín một cách kịp thời, chứ không phải là yêu cầu bạn gửi dữ liệu vào một ngày sau đó và chỉ sau đó khám phá ra kết nối được đóng lại.


1
Làm thế nào nó được giả sử để làm việc trên linux? nó có hoạt động không? Tôi có thể sắp xếp thời gian chờ dưới 2 giờ không? chẳng hạn 30 giây?
Itay Levin

Để hoạt động, ứng dụng cần hỗ trợ keepalive. Chỉ bật nó trong Linux sẽ không đủ.
Mike Vella

9

Nếu bạn đang sử dụng cửa sổ, hãy thận trọng với TCP Keep-live. Theo mặc định, nó bị tắt trừ khi bạn bật nó trên toàn cầu bằng sổ đăng ký windows hoặc thông qua setsockopt.

Khoảng thời gian sống sót mặc định là 2 giờ.

http://msdn.microsoft.com/en-us/library/ms819735.aspx

Bạn có thể cần phải thực hiện nhịp tim của chính mình và tắt tính năng giữ sống của TCP trên windows nếu thời gian giữ sống 2 giờ là không mong muốn.


3

Nhịp tim có cần thiết để duy trì kết nối TCP / IP không?

Chúng hữu ích để phát hiện khi nào kết nối bị chết.


3

TCP sẽ giữ cho kết nối tồn tại. Nhịp tim ứng dụng dành cho các cân nhắc ở cấp độ ứng dụng như chuyển đổi dự phòng, cân bằng tải hoặc cảnh báo quản trị viên về các sự cố tiềm ẩn.


3

Nhịp tim là một cách tốt để nói với máy chủ rằng bạn còn sống, theo đó, ý tôi là, nếu máy chủ đang sử dụng hệ thống ngăn chặn tấn công DoS, nó (máy chủ) có thể xóa tất cả các tài nguyên được phân bổ cho kết nối cụ thể đó, sau khi nó phát hiện được. đang hoạt động trong một khoảng thời gian cụ thể.
Họ không có nhiệm vụ thực hiện bất kỳ cơ chế nhịp tim nào.

Nhưng sẽ rất tốt nếu bạn đang thiết kế một ứng dụng, trong đó tiêu chí chính là khả năng đáp ứng. Bạn sẽ không muốn lãng phí thời gian vào việc thiết lập kết nối, tra cứu DNS và khám phá đường dẫn. Chỉ cần duy trì kết nối mọi lúc, tiếp tục gửi nhịp tim và ứng dụng biết kết nối đang tồn tại và không cần thiết lập kết nối. Chỉ cần gửi và nhận đơn giản.


2

TCP / IP như một giao thức được chỉ định là không bị đóng cho đến khi bạn gửi một gói tin đóng. Tôi đã có các ổ cắm vẫn mở ngay cả sau khi có kết nối Internet hoặc không dây không ổn định.

Tuy nhiên, tất cả điều này rất phụ thuộc vào việc triển khai. Nhiều khả năng sẽ có "timeout" có nghĩa là khoảng thời gian tối đa để chờ phản hồi trước khi coi kết nối là "chết". Đôi khi điều này dựa trên chính ứng dụng, đôi khi dựa trên bộ định tuyến NAT.

Do đó, tôi thực sự khuyên bạn nên giữ "nhịp tim" để phát hiện các kết nối xấu và giữ chúng luôn mở.


2

Về cơ bản, kết nối TCP tạo ra các trạng thái liên kết được lưu trữ trong các bộ chuyển mạch dọc theo tuyến đường. Để phát hiện các kết nối bị hỏng (như khi một đối tác gặp sự cố (mà không gửi ngắt kết nối thích hợp)), các trạng thái này phải bị loại bỏ sau một thời gian không hoạt động. Và khi điều này xảy ra, kết nối TCP của bạn đã bị đóng. Mặc dù tôi không thể nói chính xác thời gian chờ này là bao lâu, nhưng dường như chúng phụ thuộc vào nhà sản xuất thiết bị và / hoặc nhà cung cấp internet. Tôi nhớ các phiên thiết bị đầu cuối SSH nhàn rỗi của tôi đã bị nhà cung cấp internet 1 & 1 cũ của tôi đóng nhanh chóng (chưa đến 15 phút thời gian rỗi) trong khi họ vẫn mở trong vài giờ khi sử dụng kết nối được cung cấp bởi Kabel-BW ...

Cuối cùng, tôi kết luận với những diễn giả trước đây của mình: nhịp tim là một cách tốt để biết liệu một kết nối có còn tồn tại hay không và đang hoạt động ...


1

Cái mà bạn gọi là nhịp tim rất hữu ích khi cố gắng đặt thời gian chờ. Ổ cắm của bạn có thể đang mở, nhưng người ở đầu dây bên kia có thể đang bị BSOD. Một trong những cách dễ nhất để phát hiện máy khách / máy chủ không còn tồn tại là đặt thời gian chờ và đảm bảo nhận được thông báo thường xuyên.

Một số người gọi chúng là NOOP (Không có hoạt động).

Nhưng không, chúng không cần thiết để duy trì kết nối, chỉ hữu ích khi biết trạng thái là gì.


1

Tôi sẽ nói rằng nếu bạn không có nhịp tim, không quan trọng là kết nối TCP / IP của bạn có mở hay không.


1

Nhịp tim không cần thiết cho các giao thức TCP. Việc triển khai nó ở đó để phát hiện xem bên kia có chấm dứt kết nối theo cách không chuẩn hay không (nghĩa là không trải qua quá trình loại bỏ).


0

Kết nối sẽ vẫn mở - không cần phải thực hiện nhịp tim và hầu hết các ứng dụng sử dụng ổ cắm không làm như vậy.


-2

Rất nhiều giao thức thực hiện một loại nhịp tim hoặc tình trạng sức khỏe như Lloyd đã nói. Để bạn biết kết nối vẫn mở và nếu bạn có thể đã bỏ lỡ bất kỳ điều gì

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.