เส้นทาง reassembly ของการตอบสนอง HTTP คืออะไร?


0

ฉันพยายามเข้าใจว่าระบบปฏิบัติการโดยทั่วไปใช้การร้องขอเครือข่ายใหม่อีกครั้ง จากความเข้าใจที่ดีที่สุดของฉันต่อไปนี้เป็นจริง:

คำขอ HTTP ถูกสร้างขึ้นที่ชั้นแอปพลิเคชันโดยใช้ไลบรารี HTTP บางตัว ไลบรารี HTTP นี้เป็น wrapper สำหรับการใช้ซ็อกเก็ตบางส่วนโดยระบบปฏิบัติการ

ซ็อกเก็ต "การส่งสัญญาณ" นั้นถูกสร้างขึ้นทันทีโดยใช้ปลายทางและแหล่งที่มาของคำขอ

ซ็อกเก็ต "การรับ" ถูกสร้างขึ้นทันทีโดยใช้ที่อยู่ IP ของอุปกรณ์และพอร์ตแบบสุ่ม (ฟรี)

ข้อความ HTTP คือ "ส่ง" โดยใช้ตัวอธิบายไฟล์ของซ็อกเก็ต "กำลังส่ง"

วิธีการ "ส่ง" ของซ็อกเก็ตส่งข้อความไปยังการใช้ TCP ของระบบปฏิบัติการ

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

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

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

นี่คือสิ่งที่ความเข้าใจของฉันได้แยกแยะสิ่งที่เกิดขึ้นจริงในกระบวนการประกอบใหม่

การตอบสนองทำให้กลับไปที่บัฟเฟอร์การรับของซ็อกเก็ต "การรับ" มากขึ้นเมื่อแพ็กเก็ต IP ทำให้กลับไปที่อุปกรณ์ได้อย่างไร

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

PS ฉันหวังว่าจะมีรายละเอียดการใช้งานด้านเทคนิคมากกว่า "IP ประกอบใหม่" หรือ "TCP ประกอบใหม่" และส่งต่อไปยังชั้นถัดไป ฉันหวังว่าจะเข้าใจว่ามันเกิดขึ้นได้อย่างไรแทนที่จะเป็นในทางทฤษฎี (แม้ว่าฉันจะเข้าใจว่ามันเป็นระบบปฏิบัติการที่เฉพาะเจาะจง)

แก้ไข:

เพื่อเพิ่มความชัดเจนให้กับหัวเรื่องฉันจะบันทึกการอ้างอิงของฉันไปยังซ็อกเก็ตและวิธีซ็อกเก็ตใด ๆ ที่อ้างถึง Linux OS


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการ ย้ายไปแชท .
Journeyman Geek

คำตอบ:


1

การค้นพบที่ดีโดย Mike Penningtion (ใน แสดงความคิดเห็น ) การค้นหาคำอธิบายทางเทคนิคโดยละเอียดเกี่ยวกับเส้นทางของคำขอลง Network Stack และสำรองข้อมูล (เฉพาะกับ Linux OS 2005)

ภาพที่มีรายละเอียดมากขึ้นซึ่งสกัดจากขั้นตอนต่อไปนี้ :

หมายเหตุในขณะที่ขั้นตอนที่ระบุไว้ยังไม่ใกล้เคียงกับรายละเอียดเอกสารดังกล่าวข้างต้นโดยประมาณมีดังนี้:

ระบบปฏิบัติการมีไฟล์อธิบายเฉพาะสำหรับพอร์ตอีเธอร์เน็ต rx

The rx ring is a ring in the kernel memory where the network card transfers the incoming packet through DMA. The raw data which is stored in the rx ring structure is either copied into a sk buff structure.

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

ถ้าถูกต้องมันจะย้ายไปที่เลเยอร์ IP มันตรวจสอบโปรโตคอล (จากส่วนหัว IP) และหากโปรโตคอลเป็น TCP ให้เรียกใช้ tcp v4 rcv ฟังก์ชั่นจึงย้ายไปยังชั้น TCP

และส่วนนี้มีความสำคัญ:

The next step for this function is to find an open socket for this incoming packet,

สิ่งนี้ทำได้โดยการเรียก tcp v4 lookupในส่วนของรหัสต่อไปนี้:

sk = __tcp_v4_lookup(skb->nh.iph->saddr, th->source,
skb->nh.iph->daddr, ntohs(th->dest),
tcp_v4_iif(skb));

โดยพื้นฐานแล้วฉันรวบรวมมี LUT การแมปซ็อกเก็ต TCP ไปยังแหล่งที่มาและที่อยู่ปลายทาง / พอร์ตของการเชื่อมต่อซ็อกเก็ตตามที่ระบุโดยการเรียกใช้ฟังก์ชั่นนั้น

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


0

(จาก แสดงความคิดเห็น )

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

เวอร์ชั่นเก่าของสิ่งที่คุณกำลังมองหาอยู่ที่นี่: สแต็กเครือข่าย Linux . ฉันกำลังพยายามหาสิ่งที่ใหม่กว่าคำอธิบายปี 2005 เนื่องจากบางส่วนของ linux มีการเปลี่ยนแปลงตั้งแต่นั้นมา ข้อมูลบัฟเฟอร์ซ็อกเก็ตส่วนใหญ่จะถูกเก็บไว้ในโครงสร้างที่เรียกว่า sk_buffซึ่งเป็นโครงสร้าง linux ที่เก็บพอยน์เตอร์ไว้ที่จุดจับซ็อกเก็ต TCP รวมถึงบัฟเฟอร์อ่าน / เขียนซ็อกเก็ตทั้งหมด

เนื่องจากไดรเวอร์ linux NIC ได้รับข้อมูลจาก NIC บนซ็อกเก็ตที่กำหนดมันจะค้นหาพื้นที่บัฟเฟอร์ออกจาก sk_buff อินสแตนซ์ (ชื่อ skb ) และทิ้งข้อมูลลงในบัฟเฟอร์ที่ชี้โดย skb.

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