ฉันจำเป็นต้อง heartbeat เพื่อให้การเชื่อมต่อ TCP เปิดอยู่หรือไม่


98

ฉันมีส่วนประกอบสองอย่างที่สื่อสารผ่าน TCP / IP ส่วนประกอบ A ทำหน้าที่เป็นเซิร์ฟเวอร์ / ผู้ฟังและส่วนประกอบ B คือไคลเอนต์ ทั้งสองควรสื่อสารกันโดยเร็วที่สุด สามารถมีการเชื่อมต่อเพียงครั้งเดียวได้ตลอดเวลา (แม้ว่าจะอยู่นอกเหนือคำถามนี้ก็ตาม) นักพัฒนาอาวุโสใน บริษัท ของฉันกล่าวว่าฉันจำเป็นต้องใช้การเต้นของหัวใจระดับแอปพลิเคชันระหว่างองค์ประกอบทั้งสองเพื่อให้แน่ใจว่าการเชื่อมต่อยังคงเปิดอยู่

ฉันคิดว่าการเชื่อมต่อยังคงเปิดอยู่ด้วย TCP / IP แต่ฉันได้อ่านบล็อก / ไซต์หลายแห่งบอกว่าการปฏิบัติตามมาตรฐานการเต้นของหัวใจระหว่างแอปพลิเคชันเหล่านี้ค่อนข้างเป็นมาตรฐาน

ฉันรู้ว่าส่วนหนึ่งขององค์ประกอบเหตุผลส่วนประกอบของการเต้นของหัวใจ B จึงสามารถแจ้งฝ่ายสนับสนุนได้หากมีปัญหาในการสื่อสารกับส่วนประกอบ B (ลิงก์ไม่ทำงานหรือส่วนประกอบ B ไม่ทำงาน) การเต้นของหัวใจจำเป็นด้วยเหตุผลอื่นหรือไม่? เช่นเพื่อให้แน่ใจว่ามีบางสิ่งบางอย่าง "อยู่ในท่อ" เพื่อให้มันเปิดอยู่บ่อยๆ?

ส่วนประกอบ A ขณะนี้ heartbeats ส่วนประกอบ B ทุกๆ 20 วินาทีและปิดการเชื่อมต่อหากไม่มีสิ่งใดได้รับกลับมาจากส่วนประกอบ B ใน 120 วินาที จากนั้นจะกลับมาฟังการเชื่อมต่ออีกครั้งภายใต้สมมติฐานว่าส่วนประกอบ B จะพยายามเชื่อมต่อใหม่เป็นระยะหากลิงก์เสีย ทำงานได้สำเร็จ

เพื่อย้ำคำถามของฉัน: การเต้นของหัวใจจำเป็นต่อการเชื่อมต่อ TCP / IP หรือไม่


1
พฤติกรรมนี้อาจขึ้นอยู่กับการนำไปใช้งานได้หรือไม่? นี่คือสิ่งที่ระบุไว้ในมาตรฐาน TCP หรือทิ้งไว้เป็นรายละเอียดการนำไปใช้งาน? หวังว่าจะมีคนอื่นตอบได้เช่นกัน
dss539

1
เป็นรายละเอียดการใช้งานที่ฉันจะบอกว่าไม่ใช่ทุกโปรโตคอลที่ใช้ TCP / IP ใช้เช่นนั้นขึ้นอยู่กับคุณทั้งหมด
Lloyd

5
ใช่ - ไม่ใช่เพราะ TCP / IP - แต่เป็นเพราะฮาร์ดแวร์หรือซอฟต์แวร์อื่นที่คุณเชื่อมต่ออาจผ่านเช่นไฟร์วอลล์และ 'เราเตอร์' ในบ้านซึ่งมีแนวโน้มที่จะลดการเชื่อมต่อ TCP ที่ไม่ใช้งานซึ่งเกี่ยวข้อง: stackoverflow.com/questions/3907537/…
markmnl

คำตอบ:


55

