36-წუთიანი სამუშაო სესია იმაზე, თუ რა ხდება სინამდვილეში, როცა ბმულს დააჭერთ — შრეები, IP და TCP vs UDP, DNS, TLS, HTTP-ის ვერსიები, შუაში მდგარი ყუთები (დატვირთვის ბალანსერები, პროქსები, CDN-ები) და ინსტრუმენტები, რომლებითაც ამ ყველაფრის დებაგი შეიძლება, როცა რამე გაფუჭდება.
ინტერნეტი არავის დაუპროექტებია ერთ გიგანტურ პროგრამად. ეს არის შრეების სტეკი, სადაც თითოეული ერთ საქმეს აგვარებს და დანარჩენს ქვემოთ გადასცემს. თქვენი აპლიკაცია ამბობს "გააგზავნე ეს ტექსტი"; კაბელში ძაბვა მას არასდროს აღელვებს. სტეკის გაგება დებაგის საუკეთესო რუკაა: როცა რაღაც ფუჭდება, შეგიძლიათ იკითხოთ — რომელი შრე.
გაიგონებთ OSI-ის 7-შრიან მოდელზეც — ეს უფრო ძველი სასწავლო დიაგრამაა. დღემდე ამბობენ "Layer 4 დატვირთვის ბალანსერი" (ტრანსპორტი) ან "Layer 7" (აპლიკაცია); ეს ციფრები OSI-დან მოდის.
გასაგზავნად თქვენი მონაცემები სტეკში ქვევით მიდის; მეორე მანქანაზე კი უკან ზევით ადის.
ინკაფსულაცია: თითოეული შრე ზემოთ მდგომს თავის ჰედერში ახვევს — როგორც წერილი კონვერტში, კონვერტი ტომარაში, ტომარა კი მანქანაში.
ჰგავს ამანათის გაგზავნას: თქვენ წერილს წერთ, კურიერი დაუმატებს გასაგზავნ ეტიკეტს, საწყობი კი — მარშრუტს; თითოეული შრე ენდობა ქვედას, რომ ის მიიტანს.
IP მისამართი შენობის მისამართივითაა; პორტი კი — ბინის ნომერი მასში. ერთად ისინი ერთ გაშვებულ პროგრამაზე მიგვითითებენ. ამის თავზე ირჩევთ ტრანსპორტს: TCP, როცა ყველა ბაიტი თანმიმდევრობით უნდა მივიდეს, და UDP, როცა სიჩქარე სისრულეს სჯობს.
93.184.216.34 (დაახლოებით 4.3 მილიარდი შესაძლო — ახლა უკვე მწირია, ამიტომ NAT-ით ვინაწილებთ). IPv6 ასეთია: 2606:2800:220:1::1 და პრაქტიკულად ულიმიტო ადგილი აქვს. პორტი არის რიცხვი 0-დან 65535-მდე, რომელიც ამბობს, მანქანაზე რომელმა პროგრამამ უნდა მიიღოს მონაცემები.HTTP — ჩვეულებრივი ვებ ტრაფიკი.
HTTPS — დაშიფრული ვებ ტრაფიკი.
DNS — სახელების ძებნა.
SSH — დაშორებული შელი.
სანამ მონაცემები წავა, TCP აკეთებს სამბიჯიან handshake-ს, რომ საუბარზე შეთანხმდნენ. შემდეგ თითოეულ ნაწილს ნომრავს, ელოდება დადასტურებებს, თავიდან აგზავნის დაკარგულს და ანელებს, როცა ქსელი გადატვირთულია — ასე თქვენი ბაიტები სრულად და თანმიმდევრობით მიდის.
სამი შეტყობინება აწყობს კავშირს — ერთი სრული შემოვლა რეალური მონაცემების პირველ ბაიტამდე.
ცერის წესი: აირჩიეთ TCP, როცა დაკარგული მონაცემი შედეგს აფუჭებს (ვებ გვერდი, საბანკო გადარიცხვა). აირჩიეთ UDP, როცა დაძველებული მონაცემი მაინც უსარგებლოა და ლოდინს წინსვლა გირჩევნიათ (ორი წამის წინანდელი ხმოვანი პაკეტი ვერავის უშველის).
თქვენ გახსოვთ example.com; მანქანები კი ციფრებით მიდიან, როგორიცაა 93.184.216.34. DNS არის სერვისი, რომელიც ერთს მეორედ თარგმნის — და რადგან ეს ძებნა ყოველი ახალი კავშირის წინ ხდება, აგრესიულად ქეშირდება, რომ ყველაზე ნელი ნაბიჯი არ გახდეს.
example.com) აქცევს IP მისამართად, რომელიც პაკეტს სჭირდება. წარმოიდგინეთ, რომ ტელეფონში კონტაქტი სახელით გაქვთ შენახული: აჭერთ "დედას" და ტელეფონი ნომერს კრეფს. DNS იმავე ძებნას აკეთებს ყოველი დომენისთვის, რომელსაც სტუმრობთ.რეზოლვერი იერარქიას გადის: root → .com → დომენის საკუთარი სერვერი, შემდეგ კი მისამართს გაწვდით.
1.1.1.1 / 8.8.8.8).A სახელს IPv4 მისამართს უსადაგებს; AAAA კი — IPv6-ს. ძირითადი ძებნა.
ერთ სახელს მეორეზე მიუთითებს (www → example.com). ერთი კანონიკური სამიზნე, ბევრი ფსევდონიმი.
ამბობს, რომელი სერვერები იღებენ დომენის ელფოსტას. TXT თავისუფალ ტექსტს ინახავს (SPF, დომენის დადასტურება).
Time To Live, წამებში — რამდენ ხანს შეიძლება იყოს ჩანაწერი ქეშში, სანამ ხელახლა მოძებნა დასჭირდება.
S სიტყვაში HTTPS არის TLS, რომელიც ერთდროულად სამ საქმეს აკეთებს: შიფრავს ტრაფიკს, რომ მოსმენისას მხოლოდ უაზრობა ჩანდეს, ამოწმებს მთლიანობას, რომ გზაში არაფერი შეცვლილიყო, და ადასტურებს, რომ ნამდვილად სწორ სერვერს ესაუბრებით და არა თაღლითს.
TLS 1.3 დაცულ არხს ერთი შემოვლით აწყობს და შემდეგ ყოველი ბაიტი დაშიფრულია.
ECDHE-ით) და სწრაფ სიმეტრიულ დაშიფვრაზე გადადის.ღია Wi-Fi-ზე პაკეტების ჩაჭერა ნებისმიერს შეუძლია. TLS-თან ერთად ისინი მხოლოდ შიფრტექსტს იჭერენ — გასაღების გარეშე უსარგებლოს.
თითოეულ შეტყობინებას თან ახლავს ტეგი, ამიტომ გზაში ნებისმიერი ცვლილება (ჩაშენებული რეკლამა, შებრუნებული ბიტი) აღმოჩნდება და უარყოფილი იქნება.
სერტიფიკატი ადასტურებს, რომ სერვერს დომენი ეკუთვნის — ასე პაროლს თაღლითს არ გადასცემთ.
საინტერესოა: handshake ნელ ასიმეტრიულ კრიპტოგრაფიას მხოლოდ იმდენ ხანს იყენებს, რამდენიც საერთო გასაღებზე შესათანხმებლად სჭირდება, შემდეგ კი ძირითადი მონაცემებისთვის სწრაფ სიმეტრიულ კრიპტოგრაფიაზე გადადის — ორივეს საუკეთესო მხარე. უფასო, ავტომატური სერტიფიკატები (მაგალითად Let's Encrypt) არის მიზეზი, რის გამოც HTTPS დღეს ვებში ნაგულისხმევია.
HTTP ვების ენაა — თავიდან ბოლომდე იგივე ზმნები (GET, POST). ვერსიებს შორის შეიცვალა ის, როგორ გადაიტანება ბაიტები, და ყოველმა ნაბიჯმა ლოდინის ერთი წყარო მოხსნა.
ერთი მოთხოვნა სრულდება მეორის დაწყებამდე. ბრაუზერები ~6 კავშირს ხსნიდნენ პარალელურობის მისაბაძად.
ბევრი ნაკადი ერთ კავშირს იზიარებს (მულტიპლექსირება) — მაგრამ TCP-ის დანაკარგი მაინც ყველას აჩერებს.
ნაკადები დამოუკიდებელია, ამიტომ ერთი დანაკარგი დანარჩენებს ვერ ბლოკავს — აწყობა კი ერთი გაერთიანებული handshake-ია.
ადამიანისთვის წასაკითხი ტექსტური მოთხოვნები TCP კავშირზე, რომელიც ღია რჩება (keep-alive). მაგრამ ერთი კავშირი ერთ მოთხოვნას ამუშავებს, ამიტომ ნელი პასუხი რიგს ბლოკავს. შემოვლა იყო რამდენიმე კავშირის პარალელურად გახსნა — ფლანგვა, მაგრამ ორ ათწლეულს გაუძლო.
გადადის კომპაქტურ ბინარულ ფორმატზე და ბევრ მოთხოვნას ერთ კავშირზე გადაწნულ ნაკადებად ამულტიპლექსირებს, პლუს ჰედერების შეკუმშვა (HPACK). ხაფანგი: ყველაფერი მაინც ერთ TCP კავშირზე მიდის, ამიტომ ერთი დაკარგული პაკეტი ყველა ნაკადს აჩერებს — TCP-ის დონის head-of-line blocking.
TCP-ს თმობს QUIC-ის სასარგებლოდ — ეს UDP-ზე აგებული ტრანსპორტია, რომელიც ნაკადებს დამოუკიდებლად ინახავს: დაკარგული პაკეტი მხოლოდ თავის ნაკადს აჩერებს. TLS 1.3 ჩაშენებულია, ამიტომ ტრანსპორტისა და დაშიფვრის handshake-ები ერთდება (ხშირად ერთ შემოვლაში) და კავშირს შეუძლია ქსელის შეცვლას გადაურჩეს (Wi-Fi → მობილური) ხელახლა დაკავშირების გარეშე.
რეალურ სისტემებში იშვიათად ესაუბრება ერთი კლიენტი ერთ სერვერს. შუაში დგას რამდენიმე სტანდარტული შუამავალი — დატვირთვის ბალანსერი, რომ ტრაფიკი გაანაწილოს, პროქსები, რომ წინ ან უკან იდგნენ, და CDN, რომ კონტენტი მომხმარებელთან ახლოდან მიაწოდოს. იგივე სამშენებლო ბლოკები, სხვადასხვა საქმე.
ქეშირებული სტატიკური კონტენტი CDN-ის edge-იდან მიეწოდება; დანარჩენი ყველაფერი დატვირთვის ბალანსერამდე მიდის, რომელიც მას სერვერებზე ანაწილებს.
როგორ ავირჩიო: უკვე AWS-ზე ხართ → CloudFront; გინდათ მაქსიმალური მზა უსაფრთხოება და უფასო დასაწყისი → Cloudflare; გჭირდებათ ქეშირების ზუსტი კონტროლი და მყისიერი გასუფთავება → Fastly.
შრეებად დაყოფილი მოდელი სწორედ აქ იხდის თავს: თითოეული ინსტრუმენტი კონკრეტულ შრეს ამოწმებს. იმუშავეთ ზემოდან ქვევით ან ქვევიდან ზემოთ, მაგრამ ჯერ შრე გამოყავით — ეს "საიტი არ მუშაობს"-ს ისეთ კითხვად აქცევს, რომელსაც რეალურად უპასუხებთ.
დაიწყეთ აქედან, როცა სახელი არ იხსნება ან ძველ ადგილას მიუთითებს. dig გაჩვენებთ ჩანაწერს, მის TTL-ს და რომელმა სერვერმა უპასუხა. nslookup უფრო მარტივი, კროსპლატფორმული ბიძაშვილია.
აპლიკაციის შრის სამუშაო ცხენი: სტატუს-კოდები, ჰედერები, გადამისამართებები, TLS-ის დეტალები, თვით შეთანხმებული HTTP-ის ვერსიაც. თუ dig წესრიგშია, გვერდი კი — არა, შემდეგი გაჩერება curl-ია.
ხაზავს პაკეტების მარშრუტს და აჩვენებს, სად ჩნდება შეყოვნება ან დანაკარგი. mtr traceroute-ს მუდმივ ping-თან აერთიანებს, ასე რომ არასტაბილურ ნახტომს დროთა განმავლობაში დაინახავთ — იდეალურია "ზოგჯერ ნელია"-სთვის.
ყველაზე ღრმა ხედი: ჩაწერეთ ნედლი პაკეტები და წაიკითხეთ. tcpdump მათ ბრძანების ხაზზე იჭერს; Wireshark კი მდიდარ ინტერფეისს გაძლევთ handshake-ების, ხელახალი გაგზავნებისა და reset-ების გასაშლელად. უკანასკნელი საშუალება, როცა უფრო მაღალი დონის ინსტრუმენტები ვერ ხსნიან.
dig — დომენი იმ IP-ზე იხსნება, რომელსაც ელოდებით?traceroute/mtr — პაკეტები ჰოსტამდე აღწევს და სად ჩერდება?curl -v — სწორი სტატუსი, ჰედერები, სერტიფიკატი, HTTP-ის ვერსია?tcpdump + Wireshark — წაიკითხეთ თავად პაკეტები.ხუთი სწრაფი კითხვა შრეებზე, ტრანსპორტზე, DNS-ზე, TLS-სა და HTTP-ის ვერსიებზე — მყისიერი პასუხი, შესვლის გარეშე.
ნავიგაცია ← → ღილაკებით ან სქროლით · უკან ბიბლიოთეკაში