พอร์ตและโครงร่าง URI ถูกจัดการโดยเซิร์ฟเวอร์ tcp / ip อย่างไร


1

ฉันกำลังทำงานกับ lwip tcp / ip stack บนอุปกรณ์ฝังตัวและฉันพยายามเข้าใจว่ามันทำงานได้อย่างไร ฉันได้ดูเอกสารและรหัสแล้ว แต่ฉันสับสนกับวิธีจัดการพอร์ตและรูปแบบ URI โดยสแต็ก tcp / ip

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

สำหรับ lwip หากต้องการตั้งค่าการเชื่อมต่อ tcp จะสร้าง "Protocol Control Block" (PCB) นี้ถูกกำหนดโดยที่อยู่ IP ท้องถิ่นและพอร์ต ดูเหมือนว่าสมเหตุสมผล - PCB นี้ฟังพอร์ตที่ระบุ รูปแบบของ URI มีบทบาทอย่างไรในเรื่องนี้แล้ว? PCB นี้ได้รับรูปแบบ uri หรือไม่? ฉันไม่เห็นรูปแบบ URI ที่ถูกส่งผ่านไปยังฟังก์ชันการโทรกลับเพื่อรับแพ็กเก็ต

มันทำงานอย่างไรถ้าฉันต้องการเปลี่ยนโปรโตคอล - ตัวอย่างเช่นอัพเกรดการเชื่อมต่อ HTTP เป็นการเชื่อมต่อ Websocket? หากจับมือเริ่มต้นด้วย HTTP: พอร์ต 80 แล้วจะทำการสื่อสารเพิ่มเติมผ่าน WS: พอร์ต X อย่างไร

ดังตัวอย่างต่อไปนี้เป็นฟังก์ชันลายเซ็นสำหรับผูก PCB ใน lwip (ในรหัส C):

tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

สิ่งนี้จะผูก PCB กับที่อยู่ IP และหมายเลขพอร์ต อย่างไรก็ตามไม่ได้ระบุรูปแบบ URI ดังนั้นฉันคิดว่า PCB นั้นไม่เชื่อเรื่องแผนการของ URI ถ้าเราดูต้นแบบการโทรกลับเพื่อรับแพ็กเก็ต:

err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)

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

ความช่วยเหลือใด ๆ ที่ชื่นชม!

คำตอบ:


0

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

HTTP เป็นโปรโตคอลที่ทำงานบน TCP โปรโตคอลอื่น ๆ ที่ใช้ TCP คือ FTP, SSH, SSL เป็นต้น

ฟังก์ชั่นที่คุณอธิบายไว้ใช้สำหรับจัดการการเชื่อมต่อ TCP โดยทั่วไป

คุณควรอ่านhttp://www.w3.org/Protocols/rfc2616/rfc2616.htmlเพื่อเรียนรู้โปรโตคอล HTTP

ภาพรวมโดยย่อเกี่ยวกับการร้องขอ HTTP ตัวอย่างนี้ยึดตาม HTTP 1.0 เนื่องจากง่ายกว่า

เมื่อคุณบอกเบราว์เซอร์ให้เชื่อมต่อกับhttp://superuser.comนี่คือสิ่งที่เกิดขึ้นในพื้นหลัง:

  1. เบราว์เซอร์ทำการค้นหา DNS superuser.comเพื่อค้นหาที่อยู่ IP สำหรับบริการ
  2. เบราว์เซอร์เปิดการเชื่อมต่อ TCP ไปยังเซิร์ฟเวอร์สำหรับ superuser.com
  3. เบราว์เซอร์ส่งGET /คำขอ HTTP ไปยังเซิร์ฟเวอร์
  4. เซิร์ฟเวอร์จะส่งไฟล์ที่สอดคล้องกับ/ตำแหน่งกลับไป

ดังนั้นเซิร์ฟเวอร์ไม่จำเป็นต้องรู้อะไรเกี่ยวกับรูปแบบ URI ที่นี่ เซิร์ฟเวอร์ต้องเข้าใจเฉพาะโปรโตคอล HTTP หลัก ๆ (GET, POST, HEAD เป็นต้น) และส่งคืนทรัพยากรที่สอดคล้องกับไคลเอ็นต์ผ่านซ็อกเก็ต TCP


ขอบคุณ ฉันอ่านโปรโตคอล http แล้ว นอกจากนี้ยังเป็นบทช่วยสอนที่ดีที่อ่านได้ง่ายกว่าสเป็ค: jmarshall.com/easy/http
mhe

โครงร่าง URI แตกต่างกันอย่างไร ตัวอย่างเช่นถ้าฉันใช้ ws: หรือ ftp:? เป็นรูปแบบทั้งหมดเพื่อผลประโยชน์ของฝ่ายลูกค้าหรือไม่? เซิร์ฟเวอร์ไม่สนใจใช่ไหม
MHE

เบราว์เซอร์ใช้ฟิลด์โปรโตคอลใน URL ทรัพยากรเพื่อเลือกวิธีการที่เหมาะสมในการเชื่อมต่อกับเซิร์ฟเวอร์ ตัวอย่างเช่นด้วย ftp: // URL เบราว์เซอร์จะเชื่อมต่อกับพอร์ต 21 ของเซิร์ฟเวอร์ระยะไกลด้วยโปรโตคอล FTP จากนั้นเซิร์ฟเวอร์หวังว่าจะรันเซิร์ฟเวอร์ FTP บนพอร์ตนั้นเพื่อให้การร้องขอสำเร็จ
Tero Kilkanen

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