1) ทำไมโปรโตคอล WebSockets ถึงดีกว่า?
WebSockets จะดีกว่าสำหรับสถานการณ์ที่เกี่ยวข้องกับการสื่อสารที่มีความหน่วงต่ำโดยเฉพาะอย่างยิ่งสำหรับความหน่วงแฝงต่ำสำหรับข้อความของไคลเอ็นต์ไปยังเซิร์ฟเวอร์ สำหรับข้อมูลเซิร์ฟเวอร์ไปยังไคลเอนต์คุณสามารถรับเวลาในการตอบสนองค่อนข้างต่ำโดยใช้การเชื่อมต่อแบบยาวและการถ่ายโอนแบบเป็นก้อน อย่างไรก็ตามสิ่งนี้ไม่ได้ช่วยให้ลูกค้าทราบถึงความหน่วงของเซิร์ฟเวอร์ซึ่งต้องการการเชื่อมต่อใหม่ที่จะสร้างขึ้นสำหรับแต่ละข้อความลูกค้าไปยังเซิร์ฟเวอร์
การจับมือ HTTP 48 ไบต์ของคุณไม่เหมือนจริงสำหรับการเชื่อมต่อเบราว์เซอร์ HTTP ในโลกแห่งความจริงซึ่งมักจะมีข้อมูลหลายกิโลไบต์ที่ส่งเป็นส่วนหนึ่งของคำขอ (ทั้งสองทิศทาง) รวมถึงส่วนหัวและข้อมูลคุกกี้จำนวนมาก นี่คือตัวอย่างของคำขอ / ตอบสนองต่อการใช้ Chrome:
ตัวอย่างคำขอ (2800 ไบต์รวมถึงข้อมูลคุกกี้ 490 ไบต์โดยไม่มีข้อมูลคุกกี้):
GET / HTTP/1.1
Host: www.cnn.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.68 Safari/537.17
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [[[2428 byte of cookie data]]]
ตัวอย่างการตอบกลับ (355 ไบต์):
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 13 Feb 2013 18:56:27 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: CG=US:TX:Arlington; path=/
Last-Modified: Wed, 13 Feb 2013 18:55:22 GMT
Vary: Accept-Encoding
Cache-Control: max-age=60, private
Expires: Wed, 13 Feb 2013 18:56:54 GMT
Content-Encoding: gzip
ทั้ง HTTP และ WebSockets มี handshake การเชื่อมต่อเริ่มต้นที่มีขนาดเท่ากัน แต่ด้วยการเชื่อมต่อ WebSocket การจับมือเริ่มต้นจะดำเนินการเพียงครั้งเดียวแล้วข้อความขนาดเล็กจะมีโอเวอร์เฮด 6 ไบต์เท่านั้น (2 สำหรับส่วนหัวและ 4 สำหรับค่ามาสก์) ค่าใช้จ่ายในการตอบสนองไม่มากนักจากขนาดของส่วนหัว แต่จากตรรกะไปยังการแยกวิเคราะห์ / จัดการ / จัดเก็บส่วนหัวเหล่านั้น นอกจากนี้เวลาแฝงในการตั้งค่าการเชื่อมต่อ TCP อาจเป็นปัจจัยที่ใหญ่กว่าขนาดหรือเวลาประมวลผลสำหรับแต่ละคำขอ
2) เหตุใดจึงมีการนำมาใช้แทนที่จะอัพเดตโปรโตคอล HTTP
มีความพยายามในการออกแบบโปรโตคอล HTTP ใหม่เพื่อให้ได้ประสิทธิภาพที่ดีขึ้นและลดเวลาในการตอบสนองเช่นSPDY , HTTP 2.0และQUIC QUICสิ่งนี้จะช่วยปรับปรุงสถานการณ์สำหรับคำขอ HTTP ปกติ แต่เป็นไปได้ว่า WebSockets และ / หรือ WebRTC DataChannel จะยังคงมีเวลาแฝงที่ต่ำกว่าสำหรับไคลเอ็นต์ไปยังการถ่ายโอนข้อมูลเซิร์ฟเวอร์กว่าโปรโตคอล HTTP (หรือจะใช้ในโหมดที่ดูเหมือน WebSockets มาก อย่างไรก็ตาม).
อัปเดต :
นี่คือกรอบการคิดเกี่ยวกับเว็บโปรโตคอล:
- TCP : เลเยอร์ต่ำ, สองทิศทาง, ฟูลดูเพล็กซ์และเลเยอร์การขนส่งตามคำสั่งที่รับประกัน ไม่รองรับเบราว์เซอร์ (ยกเว้นผ่านปลั๊กอิน / Flash)
- HTTP 1.0 : โพรโทคอลการขนส่งการตอบสนองการร้องขอชั้นบน TCP ไคลเอนต์ทำการร้องขอแบบเต็มหนึ่งเซิร์ฟเวอร์ให้การตอบสนองอย่างเต็มรูปแบบหนึ่งแล้วการเชื่อมต่อถูกปิด วิธีการร้องขอ (GET, POST, HEAD) มีความหมายเฉพาะสำหรับการทำธุรกรรมสำหรับทรัพยากรบนเซิร์ฟเวอร์
- HTTP 1.1 : รักษาลักษณะการตอบสนองการร้องขอของ HTTP 1.0 แต่อนุญาตให้การเชื่อมต่อเปิดอยู่สำหรับการร้องขอแบบเต็ม / การตอบกลับแบบเต็มหลายครั้ง (การตอบกลับหนึ่งครั้งต่อการร้องขอ) ยังคงมีส่วนหัวแบบเต็มในคำขอและการตอบกลับ แต่การเชื่อมต่อถูกนำมาใช้ใหม่และไม่ปิด HTTP 1.1 ยังเพิ่มวิธีการร้องขอเพิ่มเติม (OPTIONS, PUT, DELETE, TRACE, CONNECT) ซึ่งมีความหมายเฉพาะสำหรับธุรกรรมเช่นกัน อย่างไรก็ตามดังที่กล่าวไว้ในเบื้องต้นเกี่ยวกับข้อเสนอฉบับร่าง HTTP 2.0 การวางสาย HTTP 1.1 ไม่ได้ถูกนำไปใช้อย่างกว้างขวางดังนั้นสิ่งนี้จึง จำกัด ยูทิลิตี้ของ HTTP 1.1 อย่างมากเพื่อแก้ปัญหาเวลาแฝงระหว่างเบราว์เซอร์และเซิร์ฟเวอร์
- Long-Poll : การเรียงลำดับของ "แฮ็ค" ไปยัง HTTP (ทั้ง 1.0 หรือ 1.1) โดยที่เซิร์ฟเวอร์ไม่ตอบสนองทันที (หรือตอบเพียงบางส่วนด้วยส่วนหัว) ต่อคำขอของลูกค้า หลังจากการตอบสนองของเซิร์ฟเวอร์ไคลเอนต์ส่งคำขอใหม่ทันที (ใช้การเชื่อมต่อเดียวกันถ้าผ่าน HTTP 1.1)
- การสตรีม HTTP : เทคนิคที่หลากหลาย (การตอบกลับแบบหลายส่วน / แบบแยกส่วน) ที่อนุญาตให้เซิร์ฟเวอร์ส่งการตอบกลับมากกว่าหนึ่งครั้งไปยังคำขอไคลเอนต์เดียว W3C กำลังทำให้มาตรฐานนี้เป็นเหตุการณ์ที่เซิร์ฟเวอร์ส่งโดยใช้
text/event-stream
ประเภท MIME เบราว์เซอร์ API (ซึ่งค่อนข้างคล้ายกับ WebSocket API) เรียกว่า EventSource API
- ดาวหาง / เซิร์ฟเวอร์พุช : นี่เป็นคำศัพท์ในร่มที่มีทั้งแบบสำรวจความยาวและการสตรีม HTTP ห้องสมุดดาวหางมักจะสนับสนุนเทคนิคหลายอย่างเพื่อลองและเพิ่มการรองรับข้ามเบราว์เซอร์และข้ามเซิร์ฟเวอร์ให้สูงสุด
- WebSockets : TCP ในตัวเลเยอร์การขนส่งที่ใช้ handshake อัพเกรดที่เป็นมิตรกับ HTTP ซึ่งแตกต่างจาก TCP ซึ่งเป็นการส่งผ่านข้อมูลแบบสตรีม WebSockets คือการส่งผ่านข้อความ: ข้อความถูกคั่นบนสายไฟและประกอบเข้าด้วยกันใหม่ก่อนที่จะส่งไปยังแอปพลิเคชัน การเชื่อมต่อ WebSocket เป็นการเชื่อมต่อสองทางฟูลดูเพล็กซ์และอายุการใช้งานยาวนาน หลังจากการร้องขอ / การตอบสนองการจับมือเริ่มต้นไม่มีความหมายของการทำธุรกรรมและมีค่าใช้จ่ายต่อข้อความน้อยมาก ไคลเอนต์และเซิร์ฟเวอร์อาจส่งข้อความได้ตลอดเวลาและต้องจัดการการรับข้อความแบบอะซิงโครนัส
- SPDY : ข้อเสนอที่ริเริ่มโดย Google เพื่อขยาย HTTP โดยใช้โปรโตคอลลวดที่มีประสิทธิภาพมากขึ้น แต่ยังคงความหมาย HTTP ทั้งหมด (คำขอ / ตอบกลับ, คุกกี้, การเข้ารหัส) SPDY แนะนำรูปแบบการจัดเฟรมใหม่ (พร้อมเฟรมที่มีความยาวนำหน้า) และระบุวิธีในการจัดวางคู่การร้องขอ / การตอบกลับ HTTP ลงในเลเยอร์การสร้างเฟรมใหม่ ส่วนหัวสามารถบีบอัดและส่วนหัวใหม่สามารถส่งหลังจากการเชื่อมต่อได้รับการจัดตั้งขึ้น SPDY มีการใช้งานจริงในเบราว์เซอร์และเซิร์ฟเวอร์
- HTTP 2.0 : มีเป้าหมายคล้ายกันกับ SPDY: ลดเวลาแฝงและค่าใช้จ่าย HTTP ในขณะที่ยังคงรักษาซีแมนทิกส์ HTTP ไว้ ร่างปัจจุบันมาจาก SPDY และกำหนด handshake อัพเกรดและกำหนดกรอบข้อมูลที่คล้ายกับมาตรฐาน WebSocket สำหรับ handshake และ framing มาก ข้อเสนอฉบับร่าง HTTP 2.0 ทางเลือก (httpbis-speed-mobility) ใช้ WebSockets สำหรับเลเยอร์การขนส่งและเพิ่ม SPDY มัลติเพล็กซิ่งและการจับคู่ HTTP เป็นส่วนขยาย WebSocket (ส่วนขยาย WebSocket ถูกเจรจาระหว่างการจับมือกัน)
- WebRTC / CU-WebRTC : ข้อเสนอเพื่ออนุญาตการเชื่อมต่อแบบ peer-to-peer ระหว่างเบราว์เซอร์ สิ่งนี้อาจเปิดใช้งานการสื่อสารเวลาแฝงเฉลี่ยและสูงสุดต่ำกว่าเนื่องจากในขณะที่การรับส่งข้อมูลพื้นฐานคือ SDP / ดาตาแกรมมากกว่า TCP สิ่งนี้ช่วยให้การจัดส่งแพ็กเก็ต / ข้อความที่ไม่เป็นไปตามคำสั่งซึ่งหลีกเลี่ยงปัญหา TCP ของ spikes แฝงที่เกิดจากแพ็กเก็ตที่ถูกปล่อยซึ่งล่าช้าในการส่งมอบแพ็กเก็ตต่อมาทั้งหมด (เพื่อรับประกันการจัดส่งตามลำดับ)
- QUIC : เป็นโปรโตคอลทดลองที่มุ่งลดความหน่วงแฝงของเว็บผ่าน TCP บนพื้นผิว QUIC คล้ายกับ TCP + TLS + SPDY ที่ใช้งานบน UDP QUIC ให้บริการมัลติเพล็กซิ่งและโฟลว์คอนโทรลเทียบเท่ากับ HTTP / 2 ความปลอดภัยเทียบเท่ากับ TLS และซีแมนทิกส์การเชื่อมต่อความน่าเชื่อถือและการควบคุมความแออัดเทียบเท่ากับ TCP เนื่องจาก TCP ถูกนำไปใช้ในเมล็ดของระบบปฏิบัติการและเฟิร์มแวร์กล่องจดหมายกลางการทำการเปลี่ยนแปลงที่สำคัญกับ TCP จึงเป็นไปไม่ได้ อย่างไรก็ตามเนื่องจาก QUIC ถูกสร้างขึ้นที่ด้านบนของ UDP จึงมีข้อ จำกัด ดังกล่าว QUIC ได้รับการออกแบบและปรับให้เหมาะสมสำหรับความหมาย HTTP / 2
การอ้างอิง :
- HTTP :
- เหตุการณ์ที่เซิร์ฟเวอร์ส่ง :
- WebSockets :
- SPDY :
- HTTP 2.0 :
- WebRTC :
- QUIC :