UDP กับ TCP เร็วแค่ไหน? [ปิด]


194

สำหรับการแลกเปลี่ยนข้อความโปรโตคอลทั่วไปซึ่งสามารถทนต่อการสูญเสียต UDP มีประสิทธิภาพมากกว่า TCP มากน้อยเพียงใด


คุณสามารถเพิ่มแท็ก "tcp" ได้เนื่องจากคำถามเกี่ยวกับ TCP เช่นกัน
Cristian Ciupitu

5
"การแลกเปลี่ยนข้อความโปรโตคอลทั่วไป" หมายความว่าอะไร? คำถามต้องชี้แจงว่าเรื่องใดเกี่ยวกับประสิทธิภาพ เราต้องการเวลาแฝงที่น้อยลงสำหรับข้อความเล็ก ๆ หรือไม่? หรือเราต้องการปริมาณงานที่สูงขึ้นสำหรับสตรีมข้อมูลที่ต่อเนื่องหรือไม่?
Johan Boulé

Tcp มีคุณสมบัติที่ดีกว่า UDP ยกเว้นความเร็ว
RAJKUMAR NAGARETHINAM

3
คำถามเกี่ยวกับความเร็ว TCP กับ UDP นั้นเป็นสิ่งที่สงสัย คำถามในหัวเรื่องของคุณจริง ๆ แล้วไม่ตรงกับเนื้อหาของคำถาม ทั้งแพ็คเก็ต TCP และ UDP เดินทางที่ความเร็วเท่ากันบนสื่อเดียวกัน
Ron Maupin

คำตอบ:


86

UDP นั้นเร็วกว่า TCP และเหตุผลง่ายๆคือเนื่องจากแพ็กเก็ตตอบรับที่ไม่มีอยู่ (ACK) ที่อนุญาตให้มีการส่งแพ็กเก็ตต่อเนื่องแทน TCP ที่รับชุดของแพ็คเก็ตคำนวณโดยใช้ขนาดหน้าต่าง TCP และเวลาเดินทาง (RTT)

สำหรับข้อมูลเพิ่มเติมฉันแนะนำคำอธิบาย Skullbox ที่เรียบง่าย แต่เข้าใจได้ง่าย(TCP vs. UDP)


19
มีหลายกรณีที่ TCP เร็วกว่า UDP จริง ดูคำตอบของฉันด้านล่าง
Robert S. Barnes

2
ซึ่งเร็วขึ้นทั้งหมดขึ้นอยู่กับลักษณะการจราจร

4
แม้ว่าคำตอบอาจถูกต้อง แต่ก็ไม่ตอบคำถามและซ้ำความรู้ที่กล่าวถึงซ้ำ ๆ ยังไม่ได้กล่าวถึงว่าวิธี UDP ที่เชื่อถือได้ด้วย ACK นั้นจะเร็วกว่า TCP อย่างเห็นได้ชัด
Elliot Woods

268

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

ในระดับที่ใหญ่กว่าพฤติกรรม TCP นี้คือสิ่งที่ทำให้อินเทอร์เน็ตไม่สามารถล็อคเข้าสู่ "การล่มสลายของความแออัด"

สิ่งที่มีแนวโน้มที่จะผลักดันแอปพลิเคชันไปยัง UDP:

  • ความหมายของการจัดส่งเป็นกลุ่ม: เป็นไปได้ที่จะทำการจัดส่งที่เชื่อถือได้ไปยังกลุ่มคนที่มีประสิทธิภาพมากกว่าการรับรู้จุดต่อจุดของ TCP

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

  • ความไม่เป็นมิตร: ในปาร์ตี้ LAN คุณอาจไม่สนใจว่าเว็บเบราว์เซอร์ของคุณทำงานได้ดีตราบใดที่คุณกำลังอัปเดตเครือข่ายให้เร็วที่สุดเท่าที่จะทำได้

แต่ถึงแม้ว่าคุณจะสนใจเรื่องประสิทธิภาพคุณอาจไม่ต้องการใช้ UDP:

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

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

  • สิ่งสำคัญที่สุดคือไฟร์วอลล์จะบล็อกคุณ

