สำหรับการแลกเปลี่ยนข้อความโปรโตคอลทั่วไปซึ่งสามารถทนต่อการสูญเสียต UDP มีประสิทธิภาพมากกว่า TCP มากน้อยเพียงใด
สำหรับการแลกเปลี่ยนข้อความโปรโตคอลทั่วไปซึ่งสามารถทนต่อการสูญเสียต UDP มีประสิทธิภาพมากกว่า TCP มากน้อยเพียงใด
คำตอบ:
UDP นั้นเร็วกว่า TCP และเหตุผลง่ายๆคือเนื่องจากแพ็กเก็ตตอบรับที่ไม่มีอยู่ (ACK) ที่อนุญาตให้มีการส่งแพ็กเก็ตต่อเนื่องแทน TCP ที่รับชุดของแพ็คเก็ตคำนวณโดยใช้ขนาดหน้าต่าง TCP และเวลาเดินทาง (RTT)
สำหรับข้อมูลเพิ่มเติมฉันแนะนำคำอธิบาย Skullbox ที่เรียบง่าย แต่เข้าใจได้ง่าย(TCP vs. UDP)
ผู้คนบอกว่าสิ่งสำคัญที่ TCP มอบให้คุณคือความน่าเชื่อถือ แต่นั่นไม่จริงเลย สิ่งที่สำคัญที่สุดที่ TCP มอบให้คุณคือการควบคุมความแออัด: คุณสามารถใช้การเชื่อมต่อ 100 TCP ผ่านการเชื่อมโยง DSL ทั้งหมดที่ความเร็วสูงสุดและการเชื่อมต่อทั้งหมด 100 รายการจะได้ผลเนื่องจากพวกเขาทั้งหมด "รับรู้" แบนด์วิดท์ ลองใช้ด้วยแอพพลิเคชั่น UDP ที่แตกต่างกัน 100 แพ็กเกจการผลักดันทั้งหมดให้เร็วที่สุดเท่าที่จะทำได้
ในระดับที่ใหญ่กว่าพฤติกรรม TCP นี้คือสิ่งที่ทำให้อินเทอร์เน็ตไม่สามารถล็อคเข้าสู่ "การล่มสลายของความแออัด"
สิ่งที่มีแนวโน้มที่จะผลักดันแอปพลิเคชันไปยัง UDP:
ความหมายของการจัดส่งเป็นกลุ่ม: เป็นไปได้ที่จะทำการจัดส่งที่เชื่อถือได้ไปยังกลุ่มคนที่มีประสิทธิภาพมากกว่าการรับรู้จุดต่อจุดของ TCP
การส่งมอบที่ไม่เป็นไปตามคำสั่ง: ในแอปพลิเคชันจำนวนมากตราบใดที่คุณได้รับข้อมูลทั้งหมดคุณไม่สนใจสิ่งที่จะได้รับคำสั่ง คุณสามารถลดเวลาแฝงในระดับแอปได้ด้วยการยอมรับการบล็อกนอกกรอบ
ความไม่เป็นมิตร: ในปาร์ตี้ LAN คุณอาจไม่สนใจว่าเว็บเบราว์เซอร์ของคุณทำงานได้ดีตราบใดที่คุณกำลังอัปเดตเครือข่ายให้เร็วที่สุดเท่าที่จะทำได้
แต่ถึงแม้ว่าคุณจะสนใจเรื่องประสิทธิภาพคุณอาจไม่ต้องการใช้ UDP:
คุณกำลังขอความเชื่อถือได้ในตอนนี้และหลายสิ่งหลายอย่างที่คุณอาจนำไปใช้ในการปรับใช้ความน่าเชื่อถืออาจทำให้การทำงานช้าลงกว่าที่ TCP ทำไว้แล้ว
ตอนนี้คุณเป็นเครือข่ายที่ไม่เป็นมิตรซึ่งอาจทำให้เกิดปัญหาในสภาพแวดล้อมที่ใช้ร่วมกัน
สิ่งสำคัญที่สุดคือไฟร์วอลล์จะบล็อกคุณ
คุณสามารถเอาชนะประสิทธิภาพของ TCP และปัญหาความหน่วงโดยการ "เชื่อมต่อ" หลายการเชื่อมต่อ TCP เข้าด้วยกัน iSCSI ทำสิ่งนี้เพื่อควบคุมความแออัดของเครือข่ายท้องถิ่น แต่คุณสามารถสร้างแชนเนลข้อความ "เร่งด่วน" ที่มีความหน่วงแฝงต่ำ (พฤติกรรม "ด่วน" ของ TCP นั้นใช้งานไม่ได้)
listen
-> accept
-> สถานะไคลเอนต์เป็นอิสระจากลูกค้ารายอื่น) การจัดการการเชื่อมต่อหลายรายการจากไคลเอนต์เดียวโดยเฉพาะจะกลายเป็น gnarly ด้วย UDP และจุดในความโปรดปรานของ UDP เป็นกอง UDP เป็นจริงๆง่ายต่อการใช้ซึ่งเป็นบวกอย่างมากต่อระบบฝังตัว (ไมโครคอนโทรลเลอร์, FPGAs ฯลฯ ในการดำเนินงานเครือข่าย TCP โดยเฉพาะอย่างยิ่งสำหรับ FPGA โดยทั่วไปสิ่งที่คุณเพียงต้องการที่จะซื้อจากคนอื่น และไม่คิดถึง)
ในบางแอปพลิเคชั่น TCP นั้นเร็วกว่า (throughput ที่ดีกว่า) กว่า UDP
นี่เป็นกรณีเมื่อทำการเขียนขนาดเล็กจำนวนมากสัมพันธ์กับขนาดของ MTU ตัวอย่างเช่นผมอ่านการทดลองซึ่งเป็นกระแสของแพ็คเก็ต 300 ไบต์ถูกส่ง over Ethernet (1500 ไบต์ MTU) และTCP เป็น 50% เร็วกว่า UDP
เหตุผลก็เพราะ TCP จะพยายามและบัฟเฟอร์ข้อมูลและเติมส่วนเครือข่ายเต็มรูปแบบจึงทำให้การใช้แบนด์วิดท์ที่มีประสิทธิภาพมากขึ้น
ในทางกลับกัน UDP จะวางแพ็กเก็ตบนสายทันทีทำให้แออัดเครือข่ายที่มีแพ็คเก็ตขนาดเล็กจำนวนมาก
คุณอาจไม่ควรใช้ UDP เว้นแต่คุณจะมีเหตุผลที่เฉพาะเจาะจงในการทำเช่นนั้น โดยเฉพาะอย่างยิ่งเนื่องจากคุณสามารถให้ TCP แบบ latency เหมือนกับ UDP ได้โดยการปิดใช้งานอัลกอริทึม Nagle (ตัวอย่างเช่นหากคุณกำลังส่งข้อมูลเซ็นเซอร์แบบเรียลไทม์และคุณไม่ต้องกังวลเกี่ยวกับความแออัดของเครือข่าย
ด้วยความอดทนการสูญเสีย
คุณหมายถึง "with tolerance loss" หรือไม่
โดยพื้นฐานแล้ว UDP ไม่ใช่ "การป้องกันการสูญเสีย" คุณสามารถส่ง 100 แพ็กเก็ตไปยังใครบางคนและพวกเขาอาจได้รับ 95 ของแพ็กเก็ตเหล่านั้นและบางคนอาจอยู่ในลำดับที่ไม่ถูกต้อง
สำหรับสิ่งต่าง ๆ เช่นการสตรีมวิดีโอและการเล่นเกมแบบผู้เล่นหลายคนซึ่งเป็นการดีกว่าที่จะพลาดแพ็คเก็ตมากกว่าการหน่วงเวลาแพ็กเก็ตอื่น ๆ ที่อยู่ด้านหลังนี่เป็นตัวเลือกที่ชัดเจน
สำหรับสิ่งอื่น ๆ ส่วนใหญ่แพ็คเก็ตที่ขาดหายไปหรือ 'จัดใหม่' เป็นสิ่งสำคัญ คุณต้องเขียนโค้ดพิเศษเพื่อให้ทำงานบน UDP อีกครั้งเพื่อลองใหม่หากสิ่งที่พลาดไปและบังคับใช้คำสั่งที่ถูกต้อง สิ่งนี้จะเพิ่มค่าใช้จ่ายเล็กน้อยในบางสถานที่
โชคดีที่มีคนฉลาดมากบางคนได้ทำสิ่งนี้และพวกเขาเรียกมันว่า TCP
ลองใช้วิธีนี้ดู: หากแพ็คเก็ตหายไปคุณควรที่จะรับแพ็กเก็ตถัดไปโดยเร็วที่สุดและทำต่อไป (ใช้ UDP) หรือคุณต้องการข้อมูลที่หายไป (ใช้ TCP) ค่าใช้จ่ายจะไม่สำคัญถ้าคุณอยู่ในสถานการณ์ที่เป็นกรณีขอบจริงๆ
โปรโตคอลใดทำงานได้ดีกว่า (ในแง่ของปริมาณงาน) - UDP หรือ TCP - ขึ้นอยู่กับลักษณะเครือข่ายและปริมาณการใช้เครือข่าย ตัวอย่างเช่น Robert S. Barnes ชี้ให้เห็นสถานการณ์ที่ TCP ทำงานได้ดีขึ้น (การเขียนขนาดเล็ก) ตอนนี้ให้พิจารณาสถานการณ์ที่เครือข่ายแออัดและมีปริมาณการใช้ TCP และ UDP ผู้ส่งในเครือข่ายที่ใช้ TCP จะรับรู้ถึง 'ความแออัด' และลดอัตราการส่งของพวกเขา อย่างไรก็ตาม UDP ไม่ได้มีการหลีกเลี่ยงความแออัดหรือกลไกการควบคุมความแออัดและผู้ส่งที่ใช้ UDP จะยังคงปั๊มข้อมูลในอัตราเดียวกัน ผู้ส่ง TCP จะลดอัตราการส่งเป็นขั้นต่ำเปล่าและถ้าผู้ส่ง UDP มีข้อมูลเพียงพอที่จะส่งผ่านเครือข่ายพวกเขาจะแบนด์วิดธ์ส่วนใหญ่ที่มีให้ ดังนั้นในกรณีดังกล่าว ผู้ส่ง UDP จะมีปริมาณงานมากขึ้นเนื่องจากได้รับแบนด์วิดธ์เครือข่ายที่ใหญ่ขึ้น อันที่จริงนี่เป็นหัวข้อการวิจัยที่ใช้งานอยู่ - วิธีการปรับปรุงปริมาณงาน TCP ในที่ที่มีการรับส่งข้อมูลของ UDP วิธีหนึ่งที่ฉันรู้ว่าการใช้แอปพลิเคชัน TCP ใดที่สามารถปรับปรุงปริมาณงานได้คือการเปิดการเชื่อมต่อ TCP หลายครั้ง ด้วยวิธีนี้แม้ว่าปริมาณงานของการเชื่อมต่อ TCP แต่ละครั้งอาจถูก จำกัด จำนวนผลรวมของปริมาณงานของการเชื่อมต่อ TCP ทั้งหมดอาจมากกว่าปริมาณงานสำหรับแอปพลิเคชันที่ใช้ UDP
เมื่อพูดถึง "สิ่งที่เร็วกว่า" - มีอย่างน้อยสองด้านที่ต่างกัน: ปริมาณงานและเวลาแฝง
หากพูดถึงปริมาณงาน - การควบคุมการไหลของ 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/ (ให้แน่ใจว่าได้อ่านความคิดเห็นด้วย (!)
การเชื่อมต่อ TCP แต่ละครั้งต้องการการจับมือเริ่มต้นก่อนที่จะส่งข้อมูล นอกจากนี้ส่วนหัว TCP มีค่าใช้จ่ายจำนวนมากที่มีไว้สำหรับสัญญาณที่แตกต่างกันและการตรวจจับการส่งข้อความ สำหรับการแลกเปลี่ยนข้อความ UDP อาจพอเพียงถ้ายอมรับความล้มเหลวเล็กน้อย หากใบเสร็จรับเงินต้องได้รับการตรวจสอบ TCP เป็นตัวเลือกที่ดีที่สุดของคุณ
@ Andyฉันขอแตกต่างกัน UDP เป็นตัวเลือกในการใช้งานบางประเภทเนื่องจากความต้องการด้านประสิทธิภาพ ตัวอย่างหนึ่งที่คลาสสิกคือการประชุมทางวิดีโอ แอปพลิเคชันประเภทนี้ไม่ตอบสนองต่อการควบคุม TCP ได้ดี
ด้านอื่น ๆ ที่ควรพิจารณาคือถ้าคุณต้องการมัลติคาสต์ ถ้าเป็นเช่นนั้นใช้ UDP
หากคุณต้องการระเบิดข้อความอย่างรวดเร็วทั่วทั้งเครือข่ายระหว่างสอง IP ที่ยังไม่ได้พูดคุยดังนั้น UDP จะมาถึงอย่างน้อย 3 ครั้งเร็วกว่าปกติ 5 เท่า
ฉันจะทำให้ทุกอย่างชัดเจน TCP / UDPเป็นรถยนต์สองคันที่ขับเคลื่อนบนถนน สมมติว่าสัญญาณจราจรและอุปสรรคเป็นข้อผิดพลาดTCPใส่ใจกับสัญญาณจราจรเคารพทุกอย่างรอบตัว การขับขี่ช้าเพราะบางสิ่งอาจเกิดขึ้นกับรถ ในขณะที่UDPเพิ่งจะขับรถออกไปความเร็วเต็มที่ไม่เคารพป้ายถนน ไม่มีอะไรขับบ้า UDPไม่มีการกู้คืนข้อผิดพลาดหากมีสิ่งกีดขวางก็จะชนกับมันแล้วดำเนินการต่อ ในขณะที่TCPทำให้แน่ใจว่าทุกแพ็กเก็ตถูกส่งและรับอย่างสมบูรณ์แบบไม่มีข้อผิดพลาดดังนั้นรถก็ผ่านสิ่งกีดขวางโดยไม่ชนกัน ฉันหวังว่านี่เป็นตัวอย่างที่ดีสำหรับคุณที่จะเข้าใจว่าทำไมUDPถึงเป็นที่นิยมในการเล่นเกม การเล่นเกมต้องการความเร็ว TCPถูกดาวน์โหลดล่วงหน้าในการดาวน์โหลดหรือไฟล์ที่ดาวน์โหลดอาจเสียหาย
UDP นั้นเร็วขึ้นเล็กน้อยในประสบการณ์ของฉัน แต่ไม่มาก ตัวเลือกไม่ควรใช้กับประสิทธิภาพ แต่เป็นเนื้อหาของข้อความและเทคนิคการบีบอัด
หากเป็นโปรโตคอลที่มีการแลกเปลี่ยนข้อความฉันขอแนะนำว่าประสิทธิภาพที่คุณใช้กับ TCP นั้นมีค่าเพียงเล็กน้อย คุณได้รับการเชื่อมต่อระหว่างจุดปลายสองจุดที่จะให้ทุกสิ่งที่คุณต้องการ อย่าพยายามผลิตโพรโทคอลแบบสองทางที่เชื่อถือได้ของคุณเองที่ด้านบนของ UDP เว้นแต่คุณจะมั่นใจในสิ่งที่คุณทำจริง ๆ
โปรดทราบว่า TCP มักจะเก็บข้อความไว้หลายสาย ถ้าคุณต้องการใช้สิ่งนี้ใน UDP คุณจะมีงานจำนวนมากถ้าคุณต้องการที่จะทำมันอย่างน่าเชื่อถือ โซลูชันของคุณอาจมีความน่าเชื่อถือน้อยลงเร็วขึ้นหรือทำงานได้อย่างไม่น่าเชื่อ มีแอปพลิเคชันที่ถูกต้องของ UDP แต่ถ้าคุณถามคำถามนี้คุณอาจไม่ได้
มีการทำงานบางอย่างเพื่อให้โปรแกรมเมอร์ได้รับประโยชน์จากทั้งสองโลก
SCTP
มันเป็น protolol เลเยอร์การขนส่งที่เป็นอิสระ แต่มันสามารถใช้เป็นไลบรารีที่ให้เลเยอร์เพิ่มเติมผ่าน UDP หน่วยการสื่อสารขั้นพื้นฐานคือข้อความ (แมปกับแพคเก็ต UDP หนึ่งแพคขึ้นไป) มีการควบคุมความแออัดอยู่ในตัวโปรโตคอลมีลูกบิดและ twiddles เพื่อเปิด
หากสิ่งนี้จำเป็นสำหรับแอปพลิเคชันของคุณ
ปัญหาหนึ่งคือการสร้างการเชื่อมต่อนั้นซับซ้อน (และทำให้กระบวนการช้าลง)
สิ่งที่คล้ายกันอื่น ๆ
อีกสิ่งหนึ่งที่เป็นกรรมสิทธิ์ของการทดลองคล้ายกัน
นอกจากนี้ยังพยายามปรับปรุงการจับมือ TCP แบบสามทางและเปลี่ยนการควบคุมความแออัดเพื่อจัดการกับสายที่เร็วขึ้น
ไม่มีความหมายที่จะพูดคุยเกี่ยวกับ TCP หรือ UDP โดยไม่คำนึงถึงสภาพเครือข่าย หากเครือข่ายระหว่างสองจุดมีคุณภาพสูงมาก UDP จะเร็วกว่า TCP อย่างแน่นอน แต่ในบางกรณีเช่นเครือข่าย GPRS นั้น TCP อาจเร็วกว่าและเชื่อถือได้มากกว่า UDP
การตั้งค่าเครือข่ายมีความสำคัญสำหรับการวัดใด ๆ มันทำให้เกิดความแตกต่างอย่างมากหากคุณกำลังสื่อสารผ่านซ็อกเก็ตบนเครื่องของคุณหรือกับส่วนอื่น ๆ ของโลก
สามสิ่งที่ฉันต้องการเพิ่มในการสนทนา: