9.6. แพ็กเก็ตและการกำหนดเส้นทาง

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

9.6.1. แพ็กเก็ตโดยย่อ

แพ็กเก็ต คือหน่วยงานของเลเยอร์ IP -- กลุ่มไบต์ที่มีส่วนหัวขนาดเล็กและเพย์โหลด ส่วนหัวมีสองฟิลด์ที่สำคัญสำหรับการกำหนดเส้นทาง:

  • ที่อยู่ IP ต้นทาง (แพ็กเก็ตมาจากที่ใด)

  • ที่อยู่ IP ปลายทาง (แพ็กเก็ตกำลังจะไปที่ใด)

เพย์โหลดคือสิ่งที่เลเยอร์การขนส่งขอให้เลเยอร์เครือข่ายส่งมอบ ส่วนหัวของแพ็กเก็ตยังมีตัวนับ time-to-live เชคซัมสำหรับส่วนหัว และแฟล็กควบคุมบางส่วน ไม่มีสิ่งเหล่านี้ที่โค้ด Python ของกล้องสัมผัสโดยตรง

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

9.6.2. กระโดดทีละขั้น

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

A diagram showing five boxes. On the left, a camera labelled "10.0.0.42". Connected to a router labelled "10.0.0.1 / 203.0.113.5". Then a sequence of two unnamed routers in the middle. Then a router labelled "198.51.100.1 / 198.51.100.x". Finally a server labelled "198.51.100.20". An arrow with the label "destination: 198.51.100.20" travels along the chain from left to right.

แพ็กเก็ตจากกล้องไปยังปลายทางกระโดดระหว่างเราเตอร์ แต่ละขั้นใกล้ขึ้นอีกก้าว

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

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

9.6.3. ปลายทางไม่รู้เส้นทาง

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

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

9.6.4. ความหมายสำหรับ Python script

งานของกล้องที่เลเยอร์เครือข่ายลดเหลือเพียง:

  • มีที่อยู่ IP

  • รู้ที่อยู่เกตเวย์เริ่มต้น (DHCP กรอกข้อมูลนี้โดยอัตโนมัติ)

  • ส่งแพ็กเก็ตขาออกที่ระบุ ที่อยู่ IP ใด ๆ ไปยังเกตเวย์นั้นและเชื่อมั่นในส่วนที่เหลือของเส้นทาง

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

เลเยอร์การขนส่งที่ตามมาถือว่าการกำหนดเส้นทางทำงานได้ดี และสร้างความน่าเชื่อถือ ลำดับ และการระบุที่อยู่แบบโปรแกรมต่อโปรแกรมบนพื้นฐานนั้น