5-bo‘lim

Marshrutlash

Marshrutlash jadvali, eng uzun prefiks qoidasi, standart yo'l, TTL va traceroute qanday ishlaydi.

🕑 9 daqiqa o‘qish 📄 866 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Marshrutlash jadvali
  2. Eng uzun prefiks qoidasi
  3. Standart yo'l
  4. TTL - cheksiz aylanishdan himoya
  5. Marshrutlar qayerdan keladi?
  6. Marshrutizator va kalit farqi
  7. Xulosa

Paket 192.168.1.10 dan 93.184.216.34 ga ketyapti. Orada o'nlab qurilma bor va ularning hech biri butun yo'lni bilmaydi.

Har biri faqat bitta savolga javob beradi: keyingi qadam kim?

Marshrutlash jadvali #

Har bir kompyuterda va har bir marshrutizatorda jadval bor. Undagi har qator: "bu tarmoqqa borish uchun - mana bunga ber".

Python
import ipaddress

# Marshrutlash jadvali: (tarmoq, keyingi qadam, interfeys)
JADVAL = [
    ("192.168.1.0/24", None, "eth0"),        # to'g'ridan-to'g'ri ulangan
    ("192.168.2.0/24", "192.168.1.1", "eth0"),
    ("10.0.0.0/8", "192.168.1.1", "eth0"),
    ("10.5.0.0/16", "192.168.1.9", "eth0"),  # aniqroq yo'l
    ("0.0.0.0/0", "192.168.1.1", "eth0"),    # standart yo'l
]


def yol_topish(manzil):
    m = ipaddress.IPv4Address(manzil)
    mos = []
    for tarmoq, keyingi, interfeys in JADVAL:
        t = ipaddress.IPv4Network(tarmoq)
        if m in t:
            mos.append((t.prefixlen, tarmoq, keyingi, interfeys))
    if not mos:
        return None
    # ENG UZUN prefiks yutadi
    return max(mos)


for manzil in ["192.168.1.50", "10.5.7.2", "10.9.0.1", "93.184.216.34"]:
    uzunlik, tarmoq, keyingi, interfeys = yol_topish(manzil)
    qadam = keyingi if keyingi else "to'g'ridan-to'g'ri"
    print(f"{manzil:<15} -> {tarmoq:<15} /{uzunlik:<2} {qadam}")
Natija
192.168.1.50    -> 192.168.1.0/24  /24 to'g'ridan-to'g'ri
10.5.7.2        -> 10.5.0.0/16     /16 192.168.1.9
10.9.0.1        -> 10.0.0.0/8      /8  192.168.1.1
93.184.216.34   -> 0.0.0.0/0       /0  192.168.1.1

Eng uzun prefiks qoidasi #

Diqqat qiling: 10.5.7.2 ikkita qatorga mos keldi - 10.0.0.0/8 ham, 10.5.0.0/16 ham uni o'z ichiga oladi.

Tanlov qoidasi bitta va u juda muhim: eng uzun prefiks yutadi. /16 /8 dan aniqroq, demak u tanlanadi.

10.5.7.2 qayerga boradi? 0.0.0.0/0 butun internet - "boshqa hamma narsa" 10.0.0.0/8 16,7 million manzil 10.5.0.0/16 65 536 manzil - ENG ANIQ Keyingi qadam: 192.168.1.9
Prefiks qancha uzun bo'lsa, yo'l shuncha aniq - va shuning uchun ustun
Nima uchun aynan eng uzun?

Mantiq oddiy: aniqroq bilgan odam haqli.

"Butun 10.x.x.x ni Anvarga bering" - bu umumiy qoida. "Lekin 10.5.x.x ni Malikaga bering" - bu aniqroq ko'rsatma.

Aniqroq ko'rsatma umumiysini bekor qiladi. Xuddi shu qoida tufayli katta tarmoqlarni buzmasdan, ichidan kichik bo'lakni boshqa yo'lga burish mumkin.

Standart yo'l #

Oxirgi qator - 0.0.0.0/0 - alohida diqqatga loyiq. Uning prefiksi nol bit, ya'ni u hamma manzilga mos keladi.

