2-bo‘lim
Qatlamlar - OSI va TCP/IP modeli
Nima uchun tarmoq qatlamlarga bo'lingan, OSI ning yetti qatlami, TCP/IP ning to'rt qatlami va ma'lumot qanday o'raladi.
Ushbu bo‘lim mundarijasi
Bir kompyuterdan ikkinchisiga xabar yuborish uchun juda ko'p narsa kerak: elektr signali, qo'shni qurilmani topish, uzoq tarmoqqa yo'l topish, yo'qolgan paketni qayta yuborish, matnni to'g'ri tushunish.
Bularning hammasini bitta dasturga yozib bo'lmaydi. Shuning uchun ular qatlamlarga bo'lingan.
Nima uchun qatlam? #
Qatlamning asosiy foydasi - almashtirish erkinligi. Wi-Fi dan simli tarmoqqa o'tsangiz, brauzeringiz buni sezmaydi ham.
| Qatlam o'zgardi | Yuqoridagilar o'zgaradimi |
|---|---|
| Wi-Fi → Ethernet | Yo'q |
| IPv4 → IPv6 | Deyarli yo'q |
| TCP → UDP | Ha - ilova o'zi hal qiladi |
| HTTP/1.1 → HTTP/2 | Yo'q - pastdagilar bilmaydi |
Har qatlam faqat o'zidan pastdagiga tayanadi va faqat o'zidan yuqoridagiga xizmat qiladi. Pastdagi qatlam qanday ishlashi yuqoridagini umuman qiziqtirmaydi.
Yetti qatlam nima qiladi? #
| # | Nomi | Savolga javob beradi | Misol |
|---|---|---|---|
| 7 | Ilova | Ma'lumot nimani anglatadi? | HTTP, DNS |
| 6 | Taqdimot | Qaysi kodlash, shifrlanganmi? | UTF-8, TLS |
| 5 | Sessiya | Suhbat qachon boshlanib tugaydi? | RPC seanslari |
| 4 | Transport | Qaysi dasturga va ishonchlimi? | TCP, UDP |
| 3 | Tarmoq | Qaysi kompyuterga, qaysi yo'ldan? | IP |
| 2 | Kanal | Qaysi qo'shniga? | Ethernet, Wi-Fi |
| 1 | Fizik | Bit qanday signalga aylanadi? | Mis sim, optika |
OSI modeli 1984-yilda xalqaro standart sifatida qabul qilingan va o'z protokollari to'plamiga ega edi.
Lekin amalda TCP/IP yutdi: u soddaroq, bepul va allaqachon ishlab turgan edi.
OSI esa atama sifatida qolib ketdi. Injenerlar bugun ham "2-qatlam kaliti" yoki "7-qatlam balanslovchisi" deb gapiradi - garchi ular TCP/IP tarmog'i haqida gapirayotgan bo'lsa ham.
O'rash (inkapsulyatsiya) #
Har qatlam yuqoridan olgan ma'lumotga o'z sarlavhasini qo'shadi va pastga uzatadi. Bu jarayon o'rash deb ataladi.
malumot = b"GET / HTTP/1.1"
# Har qatlam o'z sarlavhasini ma'lumotning OLDIGA qo'shadi
tcp = b"[TCP 5000>80]" + malumot
ip = b"[IP 10.0.0.5>93.184.216.34]" + tcp
kadr = b"[ETH aa:bb>cc:dd]" + ip + b"[CRC]"
for nom, bayt in [("ilova", malumot), ("TCP", tcp),
("IP", ip), ("Ethernet", kadr)]:
print(f"{nom:9} {len(bayt):3} bayt")
qoshimcha = len(kadr) - len(malumot)
print()
print("foydali ma'lumot:", len(malumot), "bayt")
print("sarlavhalar: ", qoshimcha, "bayt")
print("sarlavha ulushi: ", f"{qoshimcha * 100 // len(kadr)}%")
print()
print("simdan ketadigan kadr:")
matn = kadr.decode()
for i in range(0, len(matn), 56):
print(" " + matn[i:i + 56])
ilova 14 bayt
TCP 27 bayt
IP 54 bayt
Ethernet 76 bayt
foydali ma'lumot: 14 bayt
sarlavhalar: 62 bayt
sarlavha ulushi: 81%
simdan ketadigan kadr:
[ETH aa:bb>cc:dd][IP 10.0.0.5>93.184.216.34][TCP 5000>80
]GET / HTTP/1.1[CRC]
Oxirgi ikki qator - bu bitta uzluksiz bayt oqimi. Uni o'qish uchun ikkiga bo'ldik, aslida simdan bir butun holda o'tadi.
Bu misolda sarlavhalar 81% ni egalladi, chunki xabar juda kichik edi.
Haqiqiy hayotda ham shunday: Ethernet + IP + TCP sarlavhalari odatda 54 bayt atrofida bo'ladi. Agar siz 1 bayt yuborsangiz, simdan 55 bayt o'tadi.
Aynan shuning uchun kichik paketlarni ko'p yuborish katta paketni bir marta yuborishdan ancha qimmat.
Qabul qiluvchi tomonda hamma narsa teskari boradi: har qatlam o'z sarlavhasini olib tashlaydi va qolganini yuqoriga uzatadi. Buni ochish (dekapsulyatsiya) deyiladi.
Qatlamlarni soketda ko'rish #
Python soketi bir vaqtning o'zida bir necha qatlam haqida ma'lumot beradi:
import socket
PORT = 9100
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("127.0.0.1", PORT))
server.listen(1)
mijoz = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mijoz.connect(("127.0.0.1", PORT))
ulanish, _ = server.accept()
mahalliy = mijoz.getsockname() # mijozning o'z manzili
uzoq = mijoz.getpeername() # u ulangan manzil
print("4. Ilova : matnni biz hal qilamiz - HTTP, SMTP, o'zimizniki")
print("3. Transport: TCP, manzil porti =", uzoq[1])
print(" mijoz porti tizim bergan vaqtinchalik port:",
mahalliy[1] >= 1024)
print("2. Tarmoq : IP", mahalliy[0], "->", uzoq[0])
print("1. Kanal : loopback - haqiqiy tarmoq kartasi ishlatilmaydi")
print()
print("soket oilasi AF_INET (IPv4) mi:", server.family == socket.AF_INET)
print("soket turi SOCK_STREAM (TCP) mi:", server.type == socket.SOCK_STREAM)
mijoz.close()
ulanish.close()
server.close()
4. Ilova : matnni biz hal qilamiz - HTTP, SMTP, o'zimizniki
3. Transport: TCP, manzil porti = 9100
mijoz porti tizim bergan vaqtinchalik port: True
2. Tarmoq : IP 127.0.0.1 -> 127.0.0.1
1. Kanal : loopback - haqiqiy tarmoq kartasi ishlatilmaydi
soket oilasi AF_INET (IPv4) mi: True
soket turi SOCK_STREAM (TCP) mi: True
AF_INET - 3-qatlam tanlovi (IPv4), SOCK_STREAM - 4-qatlam
tanlovi (TCP). Ikkita satr, ikkita qatlam.
Mijozga port raqamini operatsion tizim o'zi beradi va u har ishga tushirishda boshqacha bo'ladi.
Shuning uchun uning aniq qiymati emas, shartning bajarilishi chop etildi: port 1024 dan katta.
Bu darslikdagi barcha misollar shu qoidaga amal qiladi - chiqish har safar bir xil bo'lishi kerak. Aks holda kitobdagi natijani o'zingiznikiga solishtira olmaysiz.
Har qatlamning o'z "paketi" bor #
Bir xil ma'lumot har qatlamda boshqacha ataladi:
| Qatlam | Atamasi | Ichida nima bor |
|---|---|---|
| Ilova | Xabar (message) | Toza ma'lumot |
| Transport | Segment (TCP) / datagramma (UDP) | Port raqamlari |
| Tarmoq | Paket (packet) | IP manzillar |
| Kanal | Kadr (frame) | MAC manzillar |
| Fizik | Bit | Signal |
Suhbatda "paket" so'zi ko'pincha hammasiga nisbatan ishlatiladi. Lekin hujjat yozayotganda aniq atamani tanlash kerak.
Amalda qatlamlar chegarasi ba'zan buziladi va bu har safar muammo tug'diradi:
| Buzilish | Oqibati |
|---|---|
| NAT paket ichidagi portni o'zgartiradi | FTP va SIP buziladi |
| Firewall ilova ma'lumotini o'qiydi | Shifrlansa ishlamay qoladi |
| Ilova IP manzilni o'zi eslab qoladi | Mobil tarmoqda uziladi |
Qoida oddiy: qatlam faqat o'zi bilishi kerak bo'lgan narsani bilsin.
- O'rash misolini ishga tushiring.
malumotni uzunroq matnga almashtiring - sarlavha ulushi qanday o'zgardi?- Sarlavha ulushi 10% dan kam bo'lishi uchun xabar necha bayt bo'lishi kerak?
- Yangi "sessiya" qatlamini qo'shib, sarlavhani yana bitta o'rang.
- Kadrni ochish (dekapsulyatsiya) funksiyasini yozing.
- Soket misolini ishga tushiring va ikki marta taqqoslang.
PORTni 9200 ga o'zgartiring - nima o'zgardi?SOCK_STREAMniSOCK_DGRAMga almashtiring va xatoni yozing.- OSI ning har qatlami uchun bittadan misol yozing.
- Wi-Fi dan simga o'tganda qaysi qatlamlar o'zgarishini ayting.
Xulosa #
- Tarmoq qatlamlarga bo'lingan: har qatlam bitta masalani yechadi.
- Qatlamning foydasi - birini almashtirganda qolganlari o'zgarmaydi.
- OSI - yetti qatlamli nazariy model, atamalar manbai.
- TCP/IP - to'rt qatlamli amaliy model, haqiqiy internet shunga qurilgan.
- O'rash: har qatlam ma'lumot oldiga o'z sarlavhasini qo'shadi.
- Qabul qilishda teskari jarayon - har qatlam o'z sarlavhasini olib tashlaydi.
- Sarlavhalar bepul emas: kichik xabarda ular hajmning ko'p qismini egallaydi.
- Har qatlamda o'z atamasi bor: xabar, segment, paket, kadr, bit.
AF_INETtarmoq qatlamini,SOCK_STREAMtransport qatlamini tanlaydi.- Qatlamlar chegarasini buzgan yechimlar (NAT kabi) keyinchalik muammo tug'diradi.
Keyingi bo'limda eng pastki amaliy qatlamdan boshlaymiz: Ethernet, MAC manzil va ARP.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.