Sobes.tech
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
// ...პარალელურად გადაეცემა ერთ კავშირზე