Prefiksi eng qisqa bo'lgani uchun u har doim oxirgi tanlov bo'ladi: boshqa hech narsa mos kelmasa, paket shu yo'ldan ketadi.

Uni standart shlyuz (default gateway) deb atashadi. Uy tarmog'ingizda bu - routeringiz.

Jadvaldagi qatorMa'nosi
192.168.1.0/24 dev eth0Qo'shnilarim - o'zim yetkazaman
10.5.0.0/16 via 192.168.1.9Bu tarmoq uchun maxsus yo'l
0.0.0.0/0 via 192.168.1.1Qolgan hamma narsa - routerga
O'z jadvalingizni ko'ring

Linux va macOS da:

Terminal
ip route

Windows da:

Terminal
route print

default via ... deb boshlanadigan qator - aynan sizning standart shlyuzingiz. Internet ishlamay qolganda birinchi tekshiriladigan narsa - shu qator bormi.

TTL - cheksiz aylanishdan himoya #

Marshrutlash jadvallari noto'g'ri sozlansa, paket halqa ichiga tushib qolishi mumkin: A B ga yuboradi, B A ga qaytaradi, va hokazo.

Buning oldini olish uchun har IP paketda TTL (*time to live*) maydoni bor. Har marshrutizator undan bittani ayiradi. Nolga yetsa - paket tashlanadi.

Python
# Har marshrutizator TTL ni bittaga kamaytiradi
YOL = ["uy-routeri", "provayder-1", "magistral", "chet-el-tuguni",
       "manzil-serveri"]


def jonat(ttl):
    print(f"TTL = {ttl} bilan jo'natildi")
    for tugun in YOL:
        ttl -= 1
        if ttl == 0:
            print(f"  {tugun}: TTL tugadi -> paket tashlandi")
            print(f"  {tugun}: ICMP 'vaqt tugadi' javobi qaytariladi")
            return tugun
        print(f"  {tugun}: TTL = {ttl}, uzatildi")
    print("  manzilga yetib bordi")
    return None


# traceroute aynan shunday ishlaydi: TTL ni 1 dan oshirib boradi
for ttl in [1, 2, 3]:
    kim = jonat(ttl)
    print(f"  => {ttl}-qadamdagi qurilma: {kim}")
    print()

jonat(10)
Natija
TTL = 1 bilan jo'natildi
  uy-routeri: TTL tugadi -> paket tashlandi
  uy-routeri: ICMP 'vaqt tugadi' javobi qaytariladi
  => 1-qadamdagi qurilma: uy-routeri

TTL = 2 bilan jo'natildi
  uy-routeri: TTL = 1, uzatildi
  provayder-1: TTL tugadi -> paket tashlandi
  provayder-1: ICMP 'vaqt tugadi' javobi qaytariladi
  => 2-qadamdagi qurilma: provayder-1

TTL = 3 bilan jo'natildi
  uy-routeri: TTL = 2, uzatildi
  provayder-1: TTL = 1, uzatildi
  magistral: TTL tugadi -> paket tashlandi
  magistral: ICMP 'vaqt tugadi' javobi qaytariladi
  => 3-qadamdagi qurilma: magistral

TTL = 10 bilan jo'natildi
  uy-routeri: TTL = 9, uzatildi
  provayder-1: TTL = 8, uzatildi
  magistral: TTL = 7, uzatildi
  chet-el-tuguni: TTL = 6, uzatildi
  manzil-serveri: TTL = 5, uzatildi
  manzilga yetib bordi
traceroute ning butun siri - shu yerda

E'tibor bering: TTL ni 1, 2, 3 deb oshirib borsak, har safar yo'ldagi navbatdagi qurilma javob beradi.

traceroute (Windows da tracert) aynan shundan foydalanadi. Uning hech qanday sehri yo'q - u shunchaki TTL ni oshirib, kim shikoyat qilganini yozib boradi:

Terminal
traceroute softromeda.com

Ba'zi qatorlarda * * * chiqadi - bu qurilma ICMP javobini o'chirib qo'ygani, paket yo'qolgani emas.

Marshrutlar qayerdan keladi? #

