17-Mauvzu: Socketni ishlab chiqarish .
Reja:
1. Soket tushunchasi
2. Socket interfeysi
3. WebSocket
Soket ( inglizcha socket -
soket)
- jarayonlar o'rtasida
ma'lumotlar
almashinuvi
uchun dasturiy
ta'minot
interfeysi nomi . Bunday
almashinuv
jarayonlari
bitta kompyuterda ham , tarmoqqa ulangan turli kompyuterlarda ham bajarilishi mumkin . Soket
- bu ulanishning oxirgi nuqtasini ifodalovchi mavhum ob'ekt.
Mijoz va server rozetkalari o'rtasida
farq
bo'lishi
kerak . Mijoz
rozetkalarini
taxminan telefon tarmog'ining oxirgi qurilmalari bilan, server rozetkalarini esa - kalitlarga
solishtirish mumkin . Mijoz ilovasi (masalan, brauzer ) faqat mijoz rozetkalarini ishlatadi va
server ilovasi
( masalan, brauzer
so'rov
yuboradigan veb
-server ) mijoz
va
server
rozetkalarini ishlatadi .
Socket
interfeysi
birinchi
paydo BSD
UNIX . Soket dasturlash
interfeysi POSIX .1 standartida tasvirlangan va ma'lum darajada barcha zamonaviy operatsion
tizimlar tomonidan qo'llab -quvvatlanadi .
TCP / IP protokoli yordamida mashinalar orasidagi aloqa uchun manzillar va portlar
ishlatiladi. Manzil IPv4 uchun 32 bitli, IPv6 uchun 128 bitli . Port raqami 0 dan 65535 gacha
bo'lgan butun sondir ( TCP uchun ).
Bu juftlik rozetkani ( manzil va portga mos keladigan "rozetka") belgilaydi .
Ayirboshlash jarayonida, qoida tariqasida, ikkita rozetka ishlatiladi - jo'natuvchi va qabul
qiluvchi rozetkasi. Masalan, HTTP portidagi serverga kirganda , rozetka shunday ko'rinadi:
194.106.118.30:80 va javob mmm.nnn.ppp.qqq: xxxxx ga o'tadi.
Har bir jarayon bir "tinglash" soket (server soket) yaratib mumkin bog'lamoq uni
ba'zi operatsion tizimi portiga (haqida UNIX, sharafi yükseltilmemiş jarayonlar 1024 kamroq
portlar foydalana olmaysiz).
Tinglash jarayoni odatda kutish davrasida bo'ladi, ya'ni yangi aloqa paydo bo'lganda
uyg'onadi. Shu bilan birga, hozirgi vaqtda ulanishlar mavjudligini tekshirish, operatsiya uchun
vaqt tugashini o'rnatish va h.k.
Har bir rozetkaning o'z manzili bor. UNIX-ga asoslangan operatsion tizimlar ko'p turdagi
manzillarni qo'llab-quvvatlay oladi, lekin INET manzili va UNIX manzili talab qilinadi . Agar siz
rozetkani UNIX manziliga bog'lab qo'ysangiz , ko'rsatilgan yo'l bo'ylab maxsus fayl ( rozetka
fayli ) yaratiladi , u orqali har qanday mahalliy jarayonlar undan o'qish / yozish orqali aloqa
o'rnatishi mumkin (qarang: Unix domen soketi ). INET rozetkalari tarmoqqa ulanadi va port
raqamlarini taqsimlashni talab qiladi.
Odatda, mijoz tinglovchiga aniq "biriktiradi", shundan so'ng har qanday fayl
deskriptori orqali o'qish yoki yozish u bilan server o'rtasida ma'lumotlarni uzatadi.
WebSocket - bu brauzer va veb -server o'rtasida real vaqtda xabarlar almashish uchun
mo'ljallangan TCP ulanishi orqali aloqa protokoli .
W3C hozirda Web Sockets API -ni standartlashtirmoqda. Ushbu protokol standarti
loyihasi IETF tomonidan tasdiqlangan .
WebSocket veb -brauzerlar va veb -serverlarda qo'llanilishi uchun mo'ljallangan, lekin uni
har qanday mijoz yoki server ilovasi uchun ishlatish mumkin. WebSocket protokoli TCP
protokoliga asoslangan mustaqil protokoldir. Bu brauzer va veb-sayt o'rtasida yanada yaqinroq
aloqada bo'lishga, interaktiv tarkibni tarqatishga va real vaqtda ilovalarni yaratishga imkon beradi.
Mijoz va server WebSocket ulanishini o'rnatish uchun HTTP protokoliga o'xshash
protokoldan foydalanadilar . Mijoz maxsus HTTP so'rovini yuboradi, unga server o'ziga xos tarzda
javob beradi.
75 -protokol [ tahrir | kodni tahrirlash ]
75 -protokol loyihasidan oldin WebSocket ulanishi quyidagicha o'rnatildi. Mijoz so'rovi:
Get / demo HTTP / 1.1
Yangilash: WebSocket
Ulanish: yangilash
Xost: example.com
Kelib chiqishi: http://example.com
WebSocket protokoli: namuna
WebSocket -ga o'tishni tasdiqlovchi server javobi:
HTTP / 1.1 101 Veb -soket protokoli bilan qo'l siqish
Yangilash: WebSocket
Ulanish: yangilash
WebSocket-ning kelib chiqishi: http://example.com
WebSocket-manzil: ws: //example.com/demo
WebSocket protokoli: namuna
Javob yuborilgandan so'ng, WebSocket aloqasi o'rnatilgan deb hisoblanadi, mijoz va server
bir xil TCP ulanishi orqali ikki tomonlama xabar almashishni boshlashi mumkin . Matnli xabar
yuborish uchun ( UTF-8 da kodlangan ) undan oldin nol bayt, keyin esa 255 qiymatli bayt
uzatilishi kerak.
76 -protokol [ tahrir | kodni tahrirlash ]
2010 yil 2 -iyunda WebSocket protokoliga moslik saqlanmagan holda WebSocket ulanishini
o'rnatish tartibini o'zgartirish uchun o'zgartirishlar kiritildi. Yilda 76 loyihasi WebSocket protokol
nashri, spoof so'rovlar qarshi himoya qo'shildi. Yangi sxemani qo'llab -quvvatlovchi mijoz
quyidagi talabni qo'yadi:
Get / demo HTTP / 1.1
Yangilash: WebSocket
Ulanish: yangilash
Sec-WebSocket-Key2: 4 @ 1 46546xW% 0l 1 5
Xost: example.com
Sec-WebSocket-Key1: 12998 5 Y3 1 .P00
Kelib chiqishi: http://example.com
WebSocket protokoli: namuna
^ n: ds [4U
So'rovga "Sec-WebSocket-Key1" va "Sec-WebSocket-Key2" yangi sarlavhalari va 8 baytli
so'rovlar tanasi qo'shildi. Ularning barchasi mijoz tomonidan tasodifiy ravishda yaratilgan.
WebSocket -ga o'tishni tasdiqlovchi server javobi:
HTTP / 1.1 101 Veb -soket protokoli bilan qo'l siqish
Yangilash: WebSocket
Ulanish: yangilash
Sec-WebSocket-ning kelib chiqishi: http://example.com
Sec-WebSocket-Manzil: ws: //example.com/demo
Sec-WebSocket-Protocol: namuna
8jKS'y: G * Co, Wxa-
Javobda yangi sarlavha nomlari ("Sec-WebSocket-Origin", "Sec-WebSocket-Location",
"Sec-WebSocket-Protocol" o'rniga "WebSocket-Origin", "WebSocket-Location", "WebSocket-
Protocol") mavjud. va 16 baytli javob organi, quyidagicha hisoblanadi:
Sec-WebSocket-Key1 so'rov sarlavhasi qiymati ko'rsatilgan qatordan barcha raqamli
bo'lmagan belgilar chiqarib tashlansin ('0' .. '9' oralig'ida emas);
olingan satrni 64 bitli butun songa aylantiring (yuqoridagi misol uchun biz 1299853100
olamiz);
olingan sonni sarlavha qiymati bilan asl satrdagi bo'shliqlar soniga bo'linib, butun songa
bo'linadi;
natijada olingan raqam katta bayt formatida 4 baytli 32 bitli raqam sifatida ko'rsatilgan :
yuqori bayt ofset nolida saqlanadi;
Sec-WebSocket-Key2 sarlavhasi bilan ham xuddi shunday qiling;
4) va 5) bandlardagi raqamlarni 4 baytli qatorlar sifatida talqin qilib, ularni birlashtiring
(ularni bitta qatorga qo'shing) va so'rovlar tanasini mag'lubiyatga qo'shing;
qabul qilingan 16 baytli mag'lubiyatdan MD5 qiymatini hisoblang va bu qiymatni hech
qanday tasvirga aylantirmasdan "qanday bo'lsa, shunday" javob qismiga yozing;
Eslatmalar.
HTTP protokoli so'rovlari va javoblariga yangi so'rovlar va javoblarning "o'xshashligiga"
qaramay , ular unday emas. Masalan, so'rovning tanasi bor, lekin sarlavhalarda "Kontent uzunligi"
maydoni yo'q (bu HTTP konventsiyalarini buzadi ).
Server tomoni har ikkala turdagi mijozlarni ham qo'llab-quvvatlashi va ularni so'rovda Sec-
WebSocket-Key1 va Sec-WebSocket-Key2 sarlavhalarining mavjudligi yoki yo'qligi bilan farq
qilishi kerak.
Protokol 07 [ tahrir | kodni tahrirlash ]
In versiyasi 07 22 aprel 2011 yil loyihasi protokoli o'zgartirilgan.
Ma'lumotlar
shifrlanmagan [1] uzatiladigan
76-protokoldan
farqli
o'laroq,
protokolning ushbu versiyasida mijozdan (brauzerdan) serverga uzatiladigan ma'lumotlarning har
bir bayti, albatta, 4 baytli niqob bilan maskalanadi [2] . U har bir xabar uchun yangidan yaratiladi.
Yuborilgan xabar endi quyidagi ma'lumotlarni o'z ichiga olgan sarlavhaga ega:
xabar qismlarga bo'linadi;
uzatiladigan ma'lumotlar turi;
Xabar niqoblanganmi yoki yo'qmi
ma'lumotlar hajmi;
niqob;
boshqa nazorat ma'lumotlari (ping, pong ...).
Mijoz va server o'rtasidagi o'zaro munosabatlar mijozning so'rovidan boshlanadi:
Get / chat HTTP / 1.1
Xost: server.example.com
Yangilash: veb -tarmoq
Ulanish: yangilash
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ ==
Sec-WebSocket-ning kelib chiqishi: http://example.com
Sec-WebSocket-Protocol: suhbat, superchat
Sec-WebSocket versiyasi: 7
Server javobi quyidagicha ko'rinadi:
HTTP / 1.1 101 almashtirish protokollari
Yangilash: veb -tarmoq
Ulanish: yangilash
Sec-WebSocket-Qabul qilish: s3pPLMBiTxaQ9kYGzzhZRbK + xOo =
Sec-WebSocket-Protocol: suhbat
Javobda Sec-WebSocket-Protocol sarlavhasi mavjud, u mijoz tomonidan qo'llab-
quvvatlanadigan (chat, superchat) server tomonidan tanlangan yagona protokol (chat). Sec-
WebSocket-Accept sarlavhasi quyidagicha tuziladi:
Sec-WebSocket-Key sarlavhasidan mag'lubiyat qiymatini oling va 258EAFA5-E914-
47DA-95CA-C5AB0DC85B11
qatori
bilan
bog'lang
(berilgan
misolda
siz
dGhlIHNhbXBsZSBub25jZQ == 258EAFA5-E914-47DA-95CD)
birinchi paragrafda olingan satrdan SHA-1 ikkilik xeshini (20 belgidan iborat ikkilik qator)
hisoblang
xashni Base64 da kodlash (s3pPLMBiTxaQ9kYGzzhZRbK + xOo =)
PHP -da yuqoridagi algoritmni bajarishga misol :
php
echo base64_encode ( SHA1 ( "dGhlIHNhbXBsZSBub25jZQ == 258EAFA5-E914-
47DA-95CA-C5AB0DC85B11" , to'g'ri ));
?>
Do'stlaringiz bilan baham: |