Multiplexing หมายถึงอะไรใน HTTP / 2


คำตอบ:


230

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

และตอนนี้สำหรับคำตอบที่ซับซ้อนมากขึ้น ...

เมื่อคุณโหลดหน้าเว็บมันจะดาวน์โหลดหน้า HTML มันจะเห็นว่ามันต้องการ CSS บางอย่าง, JavaScript บางอย่าง, การโหลดรูปภาพ ... ฯลฯ

ภายใต้ HTTP / 1.1 คุณสามารถดาวน์โหลดได้ครั้งละหนึ่งรายการบนการเชื่อมต่อ HTTP / 1.1 ของคุณ ดังนั้นเบราว์เซอร์ของคุณจะดาวน์โหลด HTML จากนั้นจะขอไฟล์ CSS เมื่อมีการส่งคืนระบบจะขอไฟล์ JavaScript เมื่อถูกส่งคืนระบบจะขอไฟล์ภาพแรก ... ฯลฯ โดยทั่วไปแล้ว HTTP / 1.1 นั้นเป็นแบบซิงโครนัสเมื่อคุณส่งคำขอคุณจะติดขัดจนกว่าคุณจะได้รับการตอบกลับ ซึ่งหมายความว่าเวลาส่วนใหญ่เบราว์เซอร์ไม่ได้ดำเนินการมากนักเนื่องจากได้เริ่มการร้องขอกำลังรอการตอบกลับจากนั้นจึงเริ่มการทำงานของคำขออื่นจากนั้นกำลังรอการตอบกลับ ... ฯลฯ แน่นอนว่าไซต์ที่ซับซ้อนด้วย JavaScript จำนวนมากต้องการให้เบราว์เซอร์ทำการประมวลผลจำนวนมาก แต่ขึ้นอยู่กับการดาวน์โหลด JavaScript ดังนั้นอย่างน้อยในช่วงแรกความล่าช้าที่สืบทอดไปยัง HTTP / 1.1 จะทำให้เกิดปัญหา โดยทั่วไปแล้วเซิร์ฟเวอร์ไม่ใช่ '

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

ตัวอย่างเช่นสมมติว่ามีทรัพยากร 10 รายการที่หน้าเว็บของคุณต้องโหลดหลังจากโหลด HTML แล้ว (ซึ่งเป็นไซต์ขนาดเล็กมากตามมาตรฐานปัจจุบันเนื่องจากทรัพยากรมากกว่า 100 รายการเป็นเรื่องปกติ แต่เราจะทำให้มันง่ายและใช้สิ่งนี้ ตัวอย่าง). และสมมติว่าแต่ละคำขอใช้เวลา 100 มิลลิวินาทีในการเดินทางข้ามอินเทอร์เน็ตไปยังเว็บเซิร์ฟเวอร์และย้อนกลับและเวลาในการประมวลผลที่ปลายทั้งสองด้านนั้นน้อยมาก (สมมติว่า 0 สำหรับตัวอย่างนี้เพื่อความเรียบง่าย) เนื่องจากคุณต้องส่งทรัพยากรแต่ละรายการและรอการตอบกลับทีละรายการการดำเนินการนี้จะใช้เวลา 10 * 100ms = 1,000ms หรือ 1 วินาทีในการดาวน์โหลดทั้งไซต์

เพื่อหลีกเลี่ยงปัญหานี้โดยปกติเบราว์เซอร์จะเปิดการเชื่อมต่อหลายรายการไปยังเว็บเซิร์ฟเวอร์ (โดยทั่วไปคือ 6) ซึ่งหมายความว่าเบราว์เซอร์สามารถส่งคำขอหลายรายการพร้อมกันได้ซึ่งดีกว่ามาก แต่ต้องใช้ความซับซ้อนในการตั้งค่าและจัดการการเชื่อมต่อหลายรายการ (ซึ่งส่งผลกระทบต่อทั้งเบราว์เซอร์และเซิร์ฟเวอร์) มาดูตัวอย่างก่อนหน้านี้ต่อไปและบอกว่ามีการเชื่อมต่อ 4 รายการและเพื่อความง่ายสมมติว่าคำขอทั้งหมดเท่ากัน ในกรณีนี้คุณสามารถแยกคำขอออกจากการเชื่อมต่อทั้งสี่ได้ดังนั้นสองรายการจะมีทรัพยากร 3 รายการที่จะได้รับและสองรายการจะมีทรัพยากร 2 รายการเพื่อรับทรัพยากรทั้งหมดสิบรายการ (3 + 3 + 2 + 2 = 10) ในกรณีนั้นกรณีที่เลวร้ายที่สุดคือ 3 รอบหรือ 300ms = 0.3 วินาที - เป็นการปรับปรุงที่ดี แต่ตัวอย่างง่ายๆนี้ไม่รวมค่าใช้จ่ายในการตั้งค่าการเชื่อมต่อหลายรายการ