การเชื่อมต่อควรยังคงเปิดอยู่โดยไม่คำนึงถึง แต่ใช่เป็นเรื่องปกติที่จะเห็นโปรโตคอลใช้การเต้นของหัวใจเพื่อช่วยในการตรวจจับการเชื่อมต่อที่เสียชีวิตเช่น IRC ด้วยคำสั่งPING


34
อีกเหตุผลที่พบบ่อยสำหรับการรักษาไว้คือ o ให้เปิดการเชื่อมต่อผ่านเกตเวย์ nat แม้ว่า TCP เองก็ไม่จำเป็นต้องใช้ Keepalives ในการทำงาน แต่เป็นเรื่องปกติที่เกตเวย์ของ nat จะ "ทิ้ง" การเชื่อมต่อ tcp หลังจากหมดเวลาที่กำหนด
เลขที่

4
การหมดเวลาปกติคืออะไร? วินาทีนาทีชั่วโมง?
MiniGod

@Lloyd ฉัน "คิดว่า" MiniGod หมายถึง "ระยะหมดเวลาปกติจะนานแค่ไหน" (คำตอบที่ให้เป็นวินาทีนาทีชั่วโมง…)
jeromej

@JeromeJ ใครจะไปรู้ก็ไม่กี่ปีแล้ว;)
ลอยด์

นอกจากนี้หากคุณเชื่อมต่อผ่านพร็อกซีคุณอาจคาดหวังว่าการเชื่อมต่อของคุณจะหลุดหากถือว่าค้าง ฉันไม่คิดว่าการมีชีวิตอยู่จะช่วยได้ในกรณีนี้เพราะลักษณะของ tcp นี้ไม่ได้เผยแพร่ไปยังแอปพลิเคชัน
Ghita

50

ดังที่คนอื่น ๆ กล่าวไว้การเชื่อมต่อ TCP จะยังคงอยู่หากปล่อยให้อุปกรณ์ของตัวเอง อย่างไรก็ตามหากคุณมีอุปกรณ์ที่อยู่ตรงกลางของการเชื่อมต่อที่ติดตามสถานะของอุปกรณ์ (เช่นไฟร์วอลล์) คุณอาจต้องใช้ของ Keepalives เพื่อป้องกันไม่ให้รายการตารางสถานะหมดอายุ


การเชื่อมต่อ TCP จะบอกว่ามีชีวิตอยู่ตลอดไป?
user7817808

24

หากส่วนประกอบของคุณ:

  • อยู่ในเครือข่ายแบบใช้สายทั่วไป
  • ไม่มีไฟร์วอลล์หรือเราเตอร์ NAT ระหว่างพวกเขา
  • ทั้งคู่ไม่ผิดพลาด

คุณไม่จำเป็นต้องมีการเต้นของหัวใจ

หากสมมติฐานใด ๆ เหล่านี้เป็นเท็จ (ฉันกำลังมองหาคุณอยู่ GPRS!) การเต้นของหัวใจจะกลายเป็นสิ่งที่จำเป็นอย่างรวดเร็ว


1
นี่คือเครือข่ายโดยทั่วไปแม้ว่า พิจารณาความผิดพลาดของคอมพิวเตอร์แบบกระจายของ Peter Deutsch เราทราบดีว่าเครือข่ายไม่น่าเชื่อถือโดยเนื้อแท้ดังนั้นควรถือว่าเป็นจุดหนึ่งของความล้มเหลวในแอปพลิเคชันของคุณ ในบริบทนี้เครือข่ายแบบใช้สายทั่วไปหรือไม่สมมติว่าคุณจะประสบกับความล้มเหลวในบางจุดและออกแบบแอปพลิเคชันของคุณเพื่อจัดการกับสถานการณ์นั้น
Steven Bakhtiari

11

คุณไม่จำเป็นต้องส่งสัญญาณการเต้นของหัวใจด้วยตัวเอง การเชื่อมต่อ TCP จะยังคงเปิดอยู่โดยไม่คำนึงถึงการใช้งาน

