คุณใช้อะไรเมื่อคุณต้องการ UDP ที่เชื่อถือได้?


93

หากคุณมีสถานการณ์ที่การเชื่อมต่อ TCP อาจช้าเกินไปและ 'การเชื่อมต่อ' UDP อาจไม่น่าเชื่อถือเกินไปคุณใช้อะไร? มีโปรโตคอล UDP มาตรฐานที่เชื่อถือได้หลายแบบคุณมีประสบการณ์อะไรบ้าง?

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

ฉันสนใจตัวเลือกต่างๆที่นี่ซึ่ง TCP อยู่ที่ปลายด้านหนึ่งของมาตราส่วนและ UDP อยู่ที่อีกด้านหนึ่ง มีตัวเลือก UDP ที่เชื่อถือได้หลากหลายและแต่ละองค์ประกอบของ TCP ไปยัง UDP

ฉันรู้ว่าบ่อยครั้ง TCP เป็นตัวเลือกที่ถูกต้อง แต่การมีรายการทางเลือกมักจะมีประโยชน์ในการช่วยให้ได้ข้อสรุปดังกล่าว สิ่งต่างๆเช่น Enet, RUDP และอื่น ๆ ที่สร้างขึ้นบน UDP มีข้อดีข้อเสียหลายประการคุณเคยใช้มันมาแล้วมีประสบการณ์อย่างไรบ้าง?

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


1
คำถามนี้ดูเหมือนจะไม่ตรงประเด็นเนื่องจากเป็นการสำรวจเทคโนโลยี
Dave Hillier

ผู้ที่คิดว่า TCP ดีที่สุดในทุกกรณีโปรดอ่าน: en.wikipedia.org/wiki/Bandwidth-delay_product
nullptr

วิกิพีเดียมีดีตารางเปรียบเทียบด้านต่างๆของ UDP, UDP Lite, TCP, Multipath TCP, SCTP, DCCP และ RUDP SCTP รองรับคุณสมบัติส่วนใหญ่ในรายการนั้น
Evgeniy Berezovsky

@EugeneBeresovsky ฉันทำวิจัยเล็กน้อยเกี่ยวกับ SCTP ข้อมูลส่วนใหญ่รวมถึงจากคำตอบ SO ตั้งแต่ปี 2013 และก่อนหน้าคนส่วนใหญ่เขียนย้อนกลับไปว่าการยอมรับ SCTP นั้นต่ำมากฉันสงสัยว่าวันนี้เป็นอย่างไรดูหัวข้อนี้stackoverflow.com/questions/1171555/…
Michael IV

@MichaelIvanov Adoption ต่ำแน่นอน แต่ถ้าคุณตั้งใจจะใช้ภายในศูนย์ข้อมูลของคุณคุณจะไม่สนใจเกี่ยวกับการนำไปใช้ภายนอกตราบใดที่สวิตช์และเราเตอร์ไม่ก่อให้เกิดปัญหา (ซึ่งในศูนย์ข้อมูลไม่ควร) และคุณมีระบบปฏิบัติการ และการสนับสนุนห้องสมุดซึ่งอาจเป็นปัญหาดังที่อธิบายไว้ในคำตอบข้อใดข้อหนึ่งในคำถามที่คุณเชื่อมโยง
Evgeniy Berezovsky

คำตอบ:


25

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

แต่ในแง่ทั่วไป (มาก!) ฉันคิดว่าคุณจะต้องพยายามอย่างหนักเพื่อเอาชนะ tcp เพื่อความเร็วเว้นแต่คุณจะสามารถตั้งสมมติฐานที่ยากลำบากเกี่ยวกับข้อมูลที่คุณพยายามจะส่ง

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

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


4
โอเคฉันจะปรับคำถาม ฉันสนใจข้อดีข้อเสียของโปรโตคอล UDP ที่เชื่อถือได้ต่างๆมากกว่าการตอบสนองแบบ 'ใช้ TCP')
Len Holgate