HTTP / 2 ช่วยให้คุณสามารถส่งคำขอหลายรายการในไฟล์พร้อมกันการเชื่อมต่อ - ดังนั้นคุณไม่จำเป็นต้องเปิดการเชื่อมต่อหลายรายการตามด้านบน ดังนั้นเบราว์เซอร์ของคุณสามารถพูดว่า "Gimme this CSS file. Gimme that JavaScript file. Gimme image1.jpg. Gimme image2.jpg ... Etc. " เพื่อใช้การเชื่อมต่อเดียวอย่างเต็มที่ สิ่งนี้มีประโยชน์ด้านประสิทธิภาพที่ชัดเจนในการไม่ชะลอการส่งคำขอเหล่านั้นเพื่อรอการเชื่อมต่อฟรี คำขอทั้งหมดเหล่านี้ส่งผ่านอินเทอร์เน็ตไปยังเซิร์ฟเวอร์ในแบบขนาน (เกือบ) เซิร์ฟเวอร์ตอบสนองต่อแต่ละคนจากนั้นพวกเขาก็เริ่มหาทางกลับ ในความเป็นจริงมันทรงพลังยิ่งกว่านั้นเนื่องจากเว็บเซิร์ฟเวอร์สามารถตอบสนองต่อพวกเขาในลำดับใดก็ได้ที่รู้สึกเหมือนและส่งไฟล์กลับในลำดับที่แตกต่างกันหรือแม้กระทั่งแยกไฟล์ที่ร้องขอออกเป็นชิ้น ๆหัวหน้าบรรทัดปัญหาการบล็อก ) จากนั้นเว็บเบราว์เซอร์จะได้รับมอบหมายให้นำชิ้นส่วนทั้งหมดกลับมารวมกัน ในกรณีที่ดีที่สุด (สมมติว่าไม่มีการ จำกัด แบนด์วิดท์ - ดูด้านล่าง) หากคำขอทั้ง 10 รายการถูกไล่ออกพร้อมกันและเซิร์ฟเวอร์ได้รับคำตอบทันทีนั่นหมายความว่าคุณมีเวลาเดินทางไปกลับหนึ่งครั้งหรือ 100 มิลลิวินาทีหรือ 0.1 วินาทีถึง ดาวน์โหลดทรัพยากรทั้งหมด 10 รายการ และสิ่งนี้ไม่มีข้อเสียใด ๆ ที่การเชื่อมต่อหลายรายการมีสำหรับ HTTP / 1.1! นอกจากนี้ยังสามารถปรับขนาดได้มากขึ้นเนื่องจากทรัพยากรในแต่ละเว็บไซต์เติบโตขึ้น (ปัจจุบันเบราว์เซอร์เปิดการเชื่อมต่อแบบขนานถึง 6 การเชื่อมต่อภายใต้ HTTP / 1.1 แต่ควรเติบโตขึ้นเมื่อไซต์มีความซับซ้อนมากขึ้นหรือไม่)

แผนภาพนี้แสดงให้เห็นถึงความแตกต่างและมีรุ่นที่เคลื่อนไหวมากเกินไป

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

