ความแตกต่างระหว่างสตรีมและดาตาแกรมในการเขียนโปรแกรมเครือข่ายคืออะไร?


คำตอบ:


304

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

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

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

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

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

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

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


3
ยอดเยี่ยมเพียงแค่ใส่รายละเอียดของ SYNACK
LazerSharks

2
ตัวอย่างนี้หรือที่คล้ายกันมากมาจาก The Linux Programming Interface ฉบับปี 2010 มีตัวอย่างเหล่านี้ในหน้า 1155 และ 1159

30

ซ็อกเก็ตสตรีม:

  • ช่องเฉพาะและ end-to-end ระหว่างเซิร์ฟเวอร์และไคลเอนต์
  • ใช้โปรโตคอล TCP สำหรับการส่งข้อมูล
  • เชื่อถือได้และไม่สูญเสีย
  • ข้อมูลที่ส่ง / รับในลำดับเดียวกัน
  • ใช้เวลานานในการกู้คืนข้อมูลที่สูญหาย / ผิดพลาด

ซ็อกเก็ต Datagram:

  • ไม่ใช่แชนเนลเฉพาะและ end-to-end ระหว่างเซิร์ฟเวอร์และไคลเอนต์
  • ใช้ UDP สำหรับการส่งข้อมูล
  • ไม่น่าเชื่อถือ 100% และอาจสูญเสียข้อมูล
  • ลำดับข้อมูลที่ส่ง / รับอาจไม่เหมือนกัน
  • อย่าสนใจหรือกู้คืนข้อมูลที่สูญหาย / ผิดพลาดอย่างรวดเร็ว

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

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

ที่สมเหตุสมผล บางทีแค่ลบความแตกต่างนั้นออกแล้ววางไว้ด้านล่าง (เนื่องจากถ้าฉันเข้าใจถูกต้องเมื่ออ้างถึงเฉพาะลำดับที่ส่งแพ็กเก็ตในทั้งสองกรณีลำดับที่ส่ง / รับข้อมูลอาจไม่เป็น เหมือน).
Matthew

@ Rick อย่างแม่นยำยิ่งขึ้นซ็อกเก็ตเรียกว่า end-to-end point เนื่องจากโปรโตคอลการขนส่งมีหน้าที่ในการส่งข้อความไปยังปลายทางเครือข่ายหนึ่งหรือหลายจุด
Alejandro Blasco

0

ถ้าเป็นการเขียนโปรแกรมเครือข่ายฉันคิดว่าการเริ่มต้นจากซ็อกเก็ตจะเป็นการเริ่มต้นที่ดี
ซ็อกเก็ต = ip + พอร์ต
มีซ็อกเก็ต
สตรีมสามประเภท(TCP, คำสั่งซื้อและการส่งมอบรับประกัน, ไม่มีการทำซ้ำ, ไม่มีความยาวหรือขอบเขตถ่านสำหรับข้อมูล, การเชื่อมต่อที่มุ่งเน้น, เชื่อถือได้, พร้อมกัน)
ดาต้าแกรม (UDP, อิงตามแพ็กเก็ต, ไม่มีการเชื่อมต่อ, ดาต้าแกรม ขีด จำกัด ขนาดข้อมูลอาจสูญหายหรือทำซ้ำคำสั่งไม่รับประกันไม่น่าเชื่อถือ)
ดิบ (เข้าถึงโดยตรงไปยังโปรโตคอลชั้นล่าง IP, ICMP)
ฉันไม่เห็นกฎที่เข้มงวดใด ๆ สำหรับประเภทโปรโตคอลการขนส่งว่าซ็อกเก็ตต้องใช้โปรโตคอลการขนส่งใด และความน่าเชื่อถือไม่ควรผิดพลาดเนื่องจาก UDP สามารถพิสูจน์ได้ในกรณีที่ปลายทั้งสองข้างทำงานอยู่
ความน่าเชื่อถือหมายถึงความน่าเชื่อถือของการจัดส่งมากกว่าเนื่องจากมีการตรวจสอบหมายเลขลำดับโดยใช้ TCP เป็นโปรโตคอลการขนส่งซึ่งไม่มีอยู่ใน UDP จะดีกว่าโดยใช้ตัววิเคราะห์โปรโตคอลเครือข่ายเช่น Wirehark tcpdump เป็นต้นเพื่อดูว่าซอฟต์แวร์ของคุณกำลังทำอะไรอยู่ ชนิดของการตรวจสอบหรือการรวมทฤษฎีบนกระดาษกับงานของคุณในการดำเนินการ

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