Junior
გვითხარით HTTP ვერსიებსა და მათ განსხვავებებზე.
sobes.tech AI
პასუხი AI-სგან
ძირითადი HTTP ვერსიები:
- HTTP/0.9: მარტივი ვერსია HTML დოკუმენტების ტრანსფერისთვის. მხოლოდ
GETმეთოდი იყო მხარდაჭერილი, არ იყო ჰედერები, პასუხის სტატუსები. - HTTP/1.0: დაემატა ჰედერების მხარდაჭერა (Content-Type, User-Agent),
POSTდაHEADმეთოდები, პასუხის სტატუსები. კავშირი იკეტებოდა ყოველი მოთხოვნის/პასუხის შემდეგ. - HTTP/1.1: მნიშვნელოვანი გაუმჯობესებები:
- მუდმივი კავშირები (Persistent Connections) - TCP კავშირის გადამეორება რამდენიმე მოთხოვნისთვის.
- პაიპლაინინგი (Pipelining) - რამდენიმე მოთხოვნის გამოგზავნა პასუხის მოლოდინის გარეშე (თუმცა ცუდად არის განხორციელებული და იშვიათად გამოიყენება).
- ვირტუალური ჰოსტები (Host header).
- ნაწილობრივი GET მოთხოვნები (Range header).
- ქეშირება (Cache-Control, ETag, Last-Modified).
- მეთოდები PUT და DELETE.
- HTTP/2: Google-ის SPDY-ზე დაფუძნებული პროტოკოლი. ძირითადი განსხვავებები:
- ბინარული პროტოკოლი ტექსტის ნაცვლად - უფრო ეფექტიანი პარსინგი.
- მულტიპლექსირება (Multiplexing) - პარალელური მოთხოვნების/პასუხების გადაცემა ერთ TCP კავშირზე. ამცირებს "head-of-line blocking" პრობლემას HTTP/1.1 pipelining-ში.
- ჰედერების კოაბინირება (HPACK) - გადაცემული მონაცემების ზომის შემცირება.
- პრიორიტეტი (Server Push) - სერვერი შეუძლია წინასწარ გაუგზავნოს რესურსები, რომლებიც სავარაუდოდ, საჭიროა მომხმარებლისთვის, სანამ ის მოითხოვს.
- HTTP/3: დაფუძნებულია UDP-ზე (QUIC-ის გამოყენებით) TCP-ის ნაცვლად. მიზნად ისახავს შესრულების გაუმჯობესებას, განსაკუთრებით არასაიმედო ქსელებში:
- "head-of-line blocking" აღმოფხვრა TCP კავშირის დონეზე. თუ TCP-ში ერთი პაკეტი დაკარგულია, ყველა შემდეგი პაკეტი ბლოკირდება მის გადაგზავნამდე. QUIC-ში (და HTTP/3-ში) ბლოკირდება მხოლოდ დაკარგული პაკეტს მფლობელი ნაკადი.
- სწრაფი კავშირის დამყარება (0-RTT ან 1-RTT).
- QUIC-ის აქვს თავისი კონტროლის მექანიზმები და საიმედოობა.
ძირითადი განსხვავებები ცხრილში:
| ფუნქცია | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| პროტოკოლი | TCP | TCP | TCP | UDP (QUIC) |
| ფორმატი | ტექსტური | ტექსტური | ბინარული | ბინარული |
| კავშირი დეფოლტად | მოკლევადიანი | მუდმივი | მუდმივი (მულტიპლექსინგი) | მუდმივი (QUIC ნაკადები) |
| მულტიპლექსირება | არა | იმიტაცია (Pipelining) | დიახ | დიახ |
| ჰედერების კოაბინირება | არა | არა | HPACK | QPACK (QUIC-ში) |
| სერვერის გადმოწევა | არა | არა | დიახ | დიახ |
| HOL ბლოკირება (TCP) | დიახ (მოთხოვნის დონეზე) | დიახ (მოთხოვნის დონეზე) | დიახ (კავშირის დონეზე) | არა (ნაკადის დონეზე) |
HTTP/1.1-ის მოთხოვნის მაგალითი:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: curl/7.64.1
Accept: */*
HTTP/2-ის (კონცეპტუალურად, ბინარული) მოთხოვნის მაგალითი:
// მოთხოვნა 1: /index.html-ის მიღება
// :method = GET
// :path = /index.html
// :authority = www.example.com
// მოთხოვნა 2: /style.css-ის მიღება
// :method = GET
// :path = /style.css
// :authority = www.example.com
// ...პარალელურად გადაეცემა ერთ კავშირზე