สิ่งหนึ่งที่เน้นในความคิดเห็นด้านล่างคือแบนด์วิดท์ส่งผลต่อเราที่นี่อย่างไร แน่นอนว่าการเชื่อมต่ออินเทอร์เน็ตของคุณถูก จำกัด ด้วยจำนวนที่คุณสามารถดาวน์โหลดได้และ HTTP / 2 ไม่ได้ระบุถึงสิ่งนั้น ดังนั้นหากแหล่งข้อมูลทั้ง 10 รายการที่กล่าวถึงในตัวอย่างข้างต้นเป็นภาพคุณภาพการพิมพ์จำนวนมากก็จะยังดาวน์โหลดได้ช้า อย่างไรก็ตามสำหรับเว็บเบราว์เซอร์ส่วนใหญ่แบนด์วิดท์มีปัญหาน้อยกว่าเวลาในการตอบสนอง ดังนั้นหากทรัพยากรสิบรายการเหล่านี้เป็นรายการขนาดเล็ก (โดยเฉพาะทรัพยากรข้อความเช่น CSS และ JavaScript ซึ่งสามารถบีบอัดให้เล็กลงได้) เช่นเดียวกับที่พบบ่อยในเว็บไซต์แบนด์วิดท์ไม่ใช่ปัญหาจริงๆ แต่เป็นปริมาณทรัพยากรที่แท้จริงซึ่งมักจะเป็น ปัญหาและ HTTP / 2 ดูเหมือนจะแก้ไขปัญหานั้น นี่เป็นสาเหตุที่ใช้การเรียงต่อกันใน HTTP / 1.1 เป็นวิธีแก้ปัญหาอื่นดังนั้นตัวอย่างเช่น CSS ทั้งหมดมักจะรวมเข้าด้วยกันเป็นไฟล์เดียว:anti-pattern ภายใต้ HTTP / 2 - แม้ว่าจะมีข้อโต้แย้งต่อต้านการทำเช่นนั้นด้วยก็ตาม)

เพื่อให้เป็นตัวอย่างในโลกแห่งความเป็นจริงสมมติว่าคุณต้องสั่งซื้อสินค้า 10 ชิ้นจากร้านค้าเพื่อจัดส่งถึงบ้าน:

  • HTTP / 1.1 พร้อมการเชื่อมต่อเดียวหมายความว่าคุณต้องสั่งซื้อทีละรายการและคุณไม่สามารถสั่งซื้อรายการถัดไปได้จนกว่าจะถึงรายการสุดท้าย คุณเข้าใจได้ว่าต้องใช้เวลาหลายสัปดาห์ในการผ่านทุกสิ่ง

  • HTTP / 1.1 ที่มีการเชื่อมต่อหลายรายการหมายความว่าคุณสามารถมีคำสั่งซื้ออิสระจำนวน (จำกัด ) ได้ทุกที่ในเวลาเดียวกัน

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

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

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

หวังว่าจะช่วยได้


8
คำอธิบายที่ยอดเยี่ยม ตัวอย่างคือสิ่งที่ฉันต้องการเพื่อให้ได้สิ่งนี้ ดังนั้นใน HTTP / 1.1 จึงเสียเวลาระหว่างรอการตอบกลับและส่งคำขอถัดไป HTTP / 2 แก้ไขปัญหานี้ ขอบคุณ.
user3448600

1
แต่ฉันคิดว่ารุนแรง อาจเพิ่งขอให้ฉันเพิ่มส่วนแบนด์วิดท์ซึ่งฉันยินดีที่จะทำและจะทำหลังจากที่เราเสร็จสิ้นการสนทนานี้ อย่างไรก็ตาม IMHO Bandwidth ไม่ใช่ปัญหาใหญ่สำหรับการท่องเว็บ (อย่างน้อยก็ในโลกตะวันตก) - เวลาในการตอบสนองคือ และ HTTP / 2 ช่วยเพิ่มเวลาในการตอบสนอง เว็บไซต์ส่วนใหญ่ประกอบด้วยทรัพยากรขนาดเล็กจำนวนมากและแม้ว่าคุณจะมีแบนด์วิดท์ในการดาวน์โหลด (เหมือนที่คนทั่วไปทำกัน) แต่ก็จะช้าเนื่องจากเวลาแฝงของเครือข่าย แบนด์วิดท์กลายเป็นปัญหามากขึ้นสำหรับทรัพยากรขนาดใหญ่ ฉันยอมรับว่าเว็บไซต์ที่มีรูปภาพขนาดใหญ่และทรัพยากรอื่น ๆ อาจยังใช้แบนด์วิดท์ถึงขีด จำกัด
Barry Pollard