โปรดทราบว่า TCP ใช้กลไกKeepalive ที่เป็นทางเลือกซึ่งสามารถใช้เพื่อระบุการเชื่อมต่อแบบปิดในเวลาที่เหมาะสมแทนที่จะกำหนดให้คุณต้องส่งข้อมูลในภายหลังจากนั้นจึงพบว่าการเชื่อมต่อถูกปิด


1
มันคิดว่าจะทำงานบน linux ได้อย่างไร? มันไม่ได้ผล? ฉันสามารถกำหนดระยะหมดเวลาให้น้อยกว่า 2 ชั่วโมงได้หรือไม่? เช่น 30 วินาที?
Itay Levin

เพื่อให้ใช้งานได้แอปพลิเคชันจำเป็นต้องสนับสนุน Keepalive การเปิดใช้งานใน Linux จะไม่เพียงพอ
Mike Vella

9

หากคุณใช้ windows โปรดระมัดระวังเกี่ยวกับ TCP Keep-alive โดยค่าเริ่มต้นจะปิดใช้งานเว้นแต่คุณจะเปิดใช้งานทั่วโลกด้วยรีจิสทรีของ Windows หรือผ่าน setsockopt

ช่วงเวลาการรักษาชีวิตเริ่มต้นคือ 2 ชั่วโมง

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

คุณอาจต้องใช้การเต้นของหัวใจของคุณเองและปิดการใช้งาน TCP keep-alive บน windows หากไม่ต้องการให้มีชีวิตอยู่ 2 ชั่วโมง


3

การเต้นของหัวใจจำเป็นต่อการเชื่อมต่อ TCP / IP หรือไม่?

มีประโยชน์ในการตรวจจับเมื่อการเชื่อมต่อเสียชีวิต


3

TCP จะคงการเชื่อมต่อไว้ การเต้นของหัวใจของแอปพลิเคชันมีไว้สำหรับการพิจารณาระดับแอปพลิเคชันเช่นการล้มเหลวการโหลดบาลานซ์หรือการแจ้งเตือนผู้ดูแลระบบถึงปัญหาที่อาจเกิดขึ้น


3

การเต้นของหัวใจเป็นวิธีที่ดีในการบอกเซิร์ฟเวอร์ว่าคุณยังมีชีวิตอยู่โดยที่ฉันหมายความว่าหากเซิร์ฟเวอร์ใช้ระบบป้องกันการโจมตี DoS เซิร์ฟเวอร์ (เซิร์ฟเวอร์) อาจลบทรัพยากรที่จัดสรรทั้งหมดสำหรับการเชื่อมต่อนั้นออกหลังจากตรวจพบ ในกิจกรรมในช่วงเวลาที่กำหนด
พวกเขาไม่มีอำนาจในการใช้กลไกการเต้นของหัวใจ

แต่จะดีถ้าคุณกำลังออกแบบแอปพลิเคชันโดยที่เกณฑ์หลักคือการตอบสนอง คุณไม่ต้องการเสียเวลากับการตั้งค่าการเชื่อมต่อการค้นหา DNS และการค้นหาเส้นทาง มีเพียงแค่เชื่อมต่อตลอดเวลาส่งสัญญาณการเต้นของหัวใจและแอปพลิเคชันรู้ว่าการเชื่อมต่อยังมีชีวิตอยู่และไม่จำเป็นต้องตั้งค่าการเชื่อมต่อ เพียงแค่ส่งและรับ


2

TCP / IP เป็นโปรโตคอลถูกระบุว่าห้ามปิดจนกว่าคุณจะส่งแพ็กเก็ตปิด ฉันมีซ็อกเก็ตยังคงเปิดอยู่แม้ว่าจะมีการเชื่อมต่อไร้สายหรืออินเทอร์เน็ตขาด ๆ หาย ๆ

อย่างไรก็ตามทั้งหมดนี้ขึ้นอยู่กับการนำไปใช้ ส่วนใหญ่จะมี "หมดเวลา" ซึ่งหมายถึงระยะเวลาสูงสุดในการรอการตอบกลับก่อนที่จะพิจารณาว่าการเชื่อมต่อเป็น "หมดเวลา" บางครั้งสิ่งนี้ขึ้นอยู่กับแอปพลิเคชันเองบางครั้งก็ใช้เราเตอร์ NAT