9
@ แอนดรูว์ - ง่ายมากที่จะเอาชนะ TCP ในสองกรณี: (1) แอปพลิเคชันของคุณมีข้อกำหนดด้านความน่าเชื่อถือที่น้อยกว่า "ข้อมูลทั้งหมดเรียงตามลำดับเสมอไม่ซ้ำกันไม่มีการเข้าคิวมากเกินไป" หรือ (2) คุณกำลังใช้มัลติคาสต์ UDP ที่เชื่อถือได้เป็นเรื่องปกติมากสำหรับสภาพแวดล้อมแบบหลายผู้รับ
ทอม

4
นอกจากนี้ TCP ยังต้องทนทุกข์ทรมานอย่างมากเมื่อใช้กับการเชื่อมต่อ WAN (ปัญหาระยะไกล) ทำไมง่าย TCP ใช้หน้าต่างที่แพ็กเก็ตในหน้าต่างจะต้องได้รับการยอมรับ โปรโตคอล ACK ประสบเนื่องจากเวลาแฝงเนื่องจากระยะทางของเส้น Google: WAN TCP "speed of light"
Ajaxx

3
@Ajaxx คุณถูกต้องมากเกี่ยวกับเรื่องนี้อย่างไรก็ตาม TCP / IP ทำสิ่งนี้โดยเจตนาเนื่องจากการล่มสลายของอินเทอร์เน็ตครั้งล่าสุด หากคุณกำลังทำโปรโตคอลอัตราบิตสูงโดยไม่มีการควบคุมความแออัดโดยพื้นฐานแล้วคุณจะต้องอับอาย หากคุณเป็นเจ้าของเครือข่ายก็จงหลีกเลี่ยง
Kevin Nisbet

2
"โดยที่อัตราการสุ่มตัวอย่างสูงกว่าอัตรานิควิสต์อย่างมีนัยสำคัญ" - อัตราการสุ่มตัวอย่างจะเป็นสองเท่าของอัตรานิควิสต์เสมอตามคำจำกัดความ
สตีฟ

27

สิ่งที่เกี่ยวกับSCTP เป็นโปรโตคอลมาตรฐานของ IETF (RFC 4960)

มีความสามารถในการแยกชิ้นส่วนซึ่งสามารถช่วยในเรื่องความเร็วได้

อัปเดต: การเปรียบเทียบระหว่าง TCP และ SCTPแสดงให้เห็นว่าการแสดงสามารถเทียบเคียงกันได้เว้นแต่จะสามารถใช้สองอินเทอร์เฟซ

การปรับปรุงที่: บทความแนะนำที่ดี


เป็นสิ่งที่ดีฉันสนใจสิ่งต่าง ๆ ที่สามารถสร้างขึ้นบน UDP มากกว่าสร้างจาก IP แต่แน่นอนว่าเป็นสิ่งที่เหมาะกับพื้นที่โซลูชัน
Len Holgate

SCTP มีคุณสมบัติที่ยอดเยี่ยมมากมาย (เช่น multihoming) และด้วยส่วนขยายความน่าเชื่อถือบางส่วน (RFC 3758) จึงเป็นตัวเลือกที่ยืดหยุ่นอย่างไม่น่าเชื่อ มันรวมอยู่ในเคอร์เนลลินุกซ์เวอร์ชันล่าสุด แต่สำหรับ Windows คุณจะต้องติดตั้งสแต็ก SCTP ของคุณเอง
Andrew Johnson

6
สามารถปรับ SCTP ผ่าน UDP ได้ tools.ietf.org/id/draft-ietf-sigtran-sctptunnel-00.txt
ไมล์

ขอบคุณ Miles นี่เป็นลิงค์ที่มีประโยชน์!
Len Holgate

