1-bo‘lim
Tarmoq nima va u qayerdan kelgan?
Paket kommutatsiyasi g'oyasi, ARPANET, TCP/IP ni kim yaratgani va ikki dastur qanday qilib bir-biri bilan gaplashadi.
Ushbu bo‘lim mundarijasi
Brauzerga softromeda.com deb yozib Enter bosasiz. Yarim soniya
o'tmay sahifa ochiladi. Shu yarim soniya ichida o'nlab protokol
ishga tushadi, ma'lumot mingdan ortiq kilometr yo'l bosadi va
o'nlab qurilmadan o'tadi.
Bu darslik o'sha yo'lni bosqichma-bosqich ochib beradi.
Tarmoq - bu kelishuv #
Ikki kompyuterni sim bilan ulash - bu hali tarmoq emas. Ular bir-birini tushunishi kerak: kim qachon gapiradi, xabar qayerda boshlanib qayerda tugaydi, xato bo'lsa nima qilinadi.
Shu kelishuvlar to'plami protokol deb ataladi.
Yunoncha protokollon - qo'lyozma o'ramining birinchi yopishtirilgan varag'i. Unda o'ramning mazmuni yozilar edi.
Diplomatiyada bu so'z "qabul qilingan tartib" ma'nosini oldi, tarmoqlarda esa - "ikki tomon oldindan kelishib olgan qoidalar".
Asosiy g'oya: paket kommutatsiyasi #
1960-yillargacha aloqa kanal kommutatsiyasi ustiga qurilgan edi: telefon qilganingizda sizga butun suhbat davomida alohida sim ajratilardi. Gaplashmasangiz ham sim band turardi.
Tarmoqlar uchun boshqa yo'l tanlandi: xabar bo'laklarga bo'linadi, har bo'lak alohida yo'l bilan ketadi va manzilda qayta yig'iladi.
xabar = "Salom Husanboy, bugun soat 14:00 da uchrashamiz."
# Xabar bo'laklarga - paketlarga - bo'linadi
OLCHAM = 12
paketlar = []
for i in range(0, len(xabar), OLCHAM):
paketlar.append({"raqam": len(paketlar), "matn": xabar[i:i + OLCHAM]})
print("paketlar soni:", len(paketlar))
for p in paketlar:
print(f" #{p['raqam']} [{p['matn']}]")
paketlar soni: 4
#0 [Salom Husanb]
#1 [oy, bugun so]
#2 [at 14:00 da ]
#3 [uchrashamiz.]
E'tibor bering: har paketda raqami bor. Aynan shu raqam butun g'oyani ishlaydigan qiladi.
Tartibsiz kelsa nima bo'ladi? #
Paketlar turli yo'ldan ketgani uchun ular jo'natilgan tartibda yetib kelishi shart emas. Raqam bo'lgani uchun bu muammo emas:
xabar = "Salom Husanboy, bugun soat 14:00 da uchrashamiz."
OLCHAM = 12
paketlar = []
for i in range(0, len(xabar), OLCHAM):
paketlar.append({"raqam": len(paketlar), "matn": xabar[i:i + OLCHAM]})
# Paketlar turli yo'llardan ketdi va TARTIBSIZ yetib keldi.
# Aynan shu tartibda kelgan deb faraz qilamiz:
kelish_tartibi = [3, 1, 0, 2]
kelgan = [paketlar[n] for n in kelish_tartibi]
print("--- qabul qiluvchiga yetib kelgan tartib")
for p in kelgan:
print(f" #{p['raqam']} [{p['matn']}]")
# Har paketda raqami bor ekan, tartibni tiklash oson
tartibli = sorted(kelgan, key=lambda p: p["raqam"])
tiklangan = "".join(p["matn"] for p in tartibli)
print("--- tiklangan xabar")
print(" ", tiklangan)
print("asl bilan bir xilmi:", "ha" if tiklangan == xabar else "yoq")
--- qabul qiluvchiga yetib kelgan tartib
#3 [uchrashamiz.]
#1 [oy, bugun so]
#0 [Salom Husanb]
#2 [at 14:00 da ]
--- tiklangan xabar
Salom Husanboy, bugun soat 14:00 da uchrashamiz.
asl bilan bir xilmi: ha
Yuqoridagi o'n qator - 8-bo'limda o'rganadigan TCP protokolining eng soddalashtirilgan modeli.
Haqiqiy TCP bundan tashqari yo'qolgan paketni qayta so'raydi, takrorlanganini tashlaydi va jo'natish tezligini tarmoqqa moslaydi. Lekin markaziy g'oya aynan shu: raqamla va tartibla.
Qisqacha tarix #
Paket g'oyasini ikki odam bir-biridan mustaqil ravishda o'ylab topdi: AQShda Pol Baran (1964) va Britaniyada Donald Devis (1965). Bugun ishlatiladigan "paket" so'zini aynan Devis tanlagan - u kichik, ixcham jo'natmani anglatgani uchun.
1969-yil 29-oktabrda ARPANET da birinchi xabar jo'natildi.
UCLA dan Stenfordga LOGIN so'zi yozilishi kerak edi, lekin
tizim LO dan keyin qulab tushdi. Internet tarixidagi birinchi
xabar shunday qisqa chiqdi.
1970-yillarda bir nechta alohida tarmoq bor edi va ular bir-biri bilan gaplasha olmasdi.
Ularni bog'lash masalasi internetworking deb ataldi - "tarmoqlararo ish". Vaqt o'tib bu so'z qisqarib internet bo'lib qoldi.
Ya'ni "internet" - bu bitta tarmoq emas, tarmoqlar tarmog'i.
TCP/IP ni kim yaratgan? #
Vint Serf (1943-)
TCP/IP ning hammuallifi. 1974-yilda Bob Kan bilan birga "Paket tarmoqlari o'rtasidagi aloqa protokoli" maqolasini chop etdi. O'sha maqolada bugun butun internet ishlatadigan g'oya bayon qilingan.
Uni ko'pincha "internetning otasi" deb atashadi. 2004-yilda Bob Kan bilan birga Tyuring mukofotini oldi.
Serf eshitish qobiliyati cheklangan va uzoq yillar texnologiyani nogironligi bor odamlar uchun ochiq qilish ustida ishlagan.
Bob Kan (1938-)
TCP/IP ning ikkinchi muallifi. ARPANET ning tizim arxitekturasini ishlab chiqqan va 1972-yilda uni jamoatchilikka birinchi bo'lib namoyish etgan.
Aynan u "ochiq arxitektura" tamoyilini ilgari surdi: tarmoq ichki tuzilishini o'zgartirmasdan boshqa tarmoqlarga ulanishi kerak.
Shu tamoyil tufayli bugun Wi-Fi, optik tola va sun'iy yo'ldosh aloqasi - hammasi bitta internetda birga ishlay oladi.
Serf va Kanning maqolasida boshida bitta protokol - TCP - tasvirlangan edi. 1978-yilda u ikkiga bo'lindi:
| Protokol | Vazifasi |
|---|---|
| IP | Paketni manzilga yetkazish (kafolatsiz) |
| TCP | Yetib kelganini, tartibini va butunligini ta'minlash |
Bu ajratish naqadar to'g'ri bo'lganini vaqt ko'rsatdi: bugun video uzatish uchun TCP o'rniga UDP ishlatiladi, lekin IP o'zgarishsiz qolaveradi.
Shu kuni ARPANET eski protokoldan (NCP) TCP/IP ga bir kechada o'tdi. O'tmagan tugunlar shunchaki tarmoqdan uzildi.
Injenerlar "I survived the TCP/IP transition" ("TCP/IP ga o'tishdan omon qoldim") degan nishonlar taqib yurishgan.
Ko'pchilik internetning tug'ilgan kuni deb aynan shu sanani hisoblaydi.
Birinchi tarmoq dasturi #
Nazariya yetar. Quyida ikkita dastur bir-biri bilan gaplashadi - biri server, ikkinchisi mijoz:
import socket
import threading
MANZIL = ("127.0.0.1", 0) # 0 - portni tizim o'zi tanlaydi
def server(tayyor, port_qutisi):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(MANZIL)
s.listen(1)
port_qutisi.append(s.getsockname()[1])
tayyor.set()
ulanish, kim = s.accept()
with ulanish:
malumot = ulanish.recv(1024)
print("server qabul qildi:", malumot.decode())
ulanish.sendall(malumot.upper())
s.close()
tayyor = threading.Event()
port_qutisi = []
threading.Thread(target=server, args=(tayyor, port_qutisi)).start()
tayyor.wait()
mijoz = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mijoz.connect(("127.0.0.1", port_qutisi[0]))
mijoz.sendall("salom tarmoq".encode())
javob = mijoz.recv(1024)
mijoz.close()
print("mijoz javob oldi: ", javob.decode())
server qabul qildi: salom tarmoq
mijoz javob oldi: SALOM TARMOQ
Hozircha har bir qatorni tushunish shart emas. Muhimi shuki, butun internet aynan shu ikki tomondan iborat: kimdir kutadi, kimdir ulanadi.
127.0.0.1 - o'zingizga qaytadigan manzilBu maxsus IP manzil: unga yuborilgan paket tarmoq kartasiga umuman chiqmaydi, operatsion tizim uni darhol o'zingizga qaytaradi.
Uni loopback (qaytuvchi halqa) deb atashadi. Tarmoq dasturini sinash uchun eng qulay yo'l - shu manzil.
Bu darslikdagi deyarli barcha misollar aynan shu yerda ishlaydi, shuning uchun ularni internetsiz ham ishga tushira olasiz.
Tarmoqlar qanday o'lchamda bo'ladi? #
| Nomi | Qamrovi | Misol |
|---|---|---|
| PAN | Bir necha metr | Telefon va simsiz quloqchin |
| LAN | Bino yoki xonadon | Uy Wi-Fi tarmog'i |
| MAN | Shahar | Shahar kabel provayderi |
| WAN | Mamlakat va undan katta | Internet provayderlari magistrali |
Chegara qat'iy emas, lekin farqi muhim: LAN ichida qurilmalar bir-birini to'g'ridan-to'g'ri topa oladi, WAN da esa orada marshrutizatorlar turadi.
Yangi boshlovchilar eng ko'p qiladigan xato - tarmoqni oddiy funksiya chaqiruvi deb o'ylash.
Aslida har bir jo'natishda quyidagilar bo'lishi mumkin:
| Nima bo'lishi mumkin | Qanchalik tez-tez |
|---|---|
| Paket yo'qoladi | Muntazam |
| Paket kechikadi | Muntazam |
| Paket tartibsiz keladi | Tez-tez |
| Paket ikki marta keladi | Kamdan-kam |
| Ulanish o'rtasida uziladi | Har kuni |
Shuning uchun tarmoq kodi har doim xatoni hisobga olib yoziladi. Buni 8-bo'limda batafsil ko'ramiz.
- Yuqoridagi paketlarga bo'lish misolini ishga tushiring.
OLCHAMni 5 ga o'zgartiring - paketlar soni qanday o'zgardi?kelish_tartibini o'zingiz o'zgartiring va natijani tekshiring.- Bitta paketni ro'yxatdan olib tashlang - xabar qanday chiqadi?
- Paket raqamlarini olib tashlab ko'ring va nima buzilishini yozing.
- Mijoz-server misolini ishga tushiring.
malumot.upper()o'rniga boshqa amal qo'ying.- Serverni ishga tushirmasdan mijozni ishlating - qanday xato chiqdi?
- Kanal va paket kommutatsiyasi farqini uch qatorda yozing.
- Uyingizdagi tarmoq LAN mi yoki WAN - javobingizni asoslang.
Xulosa #
- Tarmoq - bu simlar emas, avvalo kelishuvlar (protokollar) to'plami.
- Paket kommutatsiyasi: xabar bo'laklarga bo'linadi, har bo'lak o'z yo'lini topadi.
- Har paketda raqam bor - shuning uchun tartibsiz kelsa ham qayta yig'iladi.
- G'oyani Pol Baran (1964) va Donald Devis (1965) mustaqil o'ylab topgan.
- Birinchi xabar 1969-yilda ARPANET da jo'natilgan va
LOda uzilib qolgan. - Vint Serf va Bob Kan 1974-yilda TCP ni ta'riflagan; 1978-yilda u TCP va IP ga bo'lindi.
- Bugungi internet 1983-yil 1-yanvarda, TCP/IP ga o'tish kuni boshlanadi.
- "Internet" - internetworking dan qisqargan: tarmoqlar tarmog'i.
- Har tarmoq dasturida ikki tomon bor: kutuvchi (server) va ulanuvchi (mijoz).
- Tarmoq ishonchsiz: paket yo'qolishi, kechikishi va takrorlanishi normal hol.
Keyingi bo'limda bu murakkablik qanday qilib qatlamlarga bo'linganini ko'ramiz - OSI va TCP/IP modellari.
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.