คุณสามารถเอาชนะประสิทธิภาพของ TCP และปัญหาความหน่วงโดยการ "เชื่อมต่อ" หลายการเชื่อมต่อ TCP เข้าด้วยกัน iSCSI ทำสิ่งนี้เพื่อควบคุมความแออัดของเครือข่ายท้องถิ่น แต่คุณสามารถสร้างแชนเนลข้อความ "เร่งด่วน" ที่มีความหน่วงแฝงต่ำ (พฤติกรรม "ด่วน" ของ TCP นั้นใช้งานไม่ได้)


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

1
@AaronLS: การสูญเสียแพ็กเก็ตและRTT (เวลาไปกลับ) เพิ่มขึ้น (ซึ่งสามารถเห็นได้ว่าเป็นพร็อกซีสำหรับการรอคิวล่าช้า ) เป็น / สามารถ (เช่น: เครือข่าย WiFi อาจสูญเสียแพ็คเก็ตโดยไม่ต้องคับคั่งจริง ๆ ตัวชี้วัดความแออัด
ninjalj

2
UDP เป็นไอ้ที่ต้องรับมือกับ ... ฉันหมดเรื่องไปแล้ว ไม่ว่าฉันจะทำอะไรฉันก็ไม่สามารถหาจุดสมดุลของประสิทธิภาพความหน่วงแฝงปริมาณงานและความน่าเชื่อถือ ยอดเยี่ยมสำหรับสิ่งต่าง ๆ แบบเรียลไทม์เช่นตัวจับเวลา ... แต่ฉันกำลังใช้การแทนที่ TCP โดยใช้ UDP และการแก้ไขข้อผิดพลาดไปข้างหน้าและนี่ยากกว่าที่ฉันคิดไว้มาก ควบคุมความแออัด ระบบสากลที่ทำงานบนเครือข่าย 1GB และเครือข่ายไร้สายเหมือนกันทั้งหมดคืองานศิลปะ ฉันรู้สึกว่าฉันกำลังพยายามรวมกลุ่มแพ็กเก็ตที่ใส่ปืนลูกซองอีกครั้ง
Jason Nelson

1
Btw อีกสิ่งหนึ่งที่อยู่ในความโปรดปรานของ TCP ก็คือมันเป็นการเชื่อมต่อโดยเนื้อแท้ซึ่งช่วยลดความซับซ้อนของแอปพลิเคชันไคลเอนต์ในการจัดการตรรกะ ( listen-> accept-> สถานะไคลเอนต์เป็นอิสระจากลูกค้ารายอื่น) การจัดการการเชื่อมต่อหลายรายการจากไคลเอนต์เดียวโดยเฉพาะจะกลายเป็น gnarly ด้วย UDP และจุดในความโปรดปรานของ UDP เป็นกอง UDP เป็นจริงๆง่ายต่อการใช้ซึ่งเป็นบวกอย่างมากต่อระบบฝังตัว (ไมโครคอนโทรลเลอร์, FPGAs ฯลฯ ในการดำเนินงานเครือข่าย TCP โดยเฉพาะอย่างยิ่งสำหรับ FPGA โดยทั่วไปสิ่งที่คุณเพียงต้องการที่จะซื้อจากคนอื่น และไม่คิดถึง)
Jason C

1
ทั้งหมดนี้ย่อมาจากการสมมติว่าเราสนใจส่งข้อมูลขนาดใหญ่เท่านั้น ในแอพพลิเคชั่นไม่กี่เกม (เกม / VoIP) สถานการณ์มีความแตกต่างกันอย่างมาก: เรามีข้อมูลจำนวนน้อยมาก แต่ใส่ใจเวลาในการตอบสนองมาก มันเป็นเรื่องง่าย ๆ ที่คิดเป็น 99% ของการใช้งานที่ถูกกฎหมายสำหรับ UDP และ nitpicks สองสามตัว: (ก) การจัดส่งเป็นกลุ่มไม่สามารถทำงานผ่านอินเทอร์เน็ตได้ (และไม่น่าจะเป็นไปได้) ดังนั้นจึงเป็นดินแดนอินทราเน็ตเท่านั้น (b) ต่อ Google เพียง 8-9% ของประชากรอินเทอร์เน็ตมีปัญหากับ UDP (c) "เครือข่ายที่ไม่เป็นมิตร" ไม่สามารถใช้กับสตรีมอัตราคงที่
No-Bugs Hare

93

ในบางแอปพลิเคชั่น TCP นั้นเร็วกว่า (throughput ที่ดีกว่า) กว่า UDP

นี่เป็นกรณีเมื่อทำการเขียนขนาดเล็กจำนวนมากสัมพันธ์กับขนาดของ MTU ตัวอย่างเช่นผมอ่านการทดลองซึ่งเป็นกระแสของแพ็คเก็ต 300 ไบต์ถูกส่ง over Ethernet (1500 ไบต์ MTU) และTCP เป็น 50% เร็วกว่า UDP

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

ในทางกลับกัน UDP จะวางแพ็กเก็ตบนสายทันทีทำให้แออัดเครือข่ายที่มีแพ็คเก็ตขนาดเล็กจำนวนมาก

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


3
ฉันได้ทำการเปรียบเทียบกับเอฟเฟ็กต์นี้จริงๆแล้ว ฉันส่งแพ็คเก็ตที่มีขนาดใหญ่เท่าที่ UDP จะให้การสนับสนุนโดยไม่ต้องส่งข้อยกเว้น (ใน Java) และ TCP เร็วขึ้นมาก ฉันเดาว่าระบบปฏิบัติการไดร์เวอร์และการปรับแต่งฮาร์ดแวร์เป็นส่วนหนึ่งของสิ่งนี้เช่นกัน
ชาร์ลี

14
@ Myforwik: ก่อนอื่นนี่ไม่ใช่การใช้งานที่กำหนดไว้เป็นส่วนหนึ่งของโปรโตคอล TCP มันเรียกว่าอัลกอริทึม Nagle ช่วยป้องกันสิ่งที่รู้จักกันทั่วไปในชื่อ Silly Window Syndrome ค้นหาคำทั้งสอง ประการที่สองไม่มีแนวคิดเกี่ยวกับแพ็กเก็ตจากมุมมอง TCP สุดท้ายหนังสือ "การเขียนโปรแกรม TCP / IP ที่มีประสิทธิภาพ" อุทิศทั้งบทในหัวข้อนี้และอีกหลายบทในหัวข้อที่เกี่ยวข้องที่รู้ว่าจะใช้ TCP กับ UDP เมื่อใด ฉันนำสถานการณ์นี้ขึ้นมา (ซึ่งเป็นเรื่องธรรมดาจริงๆ) เพราะ OP ถามคำถามทั่วไปและนี่เป็นหนึ่งในคำตอบที่เป็นไปได้มากมาย
Robert S. Barnes

46
@Myforwik เมื่อแนะนำผู้อื่นในศีลธรรมพยายามตระหนักว่าเราทุกคนมีช่องว่างในความรู้ของเรา - คุณรวมอยู่ด้วย ดังนั้นหลังจากทั้งหมดฟอรัมสำหรับการแบ่งปันความรู้ ค่อนข้างคนยิงปืนคนแรกใช้ UDP และมันก็เป็นเรื่องยากสำหรับพวกเขาที่จะส่งแพ็กเก็ตที่มีขนาดใกล้เคียงกับ MTU หากคุณต้องการที่จะไปและแนะนำให้ John Carmack สิ่งที่เขาเป็นปัญญาอ่อนสำหรับวิธีการที่จะมาถึงนี้ฉันขอแนะนำให้คุณให้ความรู้กับตัวเองอย่างละเอียดในเรื่องนี้ก่อน 15 ปีและรหัสเครือข่ายประสิทธิภาพสูงของอุตสาหกรรมไม่ได้ล้มตัวลงนอนและตายเพราะคุณคิดว่า "ปัญญาอ่อน"
วิศวกร

2
" ฉันอ่านการทดสอบว่ามีการส่งกระแสข้อมูลของแพ็คเก็ต 300 ไบต์ผ่านทางอีเทอร์เน็ต (1500 ไบต์ MTU) และ TCP เร็วกว่า UDP 50% " - คุณสามารถเชื่อมโยงการทดสอบนี้ได้หรือไม่
เลวีอาธาน

3
@ เลวีอาธานมันอยู่ในหนังสือ TCP / IP Programming ที่มีประสิทธิภาพ
Robert S. Barnes

31

ด้วยความอดทนการสูญเสีย

คุณหมายถึง "with tolerance loss" หรือไม่

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

สำหรับสิ่งต่าง ๆ เช่นการสตรีมวิดีโอและการเล่นเกมแบบผู้เล่นหลายคนซึ่งเป็นการดีกว่าที่จะพลาดแพ็คเก็ตมากกว่าการหน่วงเวลาแพ็กเก็ตอื่น ๆ ที่อยู่ด้านหลังนี่เป็นตัวเลือกที่ชัดเจน

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

โชคดีที่มีคนฉลาดมากบางคนได้ทำสิ่งนี้และพวกเขาเรียกมันว่า TCP

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


1
5 แพ็คเก็ตจาก 100? มันค่อนข้างมาก ฉันเดาว่ามันเป็นเพียงตัวอย่าง คำถาม: ในสถานการณ์จริงจำนวนแพ็คเก็ตที่สามารถสูญหายได้? เพราะถ้ามันเป็นตัวอย่างที่ 2 จาก 10,000 (บวกลบ 1) ดังนั้นฉันจะไม่กังวล
ประหลาด

1
@ รู้สึกประหลาดใช่มันเป็นเพียงตัวอย่าง จำนวนแพ็คเก็ตสูญหายจริงขึ้นอยู่กับการเชื่อมต่อของคุณเครือข่ายอัปสตรีม ฯลฯ ฉันเคยเล่นเกมออนไลน์มากมายและฉันจะพบว่าถ้าเป็นเพียงฉันที่ใช้การเชื่อมต่ออินเทอร์เน็ตฉันจะไม่สูญเสียแพ็กเก็ต แต่ ทันทีที่ฉันเปิดตัวการดาวน์โหลดพื้นหลังฉันจะเริ่มได้รับบางอย่าง (อาจ 10% -20%) นี่เป็นประมาณ 5 ปีที่แล้วและการเชื่อมต่ออินเทอร์เน็ตที่เร็วขึ้นอาจช่วยได้
Orion Edwards

2
เราเตอร์อินเทอร์เน็ตจะปล่อย udp ก่อน tcp
user1496062

19

โปรโตคอลใดทำงานได้ดีกว่า (ในแง่ของปริมาณงาน) - UDP หรือ TCP - ขึ้นอยู่กับลักษณะเครือข่ายและปริมาณการใช้เครือข่าย ตัวอย่างเช่น Robert S. Barnes ชี้ให้เห็นสถานการณ์ที่ TCP ทำงานได้ดีขึ้น (การเขียนขนาดเล็ก) ตอนนี้ให้พิจารณาสถานการณ์ที่เครือข่ายแออัดและมีปริมาณการใช้ TCP และ UDP ผู้ส่งในเครือข่ายที่ใช้ TCP จะรับรู้ถึง 'ความแออัด' และลดอัตราการส่งของพวกเขา อย่างไรก็ตาม UDP ไม่ได้มีการหลีกเลี่ยงความแออัดหรือกลไกการควบคุมความแออัดและผู้ส่งที่ใช้ UDP จะยังคงปั๊มข้อมูลในอัตราเดียวกัน ผู้ส่ง TCP จะลดอัตราการส่งเป็นขั้นต่ำเปล่าและถ้าผู้ส่ง UDP มีข้อมูลเพียงพอที่จะส่งผ่านเครือข่ายพวกเขาจะแบนด์วิดธ์ส่วนใหญ่ที่มีให้ ดังนั้นในกรณีดังกล่าว ผู้ส่ง UDP จะมีปริมาณงานมากขึ้นเนื่องจากได้รับแบนด์วิดธ์เครือข่ายที่ใหญ่ขึ้น อันที่จริงนี่เป็นหัวข้อการวิจัยที่ใช้งานอยู่ - วิธีการปรับปรุงปริมาณงาน TCP ในที่ที่มีการรับส่งข้อมูลของ UDP วิธีหนึ่งที่ฉันรู้ว่าการใช้แอปพลิเคชัน TCP ใดที่สามารถปรับปรุงปริมาณงานได้คือการเปิดการเชื่อมต่อ TCP หลายครั้ง ด้วยวิธีนี้แม้ว่าปริมาณงานของการเชื่อมต่อ TCP แต่ละครั้งอาจถูก จำกัด จำนวนผลรวมของปริมาณงานของการเชื่อมต่อ TCP ทั้งหมดอาจมากกว่าปริมาณงานสำหรับแอปพลิเคชันที่ใช้ UDP


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

ฉันชอบคำอธิบายของคุณ แต่อย่าไปจุดหนึ่ง หากการเชื่อมต่อ UDP สามารถรับทราฟฟิคได้ทั้งหมด (หากแบนด์วิดธ์ต่ำหรือมีข้อมูลสูง) ในกรณีนั้นแอปพลิเคชันของคุณหากใช้ TCP จะถูกจับเป็นตัวประกันโดยทั่วไปสำหรับการใช้ UDP หากแอปพลิเคชันทั้งหมดใช้ TCP แล้วจะ "เล่นได้ดี" ซึ่งกันและกัน ถ้าอย่างนั้นทำไมถึงอนุญาตให้ UDP บน rauter ในตอนแรก?
Igor Čordaš

@PSIXO: TCP และ UDP ตอบสนองความต้องการแอปพลิเคชันที่แตกต่างกันดังนั้นทั้งสองแอปพลิเคชันจะถูกใช้ ความหมายของคำแนะนำของคุณคือเราควรมีโครงสร้างพื้นฐานเครือข่ายที่แตกต่างกันสำหรับทราฟฟิก TCP และ UDP ซึ่งเป็นข้อเสนอที่มีราคาแพงและแน่นอนว่าไม่ใช่สิ่งที่เราสามารถทำได้ในตอนนี้โดยเฉพาะอย่างยิ่งกับการลงทุนทั้งหมด นั่นเป็นเหตุผลที่นักวิจัยกำลังยุ่งกับการหาวิธีทางเลือกอื่น ๆ เพื่อปรับสมดุลความขัดแย้งใน 'ซอฟต์แวร์'
gjain

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

18

เมื่อพูดถึง "สิ่งที่เร็วกว่า" - มีอย่างน้อยสองด้านที่ต่างกัน: ปริมาณงานและเวลาแฝง

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

อย่างไรก็ตามหากพูดถึงเวลาแฝง - สิ่งทั้งปวงแตกต่างอย่างสิ้นเชิง ในขณะที่ไม่มีการสูญหายของแพ็คเก็ต TCP และ UDP มีลักษณะคล้ายกันมาก (ความแตกต่างถ้ามีขอบ) - หลังจากแพ็กเก็ตหายรูปแบบทั้งหมดจะเปลี่ยนไปอย่างมาก

หลังจากการสูญหายของแพ็คเก็ต TCP จะรอการส่งใหม่อย่างน้อย 200ms (1sec ต่อวรรค 2.4 ของ RFC6298 แต่การใช้งานที่ทันสมัยในทางปฏิบัติมีแนวโน้มที่จะลดลงถึง 200ms) ยิ่งไปกว่านั้นด้วย TCP แม้กระทั่งแพ็คเก็ตที่ไปถึงโฮสต์ปลายทาง - จะไม่ถูกส่งไปยังแอปของคุณจนกว่าจะได้รับแพ็คเก็ตที่หายไป (เช่นการสื่อสารทั้งหมดล่าช้าประมาณ ~ 200ms) - BTW เอฟเฟ็กต์นี้ -Line Blocking นั้นมีอยู่ในสตรีมสั่งซื้อที่เชื่อถือได้ทั้งหมดไม่ว่าจะเป็น TCP หรือ UDP ที่เชื่อถือได้ เพื่อทำให้สิ่งเลวร้ายลง - ถ้าแพ็กเก็ตที่ส่งซ้ำนั้นหายไปเราจะพูดถึงความล่าช้าของ ~ 600ms (เนื่องจากการแบ็คแพ็คแบบเอ็กซ์โปเนนเชียลที่เรียกว่าการส่งสัญญาณซ้ำครั้งที่ 1 คือ 200ms และอันที่สองคือ 200 * 2 = 400ms) หากช่องของเรามีการสูญหายของแพ็คเก็ต 1% (ซึ่งไม่ได้แย่ตามมาตรฐานของวันนี้) และเรามีเกมที่มีการอัปเดต 20 ครั้งต่อวินาที - ความล่าช้า 600ms ดังกล่าวจะเกิดขึ้นโดยเฉลี่ยทุก 8 นาที และในขณะที่ 600ms นั้นมากเกินพอที่จะฆ่าคุณในเกมที่เล่นได้อย่างรวดเร็ว - มันค่อนข้างจะแย่สำหรับการเล่นเกม เอฟเฟกต์เหล่านี้เป็นสาเหตุที่ทำให้ gamedevs ชอบ UDP มากกว่า TCP

อย่างไรก็ตามเมื่อใช้ UDP เพื่อลดเวลาแฝง - สิ่งสำคัญคือการตระหนักว่าเพียงแค่ "ใช้ UDP" นั้นไม่เพียงพอที่จะได้รับการปรับปรุงความหน่วงแฝงได้อย่างมีนัยสำคัญทุกอย่างเกี่ยวกับวิธีที่คุณใช้ UDP โดยเฉพาะอย่างยิ่งในขณะที่ไลบรารี RUDP มักจะหลีกเลี่ยง "backoff แบบเอ็กซ์โปเนนเชียล" และใช้เวลาการส่งใหม่ที่สั้นลง - หากใช้เป็นสตรีม "เชื่อถือได้รับคำสั่ง" พวกเขายังคงต้องทนทุกข์ทรมานจากการบล็อก Head-of-Line การสูญเสียของแพ็กเก็ตแทนที่จะเป็น 600ms นั้นเราจะได้รับประมาณ 1.5 * 2 * RTT - หรือสำหรับ 80ms RTT ที่ดีทีเดียวมันมีความล่าช้า ~ 250ms ซึ่งเป็นการปรับปรุง แต่ก็ยังเป็นไปได้ที่จะทำดีกว่า) ในทางกลับกันหากใช้เทคนิคที่กล่าวถึงในhttp://gafferongames.com/networked-physics/snapshot-compression/และ / หรือhttp: // ithare มันเป็นไปได้ที่จะกำจัดการบล็อก Head-of-Line ทั้งหมด (ดังนั้นสำหรับการสูญเสียแพ็คเก็ตสองครั้งสำหรับเกมที่มีการอัพเดต 20 ครั้ง / วินาทีความล่าช้าจะเป็น 100ms โดยไม่คำนึงถึง RTT)