1
ใช่ ... แต่สิ่งที่สร้างขึ้นบน UDP แทนที่จะอยู่ในระดับเดียวกับ UDP นั้นมีแนวโน้มที่จะใช้งานได้ง่ายกว่าในพื้นที่ผู้ใช้อย่างน้อยก็ใน Windows ...
Len Holgate

22

ENET - http://enet.bespin.org/

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

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


14

เรามีลูกค้าในอุตสาหกรรมป้องกันประเทศบางรายที่ใช้ UDT (UDP-based Data Transfer) (ดูhttp://udt.sourceforge.net/ ) และพอใจกับมันมาก ฉันเห็นว่ามีใบอนุญาต BSD ที่เป็นมิตรเช่นกัน


2
คุณสามารถอธิบายรายละเอียดเกี่ยวกับลูกค้าของคุณและกรณีการใช้งานโดยเฉพาะอย่างยิ่งในภาคการป้องกัน อาจจะไม่ แต่ก็คุ้มค่าที่จะยิง ฉันได้โยนความคิดไปยังผู้บังคับบัญชาของฉันเกี่ยวกับ UDT ในแอปพลิเคชันการถ่ายโอนไฟล์ แต่มันก็ยังไม่หายไปไหน
Thomas Owens

10

RUDP - โปรโตคอลดาต้าแกรมผู้ใช้ที่เชื่อถือได้

สิ่งนี้ให้:

  • การรับแพ็คเก็ตที่ได้รับ
  • การควบคุมหน้าต่างและความแออัด
  • การส่งแพ็กเก็ตที่สูญหายอีกครั้ง
  • Overbuffering (เร็วกว่าการสตรีมแบบเรียลไทม์)

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


ฉันกำลังดูสิ่งนี้ แต่ดูเหมือนจะไม่มีการใช้งานมากมาย มีคำแนะนำหรือไม่?
Nicholas

ไม่ล่ะขอบคุณ. ฉันไม่ได้ใช้มันในตอนท้ายและมักจะใช้งานตั้งแต่เริ่มต้น
Len Holgate

9

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

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

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

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

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");

อย่างที่ฉันพูดไปสมมติว่า TCP อยู่ที่ปลายด้านหนึ่งของสเกลและ UDP ที่อีกด้านหนึ่งจะมีอะไรอีก
Len Holgate

หากคุณต้องการอวดดีโปรโตคอลที่กล่าวถึงส่วนใหญ่จะสร้างขึ้นจาก UDP
smo

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

1
การตอบสนองที่รวดเร็วไม่จำเป็นต้องเท่ากับปริมาณงานที่สูง
Matt

1
ฉันไม่เห็นด้วย. เมื่อใช้ nagle บนโปรโตคอลที่ใช้ TCP ซึ่งมีแพ็กเก็ตขนาดเล็กจำนวนมากมันจะรวมเข้าด้วยกันและสร้างแพ็กเก็ตที่ใหญ่ขึ้น ทำให้การส่งล่าช้าเล็กน้อยดังนั้น latecy จึงอาจเพิ่มขึ้นเล็กน้อย อย่างไรก็ตามปริมาณงานสามารถลดลงได้เมื่อปิด nagle เนื่องจากแพ็กเก็ตมากขึ้น = ส่วนหัวของแพ็กเก็ตมากขึ้น = ค่าโสหุ้ยที่มากขึ้น แพ็คเก็ตที่ถูกทิ้งบน LAN มักจะเกี่ยวข้องกับการเติมบัฟเฟอร์อินพุต หากคุณมีลูกค้าจำนวนมากที่ส่งข้อมูลไปยังโฮสต์เดียวกันอาจทำให้เกิดความแตกต่างเป็นศูนย์ ฉันไม่เชื่อว่าการปิดและเปิด nagle จะมีผลในทางปฏิบัติ
แมท

8

ใครก็ตามที่ตัดสินใจว่ารายการด้านบนไม่เพียงพอและต้องการพัฒนา UDP ที่เชื่อถือได้ของตนเองควรดูข้อมูลจำเพาะของ Google QUIC อย่างแน่นอนเนื่องจากครอบคลุมกรณีมุมที่ซับซ้อนจำนวนมากและอาจมีการโจมตีปฏิเสธบริการ ฉันยังไม่ได้เล่นกับการใช้งานสิ่งนี้และคุณอาจไม่ต้องการหรือต้องการทุกสิ่งที่มีให้ แต่เอกสารนี้ควรค่าแก่การอ่านก่อนที่จะเริ่มออกแบบ UDP ใหม่ที่ "เชื่อถือได้"

จุดเริ่มต้นที่ดีสำหรับ QUIC อยู่ที่นี่แล้วที่ Chromium Blog

ปัจจุบันเอกสารการออกแบบ QUIC สามารถพบได้ที่นี่


4

หากคุณมีสถานการณ์ที่การเชื่อมต่อ TCP อาจช้าเกินไปและ 'การเชื่อมต่อ' UDP อาจไม่น่าเชื่อถือเกินไปคุณใช้อะไร? มีโปรโตคอล UDP มาตรฐานที่เชื่อถือได้หลายแบบคุณมีประสบการณ์อะไรบ้าง?

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

หากคุณต้องการได้รับความน่าเชื่อถือจาก UDP คุณจะต้องนำคุณสมบัติบางอย่างของ TCP มาใช้ใหม่ที่ด้านบนของ UDP ซึ่งอาจทำให้สิ่งต่างๆช้ากว่าการใช้ TCP ในตอนแรก


ใช่ Andrew Edgecombe พูดมาก แต่อย่างที่บอกฉันสนใจข้อดีข้อเสียของทางเลือกอื่นที่มี หากไม่มีรายการทางเลือกและข้อดีข้อเสียก็ยากที่จะตัดสินใจว่าอะไรดีที่สุด
Len Holgate

ด้วยฟังก์ชั่น reliablity ที่เป็นที่รู้จักบางครั้งสตรีม UDP สามารถปรับแต่งด้วยมือเพื่อให้อยู่เหนือสตรีม TCP ใน hte OS หายาก
Joshua

1
@ 17 จาก 26 ฉันยอมรับ Len Holgate TCP จะช้ากว่า UDP ที่เชื่อถือได้ในบางสถานการณ์ เช่นเดียวกับเครือข่าย BDP สูงสมมติว่าคุณมีการเชื่อมต่ออินเทอร์เน็ต 1 Gbps จากจีนไปยัง NewYork ฉันมั่นใจว่า TCP จะดูดใช้ความเร็ว 1 Gbps เกือบทั้งหมด TCP ดีกว่าสำหรับการเชื่อมต่อส่วนใหญ่บนโลก แต่ไม่ใช่สำหรับเครือข่ายที่มี High Bandwidth Delay Product
nullptr

4

โปรโตคอล DCCP ซึ่งเป็นมาตรฐานในRFC 4340 "Datagram Congestion Control Protocol" อาจเป็นสิ่งที่คุณกำลังมองหา

ดูเหมือนว่าการดำเนินการในลินุกซ์


3

อาจเป็นRFC 5405 "แนวทางการใช้งาน Unicast UDP สำหรับนักออกแบบแอปพลิเคชัน" จะเป็นประโยชน์สำหรับคุณ


2

คุณพิจารณาบีบอัดข้อมูลของคุณหรือไม่

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


1
โดยเฉพาะอย่างยิ่งกับไลบรารีการบีบอัดที่ทันสมัย บางตัวเร็วพอ ๆ กับ memcpy เช่น lz4.
Matt


-2

วิธีที่ดีที่สุดในการบรรลุความน่าเชื่อถือโดยใช้ UDP คือการสร้างความน่าเชื่อถือในโปรแกรมแอปพลิเคชัน (ตัวอย่างเช่นโดยการเพิ่มกลไกการตอบรับและการส่งข้อมูลซ้ำ)

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