TuriKim qo'shadiMisol
Bevosita ulanganOT o'ziSizning /24 tarmog'ingiz
StatikAdministrator qo'lda10.5.0.0/16 via ...
DinamikProtokol avtomatikOSPF, BGP

Uy tarmog'ida hammasi oddiy: ikkita qator yetadi. Internet magistralida esa jadvalda 900 mingdan ortiq qator bo'ladi va u doimiy o'zgarib turadi.

Bunday jadvallarni qo'lda yozib bo'lmaydi - shuning uchun marshrutizatorlar bir-biri bilan gaplashib, yo'llarni almashadi. Internet miqyosida bu ish BGP protokoli orqali bajariladi.

BGP - internetning eng nozik joyi

BGP da marshrutizator "men falon tarmoqqa yo'l bilaman" deb e'lon qiladi va qo'shnilari unga ishonadi.

Natijada xato (yoki qasddan qilingan) e'lon butun mamlakat trafigini boshqa tomonga burib yuborishi mumkin. Bunday hodisalar haqiqatan bir necha marta sodir bo'lgan.

Buni BGP hijacking deb atashadi. Himoya sekin joriy qilinmoqda: marshrut e'lonlarini imzolash tizimlari (RPKI) shular jumlasidan.

Yana bir bor: pastki qatlam ishonchsiz bo'lsa, himoya yuqorida quriladi. TLS shuning uchun ham kerak.

Marshrutizator va kalit farqi #

Kalit (switch)Marshrutizator (router)
Qaysi qatlam2 - kanal3 - tarmoq
Nimaga qaraydiMAC manzilIP manzil
Qayerda ishlaydiBitta tarmoq ichidaTarmoqlar orasida
TTL ni kamaytiradimiYo'qHa
Tarqatishni uzatadimiHaYo'q

Oxirgi qator muhim: marshrutizator tarqatish paketlarini o'tkazmaydi. Aynan shuning uchun ARP faqat bitta tarmoq ichida ishlaydi.

Uydagi "router" qutisi aslida bir necha qurilma bir tanada: marshrutizator, kalit, Wi-Fi nuqtasi va ko'pincha modem.

Amaliy topshiriq
  1. Marshrutlash misolini ishga tushiring.
  2. Jadvalga 10.5.7.0/24 qatorini qo'shing - 10.5.7.2 qayerga ketdi?
  3. Standart yo'lni jadvaldan olib tashlang va 93.184.216.34 ni sinang.
  4. yol_topish ni None qaytargan holatni to'g'ri ishlaydigan qiling.
  5. O'z kompyuteringizda ip route yoki route print ni ishga tushiring.
  6. Standart shlyuzingiz manzilini yozib oling.
  7. TTL misolini ishga tushiring va YOL ga yana ikkita tugun qo'shing.
  8. traceroute ni biror saytga ishlating va nechta qadam chiqqanini sanang.
  9. * * * qatorlar nimani anglatishini tushuntiring.
  10. Kalit va marshrutizator farqini uch qatorda yozing.

Xulosa #

  • Hech bir qurilma butun yo'lni bilmaydi - har biri faqat keyingi qadamni biladi.
  • Marshrutlash jadvali: qaysi tarmoq uchun kimga berish kerak.
  • Bir necha qator mos kelsa - eng uzun prefiks yutadi.
  • 0.0.0.0/0 - standart yo'l, prefiksi eng qisqa, shuning uchun oxirgi tanlov.
  • Standart yo'lning keyingi qadami - standart shlyuz, uydagi routeringiz.
  • TTL har qadamda bittaga kamayadi va nolga yetganda paket tashlanadi.
  • traceroute TTL ni 1 dan oshirib borib, yo'ldagi qurilmalarni topadi.
  • Marshrutlar uch xil: bevosita ulangan, statik va dinamik (BGP, OSPF).
  • Internet magistralidagi jadvalda 900 mingdan ortiq qator bor.
  • Marshrutizator tarqatish paketlarini o'tkazmaydi - shuning uchun ARP faqat LAN ichida ishlaydi.

Keyingi bo'limda IPv4 manzillari nima uchun tugaganini va IPv6 ularni qanday almashtirayotganini ko'ramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.