และเป็นหมายเหตุข้างเคียง - ถ้าคุณบังเอิญมีการเข้าถึง TCP เท่านั้น แต่ไม่มี UDP (เช่นในเบราว์เซอร์หรือหากไคลเอ็นต์ของคุณอยู่หลังไฟร์วอลล์ที่น่าเกลียดที่บล็อก UDP 6-9% ของการบล็อก UDP) - ดูเหมือนว่าจะมีวิธีในการ ใช้ UDP-over-TCP โดยไม่เกิดความล่าช้ามากเกินไปดูที่นี่: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (ให้แน่ใจว่าได้อ่านความคิดเห็นด้วย (!)


13

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


มีโอกาสเกิดข้อผิดพลาดเล็กน้อยและ จำกัด ขนาดแพ็คเก็ต

11

@ Andyฉันขอแตกต่างกัน UDP เป็นตัวเลือกในการใช้งานบางประเภทเนื่องจากความต้องการด้านประสิทธิภาพ ตัวอย่างหนึ่งที่คลาสสิกคือการประชุมทางวิดีโอ แอปพลิเคชันประเภทนี้ไม่ตอบสนองต่อการควบคุม TCP ได้ดี

ด้านอื่น ๆ ที่ควรพิจารณาคือถ้าคุณต้องการมัลติคาสต์ ถ้าเป็นเช่นนั้นใช้ UDP


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

1
ถูกต้อง - การส่งสัญญาณหลายเครือข่ายนั้นค่อนข้างยากที่เราเตอร์ส่วนใหญ่จะปิดกั้น
user1496062

8

หากคุณต้องการระเบิดข้อความอย่างรวดเร็วทั่วทั้งเครือข่ายระหว่างสอง IP ที่ยังไม่ได้พูดคุยดังนั้น UDP จะมาถึงอย่างน้อย 3 ครั้งเร็วกว่าปกติ 5 เท่า


1
การอ้างอิงใด ๆ
เจอราร์ด

8

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


7

UDP นั้นเร็วขึ้นเล็กน้อยในประสบการณ์ของฉัน แต่ไม่มาก ตัวเลือกไม่ควรใช้กับประสิทธิภาพ แต่เป็นเนื้อหาของข้อความและเทคนิคการบีบอัด

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


5

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


5

มีการทำงานบางอย่างเพื่อให้โปรแกรมเมอร์ได้รับประโยชน์จากทั้งสองโลก

SCTP

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

  • ในการจัดส่งข้อความ
  • การส่งข้อความที่หายไปใหม่โดยอัตโนมัติพร้อมพารามิเตอร์ที่ผู้ใช้กำหนด

หากสิ่งนี้จำเป็นสำหรับแอปพลิเคชันของคุณ

ปัญหาหนึ่งคือการสร้างการเชื่อมต่อนั้นซับซ้อน (และทำให้กระบวนการช้าลง)

สิ่งที่คล้ายกันอื่น ๆ

อีกสิ่งหนึ่งที่เป็นกรรมสิทธิ์ของการทดลองคล้ายกัน

นอกจากนี้ยังพยายามปรับปรุงการจับมือ TCP แบบสามทางและเปลี่ยนการควบคุมความแออัดเพื่อจัดการกับสายที่เร็วขึ้น


3

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


1

การตั้งค่าเครือข่ายมีความสำคัญสำหรับการวัดใด ๆ มันทำให้เกิดความแตกต่างอย่างมากหากคุณกำลังสื่อสารผ่านซ็อกเก็ตบนเครื่องของคุณหรือกับส่วนอื่น ๆ ของโลก

สามสิ่งที่ฉันต้องการเพิ่มในการสนทนา:

  1. คุณสามารถค้นหาที่นี่เป็นบทความที่ดีมากเกี่ยวกับ TCP กับ UDP ในบริบทของการพัฒนาเกม
  2. นอกจากนี้iperf ( jperfปรับปรุง iperf ด้วย GUI) เป็นเครื่องมือที่ดีมากสำหรับการตอบคำถามของคุณด้วยการวัด
  3. ฉันใช้มาตรฐานใน Python (ดูคำถาม SO นี้ ) การทำซ้ำโดยเฉลี่ย 10 ^ 6 ความแตกต่างในการส่ง 8 ไบต์คือประมาณ 1-2 ไมโครวินาทีสำหรับ UDP

1
ในการสร้างเกณฑ์มาตรฐานที่เกี่ยวข้องกับอินเทอร์เน็ตในโลกแห่งความเป็นจริงคุณจะต้องเรียกใช้ซ้ำด้วยตัวจำลองการสูญเสียแพ็คเก็ตเช่น netem หากทำถูกต้อง (และด้วย RTT จำลองที่มีขนาด 100 มิลลิวินาทีและการสูญเสียแพ็กเก็ตจำลอง 1%) ผลลัพธ์จะแตกต่างกันอย่างมาก ในระยะสั้น - ในขณะที่เวลาแฝง TCP และ UDP เหมือนกันสำหรับศูนย์การสูญเสียแพ็คเก็ต - พวกเขาเริ่มแตกต่างกันมากสำหรับแต่ละแพ็คเก็ตที่หายไป
ไม่มีข้อบกพร่องกระต่าย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.