อะไรคือความแตกต่างพื้นฐานระหว่าง WebSockets และ TCP บริสุทธิ์?


167

ฉันได้อ่านเกี่ยวกับWebSocketsและฉันสงสัยว่าทำไมเบราว์เซอร์ไม่สามารถเปิดการเชื่อมต่อ TCP เล็กน้อยและสื่อสารกับเซิร์ฟเวอร์เหมือนแอปพลิเคชันเดสก์ท็อปอื่น และทำไมการสื่อสารนี้เป็นไปได้ผ่าน websockets


8
แต่ปัญหาคืออะไร ปล่อยให้พวกเขาใช้ TCP
xap4o

2
ข้อมูลเพิ่มเติมstackoverflow.com/questions/8051516/…
Hernán Eche

2
"WebSocket เป็นโปรโตคอลที่ให้บริการช่องทางการสื่อสารแบบฟูลดูเพล็กซ์ผ่านการเชื่อมต่อ TCP เดียว" คุณสามารถสร้างการเชื่อมต่อ TCP ด้วยซึ่งดูเพล็กซ์เต็ม? พิเศษเกี่ยวกับ WebSockets คืออะไร
Abhishek Jain

12
80ปัญหาคือว่าโดยปกติเว็บเซิร์ฟเวอร์มีเพียงหนึ่งพอร์ตเปิดให้บริการสำหรับเหตุผลด้านความปลอดภัยคือพอร์ต ตามคำนิยามหนึ่งพอร์ตสามารถแนบไปกับโปรแกรมประยุกต์หนึ่งเท่านั้น ดังนั้นถ้าลูกค้าต้องการใช้บริการนอกเหนือจากเว็บ (HTTP) แต่มีเพียงพอร์ตเดียวที่ใช้ได้หรือไม่ Voila! WebSockets!
Pithikos

3
@Pithikos ได้รับความสนใจเป็นอย่างมากว่าทำไมเราถึงต้องการความซับซ้อนของ websockets และไม่เพียงแค่จัดการกับ TCP sockets โดยตรงสำหรับการสื่อสารผ่านเบราว์เซอร์
ซันนี่

คำตอบ:


260

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

ผ่านทางอินเทอร์เน็ตคุณกำลังสื่อสารกับเซิร์ฟเวอร์ของบุคคลอื่นในอีกด้านหนึ่ง พวกเขาเป็นอย่างมากไม่น่าจะมีการเปิดซ็อกเก็ตเก่า ๆ สำหรับการเชื่อมต่อ โดยปกติแล้วจะมีเพียงไม่กี่มาตรฐานเช่นพอร์ต 80 สำหรับ HTTP หรือ 443 สำหรับ HTTPS ดังนั้นในการสื่อสารกับเซิร์ฟเวอร์คุณจำเป็นต้องเชื่อมต่อโดยใช้พอร์ตใดพอร์ตหนึ่ง

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


2
ขอบคุณสำหรับคำอธิบายง่ายๆ Ash
xap4o

ดังนั้นโดยทั่วไป WebSocket เป็นเพียง wrapper สำหรับ TCP ในแง่ที่ว่า UDP เป็นเพียง wrapper สำหรับ IP?
Pacerier

3
@Pacerier: WebSocket ต้องใช้โปรโตคอลการส่งผ่านบางอย่างเพื่อให้สามารถทำงานได้ แต่เลเยอร์การขนส่งนั้นไม่จำเป็นต้องเป็น TCP (มักจะเป็น TCP ในทางปฏิบัติเสมอ) คุณอาจคิดว่า WebSockets เป็นตัวห่อหุ้มรอบ TCP แต่ฉันไม่เชื่อว่าจะมีลิงค์กำหนดไว้ระหว่างทั้งสอง
แอช

4
"ผ่านทางอินเทอร์เน็ตคุณกำลังสื่อสารกับเซิร์ฟเวอร์ของผู้อื่นในส่วนอื่น ๆ " "เนื่องจากพอร์ตเหล่านี้เป็นพอร์ตมาตรฐาน (80 & 443) สำหรับเว็บเซิร์ฟเวอร์ที่พูด HTTP โดยทั่วไปคุณจำเป็นต้องปฏิบัติตามโปรโตคอล HTTP มิฉะนั้นเซิร์ฟเวอร์จะไม่พูดกับคุณ " โดยปกติเซิร์ฟเวอร์ websocket ที่เราเข้าถึงจะเป็นของเราเอง ดังนั้นเราสามารถมีแอปพลิเคชันที่มีโปรโตคอลที่เรากำหนดให้ฟังพอร์ต จากนั้นทำไมเราจึงต้องใช้การจับมือ HTTP และการสลับโปรโตคอล แต่ทำไมเราไม่สามารถติดตาม websocket อย่างเช่นโปรโตคอลได้โดยตรง?
ratul

2
โดย RFC6455, WebSocket ต้องมีการจับมือกันใน HTTP ก่อนแล้วจึงอัพเกรดโปรโตคอลเป็น WebSocket เบราว์เซอร์ส่วนใหญ่ติดตามสิ่งนี้ ฉันไม่ทราบว่าฝั่งไคลเอ็นต์ของคุณ (เบราว์เซอร์) จะสนับสนุนอย่างไรหากคุณใช้โปรโตคอลใด ๆ ในเซิร์ฟเวอร์ มันเหมือนกับว่าเราสามารถสื่อสารภาษาฝรั่งเศสได้มีเพียงเราเท่านั้นที่รู้ภาษาฝรั่งเศส และการจับมือเป็นเหมือนฉันถามคุณว่า 'เราสามารถสื่อสารเป็นภาษาฝรั่งเศสได้ไหม' ในภาษาอังกฤษ (ที่นี่ HTTP) เบราว์เซอร์ที่นี่ (เช่นโครเมี่ยม) รู้ภาษาฝรั่งเศส แต่เราต้องสอนภาษาฝรั่งเศสให้กับเซิร์ฟเวอร์ คำถามของฉันคือเหตุผลที่ RFC6455 (WebSocketProtocol) ต้องการจับมือกันใน HTTP และทำให้สิ่งต่าง ๆ ซับซ้อนทำไมพวกเขาไม่สามารถทำได้ด้วยวิธีของพวกเขา?
ratul

31

เว็บเบราว์เซอร์ทำงานที่ Application layer ในขณะที่ TCP ทำงานที่ Transport Layer ในฐานะนักพัฒนาเว็บแอปพลิเคชันการส่งข้อความผ่านสายผ่านแอปพลิเคชันเลเยอร์ง่ายกว่าแทนไบต์ดิบที่ Transport Layer

WebSockets ที่สำคัญคือ TCP มันถูกแยกออกเพื่อความเรียบง่าย


2

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


2

ที่จะทำให้มันง่ายสื่อสาร WebSocket จะทำผ่าน TCP พอร์ตหมายเลข 80 (หรือ 443 ในกรณีของการเชื่อมต่อที่เข้ารหัสด้วย TLS) ซึ่งเป็นประโยชน์สำหรับสภาพแวดล้อมเหล่านั้นซึ่งป้องกันที่ไม่ใช่เว็บการเชื่อมต่ออินเทอร์เน็ตโดยใช้ไฟร์วอลล์

คุณต้องการใช้พอร์ต TCP ที่มีอยู่หรือเปิดพอร์ต TCP ใหม่ที่อาจถูกบล็อกโดยไฟร์วอลล์หรือไม่

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