ดังนั้นฉันขอแนะนำให้คุณหมั่น "เต้น" เพื่อตรวจจับการเชื่อมต่อที่ไม่ดีและเปิดไว้


2

โดยทั่วไปการเชื่อมต่อ TCP จะสร้างสถานะลิงก์ที่เก็บไว้ในสวิตช์ตามเส้นทาง ในการตรวจจับการเชื่อมต่อที่ใช้งานไม่ได้ (เช่นเมื่อคู่สนทนาขัดข้อง (โดยไม่ส่งการตัดการเชื่อมต่อที่เหมาะสม)) สถานะเหล่านี้จะต้องถูกขับไล่หลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่ง และเมื่อเกิดเหตุการณ์นี้การเชื่อมต่อ TCP ของคุณถูกปิด แม้ว่าฉันจะไม่สามารถบอกได้แน่ชัดว่าการหมดเวลาเหล่านี้เป็นระยะเวลาเท่าใด แต่ดูเหมือนว่าจะขึ้นอยู่กับผู้ผลิตอุปกรณ์และ / หรือผู้ให้บริการอินเทอร์เน็ต ฉันจำได้ว่าเซสชันเทอร์มินัล SSH ที่ไม่ได้ใช้งานของฉันถูกปิดอย่างรวดเร็ว (เวลาว่างน้อยกว่า 15 นาที) โดยผู้ให้บริการอินเทอร์เน็ต 1 & 1 รายเดิมของฉันในขณะที่พวกเขายังคงเปิดเป็นเวลาหลายชั่วโมงเมื่อใช้การเชื่อมต่อ Kabel-BW ที่ให้ ...

สุดท้ายฉันสรุปกับผู้พูดคนก่อนของฉัน: การเต้นของหัวใจเป็นวิธีที่ดีในการบอกว่าการเชื่อมต่อยังมีชีวิตอยู่หรือไม่และเตะ ...


1

สิ่งที่คุณเรียกว่าการเต้นของหัวใจมีประโยชน์เมื่อพยายามตั้งค่าระยะหมดเวลา ซ็อกเก็ตของคุณอาจเปิดขึ้น แต่บุคคลที่อยู่อีกด้านหนึ่งอาจกำลังประสบปัญหา BSOD วิธีที่ง่ายที่สุดวิธีหนึ่งในการตรวจจับไคลเอนต์ / เซิร์ฟเวอร์ที่เสียคือกำหนดระยะหมดเวลาและตรวจสอบให้แน่ใจว่าได้รับข้อความทุกครั้ง

บางคนเรียกพวกเขาว่า NOOPs (No Ops)

แต่ไม่พวกเขาไม่จำเป็นต้องรักษาการเชื่อมต่อให้คงอยู่มีประโยชน์เพียงแค่รู้ว่าสถานะคืออะไร


1

ฉันจะบอกว่าถ้าคุณไม่มีการเต้นของหัวใจก็ไม่สำคัญว่าการเชื่อมต่อ TCP / IP ของคุณจะเปิดอยู่หรือไม่


1

Heartbeat ไม่ใช่สิ่งจำเป็นสำหรับโปรโตคอล TCP มีการใช้งานเพื่อตรวจสอบว่าอีกฝั่งได้ยุติการเชื่อมต่อด้วยวิธีที่ไม่ได้มาตรฐานหรือไม่


0

การเชื่อมต่อจะยังคงเปิดอยู่ - ไม่จำเป็นต้องใช้ heartbeat และแอปพลิเคชันส่วนใหญ่ที่ใช้ซ็อกเก็ตจะไม่ทำเช่นนั้น


-2

โปรโตคอลจำนวนมากใช้การเต้นของหัวใจหรือสถานะสุขภาพอย่างที่ลอยด์กล่าว เพียงเพื่อให้คุณทราบว่าการเชื่อมต่อยังคงเปิดอยู่และหากคุณพลาดอะไรไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.