1
ไม่ควรใช้ HTTP เพื่อบังคับสั่งซื้อ - เนื่องจากไม่มีการรับประกันดังกล่าว ด้วย HTTP / 2 คุณสามารถแนะนำลำดับความสำคัญสำหรับการจัดส่ง แต่ไม่ใช่คำสั่งซื้อ นอกจากนี้หากเนื้อหา JavaScript รายการหนึ่งของคุณถูกแคชไว้ แต่อีกรายการไม่ใช่ HTTP จะไม่สามารถส่งผลกระทบได้ คุณควรใช้การเรียงลำดับใน HTML ควบคู่ไปกับการใช้ async หรือ defer ที่เหมาะสม ( growthwiththeweb.com/2014/02/async-vs-defer-attributes.html ) หรือไลบรารีเช่น require.js
Barry Pollard

1
คำอธิบายที่ยอดเยี่ยม ขอบคุณ!
hmacias

2
เป็นเพราะ HTTP / 1.1 เป็นสตรีมของข้อความและ HTTP / 2 เป็นแบบแพ็กเก็ตซึ่งเรียกว่าเฟรมใน HTTP / 2 แทนที่จะเป็นแพ็กเก็ต ดังนั้นใน HTTP / 2 แต่ละเฟรมสามารถถูกแท็กไปยังสตรีมซึ่งช่วยให้การแทรกระหว่างเฟรม ใน HTTP / 1.1 ไม่มีแนวคิดเช่นนี้เนื่องจากเป็นเพียงชุดของบรรทัดข้อความสำหรับส่วนหัวแล้วตามด้วยเนื้อหา รายละเอียดเพิ่มเติมที่นี่: stackoverflow.com/questions/58498116/…
Barry Pollard

5

ขอมัลติเพล็กซ์

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

ป้อนคำอธิบายภาพที่นี่


4

Ans ง่าย ๆ ( ที่มา ):

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

คำตอบที่ซับซ้อน / ละเอียด:

ดูคำตอบของ @BazzaDP


1
สามารถทำได้โดยใช้ pipelining ใน http 1.1 วัตถุประสงค์หลักของการมัลติเพล็กซ์ใน HTTP2 คือการไม่รอคำตอบตามคำสั่ง
Dhairya Lakhera

4

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

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

กระบวนการแลกเปลี่ยน HTTP1 VS HTTP2


ตัวอย่างการมัลติเพล็กซ์ HTTP / 2 ของคุณไม่ได้แสดงการมัลติเพล็กซ์ สถานการณ์ในไดอะแกรมของคุณแสดงการไปป์ไลน์ HTTP ซึ่งเปิดตัวใน HTTP / 1.1
ich5003

@ ich5003 เป็น Multiplexing เพราะใช้การเชื่อมต่อเดียว แต่ก็เป็นความจริงเช่นกันว่ากรณีของการส่งการตอบกลับหลายครั้งต่อคำขอหนึ่งคำขอนั้นไม่ได้แสดงอยู่
Juanma Menendez

1
สิ่งที่ฉันพยายามจะบอกว่าสถานการณ์ที่แสดงด้านบนสามารถทำได้โดยใช้ HTTP pipelining เท่านั้น
ich5003

ฉันเชื่อว่าที่มาของความสับสนที่นี่คือลำดับของคำขอ / การตอบสนองในแผนภาพทางด้านขวา - พวกเขาแสดงกรณีพิเศษของการมัลติเพล็กซ์ใน HTTP / 2 ซึ่งสามารถทำได้โดยการไปป์ไลน์ใน HTTP / 1.1 หากลำดับการตอบกลับในแผนภาพแตกต่างจากลำดับการร้องขอจะไม่มีความสับสนเกิดขึ้น
raiks

2

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

การวางท่อ (HTTP / 1.1)

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

มัลติเพล็กซ์ (HTTP / 2)

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

หวังว่าภาพที่ปรับปรุงจะชี้แจงความแตกต่าง:

มาตรฐาน HTTP / 1.1 flow / Pipelining / Multiplexing

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