ฉันเป็นเดวิดและเป้าหมายของฉันด้วยที่เก็บ/บทความนี้คือการทำให้ซ็อกเก็ต demystify โดยพยายามอธิบายพวกเขาในวิธีที่ง่ายที่สุดเท่าที่จะเป็นไปได้
ในตัวอย่างเหล่านี้ฉันจะใช้ nodejs และอนุภาค (รุ่นใด ๆ จะทำ) เพื่อแสดงว่าฮาร์ดแวร์สามารถพูดคุยกับ nodejs ได้อย่างไรและในทางกลับกัน แต่อย่าทำผิดพลาดนี่ไม่ได้หมายความว่าเครื่องมือที่ฉันเลือกเป็นวิธีเดียวที่จะไปเกี่ยวกับเรื่องนี้ นี่คือสิ่งที่ฉันรู้เป็นการส่วนตัว
อุปกรณ์ฝังตัวใด ๆ ที่มีการเชื่อมต่อเครือข่ายจะทำงานได้ในทำนองเดียวกันและภาษาใด ๆ ที่มีการรองรับซ็อกเก็ตก็จะทำเช่นกัน
โครงสร้าง repo
ฉันเชื่อว่ามีความลึกลับขนาดใหญ่รอบ ๆ ซ็อกเก็ต หลายคนทำให้พวกเขาฟังดูน่ากลัวตลอดหลายปีที่ผ่านมาและเป้าหมายของฉันคือการพิสูจน์ว่าพวกเขาไม่ได้ลึกลับหรือซับซ้อน ฉันหวังว่าในที่สุดคุณจะคิดเกี่ยวกับซ็อกเก็ตเป็นวิธีแก้ปัญหาที่ง่ายกว่าสำหรับปัญหาเฉพาะ
โดยเฉพาะอย่างยิ่งในระบบฝังตัวที่ทุกไบต์นับ
ซ็อกเก็ตเป็นรากฐานสำหรับการเชื่อมต่อเครือข่ายทั้งหมด ทุกอุปกรณ์ที่เชื่อมต่อใช้ซ็อกเก็ต ด้านบนของซ็อกเก็ตคุณจะมีโปรโตคอลซึ่งไม่มีอะไรอื่นนอกจากกฎที่ระบุว่าควรส่งหรือประมวลผลข้อมูลอย่างไรหลังจากได้รับ โปรโตคอล HTTP ยอดนิยมเป็นตัวอย่างของสิ่งนี้ เมื่อรู้สิ่งนี้คุณสามารถเลียนแบบอุปกรณ์ใด ๆ ด้วยภาษาที่มีการสนับสนุนซ็อกเก็ต ยังไง? โดยการส่งไบต์ที่ปฏิบัติตามโปรโตคอลเฉพาะ (กฎ) กฎเหล่านี้มีให้บริการออนไลน์อย่างอิสระ
คุณสามารถสร้างแอพที่อ้างว่าเป็น:
ทำไมผู้คนถึงเชื่อว่าซ็อกเก็ตมีความซับซ้อน?
อาจเป็นเพราะคนมักจะใช้คำที่สื่อความซับซ้อนเช่น:
เพียงแค่อ่านจุดสองสามจุดที่คุณอาจคิดว่านี่ไม่ใช่สำหรับฉัน แต่ซ็อกเก็ตนั้นตรงไปตรงมามาก ตัวอย่างเช่นในการรับการตอบกลับจากเว็บเซิร์ฟเวอร์คุณเพียงแค่ต้องส่งข้อความต่อไปนี้:
GET / HTTP/1.1
นี่คือ เซิร์ฟเวอร์จะใช้ข้อความนี้แยกวิเคราะห์และเข้าใจว่าคุณกำลังทำ::
/contact เพื่อรับหน้าติดต่อไม่มีอะไรมากไปกว่านี้ เครื่องพิมพ์จะเข้าใจส่วนหัวอื่นในทำนองเดียวกันเซิร์ฟเวอร์ DNS จะต้องการสิ่งที่เฉพาะเจาะจงกับโปรโตคอล (กฎ)
ยากที่จะเชื่อ? ใช้แอพ Telnet เพื่อเชื่อมต่อกับไซต์ที่คุณชื่นชอบโดยใช้คำสั่งนี้ (จะรองรับการเชื่อมต่อที่ไม่ปลอดภัยเท่านั้นผ่านพอร์ต 80)
SITE 80GET / HTTP/1.1สำหรับการเชื่อมต่อที่ปลอดภัยคุณสามารถใช้ OpenSSL ได้ดังนี้:
Openssl s_client -connect google.com:443GET / HTTP/1.1อีกตัวอย่างหนึ่งคือการส่งอีเมลโดยเชื่อมต่อตรงกับเซิร์ฟเวอร์ SMTP เซิร์ฟเวอร์ SMTP ปัจจุบันส่วนใหญ่ได้รับการรักษาความปลอดภัยด้วยรหัสผ่านและใช้การเข้ารหัสซึ่งทำให้ยากที่จะทดสอบสิ่งนี้อย่างรวดเร็ว แต่ถ้าคุณสามารถเข้าถึงเซิร์ฟเวอร์ SMTP ธรรมดาคุณสามารถพิมพ์ต่อไปนี้:
telnet example.com smtpHELO client.example.comMAIL from: <[email protected]>RCPT to: <[email protected]>DATAFrom: [email protected]To: [email protected]Subject: Test messageQUITอย่างที่คุณเห็นนี่ไม่ใช่?
ตอนนี้เรามีความเข้าใจที่ดีขึ้นเกี่ยวกับโปรโตคอลคุณจะต้องออกแบบโครงสร้างทั่วไปสำหรับการสื่อสาร สมมติว่าคุณต้องการส่งอุณหภูมิบ้านของคุณไปยังเซิร์ฟเวอร์ NodeJS ของคุณ กระแสไบต์ของคุณอาจมีลักษณะเช่นนี้:
45,40.1,50,90,100,102.5
เครื่องหมายจุลภาคทำหน้าที่เป็นตัวคั่นสำหรับการวัดแต่ละครั้ง คุณสามารถเลือกอักขระใด ๆ ที่คุณต้องการ แต่เพื่อให้คุณรู้ว่าเครื่องหมายจุลภาคจะทำให้ข้อมูลของคุณเข้ากันได้กับรูปแบบ CSV (ค่าคั่นด้วยเครื่องหมายจุลภาค) ในอีกด้านหนึ่งคุณต้องมีรหัสบางอย่างที่จะตรวจสอบตัวคั่นและเมื่อสิ่งนั้นเกิดขึ้น - คุณมีค่าของคุณ
อย่างที่คุณเห็นจากตัวอย่างนี้ไม่มีส่วนหัวหรือข้อมูลเสริม คุณตัดสินใจว่าอะไรจะเกิดขึ้นในโปรโตคอลของคุณ
จากตัวอย่างด้านบนคุณสามารถเพิ่มความชื้นให้กับโปรโตคอลของคุณเช่นนี้:
45:80,40:85,32.1:82,50:89
อีกครั้งเครื่องหมายจุลภาคจะแยกข้อมูลของคุณในขณะที่ลำไส้ใหญ่แตกต่างจากชุดข้อมูลของคุณ นอกจากนี้: จำไว้ว่า ... โปรโตคอลต้องการเอกสารที่ดีดังนั้นนักพัฒนาอื่น ๆ สามารถทำความเข้าใจกับข้อมูลที่พวกเขาจะต้องจัดการ
สิ่งสำคัญอีกอย่างหนึ่งคือตัวอย่างของเขาพูดถึง ASCII Protocall เพื่อเรียนรู้วิธีการทำงานแบบไบนารีคุณสามารถอ่านบทความต่อไปนี้ที่ฉันเขียนชื่อ: วิธีการ deconstruct-ping-with-c-และ nodejs
คอมพิวเตอร์ทำงานใน 1s และ 0s และนี่คือความจริง ไม่มีวิธีสำหรับตัวอย่างที่จะแยกแยะแอปพลิเคชันที่รวบรวมจากข้อมูลปกติ ทุกอย่างถูกเก็บไว้เป็นชุดบิต หมายความว่าแม้แต่ข้อมูลที่ส่งผ่านอินเทอร์เน็ตก็อยู่ใน 1s และ 0s
คุณอาจถามว่าทำไมฉันถึงต้องใส่ใจเกี่ยวกับประเภท เนื่องจากขึ้นอยู่กับประเภทของคุณข้อมูลไบนารีของคุณจะแตกต่างกัน ตัวอย่างเช่น: จำนวนเต็ม 1 จะเป็น 00000001 โดยที่จำนวนเต็ม 31 จะกลายเป็น 00011111
ซึ่งหมายความว่าในอีกด้านหนึ่งของการเชื่อมต่อคุณต้องรู้ว่าคุณได้รับอะไร สมมติว่าคุณต้องการทำการเปรียบเทียบง่ายๆ
if ( data == 1 ) {
true
} หากคุณแปลงข้อมูลของคุณราวกับว่ามันเป็นจำนวนเต็ม แต่คุณส่งเป็นถ่านคุณจะเปรียบเทียบ int 31 กับ int 1 แต่ถ้าคุณรู้ว่าคุณกำลังส่งตัวละครคุณสามารถเปรียบเทียบกับประเภทที่ถูกต้อง:
if ( data == '1' ) {
true
} ตอนนี้ถ่าน 1 จริง ๆ แล้ว 31 และการเปรียบเทียบจะใช้งานได้ ในโฟลเดอร์ตัวอย่าง Hardware2NodeJS คุณจะพบโค้ดตัวอย่างที่อธิบายความแตกต่างในทางปฏิบัติ
บนอินเทอร์เน็ตโปรโตคอลที่ได้รับความนิยมมากที่สุดสองรายการสำหรับการส่งข้อมูลคือ TCP และ UDP คุณจะเห็นว่าผู้คนเพิ่ม /IP ในตอนท้ายของชื่อ IP ย่อมาจาก (Internet Protocol) และในระยะสั้นคุณสามารถคิดได้ว่าเป็นระบบที่อยู่ของอินเทอร์เน็ต ซึ่งหมายความว่าคุณสามารถใช้ TCP หรือ UDP ไม่เพียง แต่บนอินเทอร์เน็ตเนื่องจาก TCP และ UDP เป็นวิธีการบรรจุข้อมูลระบบที่อยู่ที่คุณจะใช้นั้นขึ้นอยู่กับคุณ
TCP และ UDP เป็นโปรโตคอลและตอนนี้คุณควรรู้ว่าคำนี้หมายถึงกฎและโปรโตคอลทั้งสองนี้ไม่มีอะไรมากไปกว่ากฎที่อธิบายวิธีการบรรจุข้อมูล ปลายอีกด้านเข้าใจกฎเดียวกันและสามารถแกะข้อมูลที่ได้รับและในทางกลับกัน
อินเทอร์เน็ตส่วนใหญ่ใช้ TCP เพราะเราต้องการความมั่นใจว่าสิ่งที่เราส่งจะได้รับอย่างครบถ้วนในอีกด้านหนึ่ง ตัวอย่างเช่นหากคุณส่งเอกสารคุณไม่ต้องการให้ตัวอักษรหรือคำหายไป ด้วยหลายรูปแบบหากชิ้นส่วนหายไปจากส่วนหัวซึ่งบอกระบบว่าจะเข้าใจไฟล์ได้อย่างไรระบบจะแจ้งให้คุณทราบว่าไฟล์นั้นเสียหายและไม่สามารถอ่านได้
แน่นอนว่ามีรูปแบบที่มีความยืดหยุ่นมากขึ้นและไม่ต้องการข้อมูล 100 เปอร์เซ็นต์ ตัวอย่างเช่นภาพยนตร์รูปภาพและรูปแบบเพลงบางอย่างอาจมีเนื้อหาที่ขาดหายไปและเราก็อยู่กับสิ่งนั้น ภาพหรือภาพยนตร์อาจมีสิ่งประดิษฐ์แปลก ๆ เพลงอาจมีรอยเปื้อนและเสียง
โปรโตคอลนี้มีประโยชน์มากเมื่อส่งข้อมูลจากผลิตภัณฑ์ฮาร์ดแวร์ สมมติว่าเรากำลังรวบรวมข้อมูลเซ็นเซอร์จากอุปกรณ์จำนวนมากโดยใช้โมเด็มโทรศัพท์มือถือและเราต้องจ่ายสำหรับแต่ละไบต์ที่เราส่ง ในกรณีนี้เราควรพิจารณาสิ่งต่อไปนี้: คุ้มค่าที่จะจ่ายมากขึ้นสำหรับความซื่อสัตย์ที่สูงขึ้นที่เรามีกับ TCP หรือไม่? หรือจะดีกว่าที่จะยอมรับการสูญเสียการวัดบางอย่าง แต่จ่ายน้อยลงสำหรับการถ่ายโอนข้อมูลของเรา?
โดยปกติฉันจะเริ่มต้นไปยัง TCP แต่ถ้าคุณมีกรณีที่ดีกับการใช้งาน UDP เป็นตัวเลือกที่ดีที่สุดต่อไปของคุณ
ฉันหวังว่าพื้นที่เก็บข้อมูลนี้จะช่วยให้คุณเข้าใจได้ดีขึ้นว่าซ็อกเก็ตคืออะไร หากมีอะไรบางอย่างไม่ชัดเจนให้ตีฉันบน Twitter และฉันจะพยายามแก้ไขคะแนนใด ๆ ในโครงการที่ไม่ชัดเจน
ฉันอยากจะขอบคุณคนดีทุกคนที่ช่วยฉันในโครงการนี้รวมถึง:
หากคุณสนุกกับโครงการนี้โปรดพิจารณาให้มัน? และตรวจสอบบัญชี GitHub ของฉันที่ซึ่งคุณจะพบแหล่งข้อมูลเพิ่มเติมที่คุณอาจพบว่ามีประโยชน์หรือน่าสนใจ
โครงการนี้นำเสนอให้คุณโดย 0x4447 LLC ซึ่งเป็น บริษัท ซอฟต์แวร์ที่เชี่ยวชาญในการสร้างโซลูชั่นที่กำหนดเองด้านบนของ AWS ไปที่ลิงค์นี้เพื่อเรียนรู้เพิ่มเติม: https://0x4447.com หรือส่งอีเมลไปที่ [email protected]