====== HTTP szolgáltatások ======
===== A HTTP alapjai =====
A HTTP (HyperText Transfer Protocol) egy alkalmazás réteg protokoll, amely kliens–szerver modellben működik.
Elsősorban webes erőforrások (HTML, CSS, JS, képek, API válaszok stb.) továbbítására használják.
Alapvető jellemzők:
* Állapotmentes (stateless)
* Kérés-válasz alapú (request–response)
* TCP (HTTP/1.x, HTTP/2) vagy QUIC/UDP (HTTP/3) felett működik
* Szöveges (HTTP/1.x) illetve bináris (HTTP/2, HTTP/3)
===== HTTP működési modell =====
A kommunikáció menete:
- Kliens kapcsolatot nyit a szerverhez
- Kliens HTTP kérést küld
- Szerver HTTP választ küld
- Szerver lezárja a kapcsolatot (HTTP 0.9, HTTP 1.0) vagy nyitva marad ha szükséges (HTTP 1.1, HTTP 2)
===== HTTP protokol verziók =====
==== HTTP/0.9 (1991) ====
A HTTP/0.9 volt a legelső, kísérleti változata a protokollnak, amelyet
Tim Berners-Lee fejlesztett ki a CERN-ben a World Wide Web kezdeti időszakában.
Jellemzői:
* Rendkívül egyszerű
* Csak egyetlen metódus létezett: GET
* Nem léteztek HTTP fejlécek
* Nem volt státuszkód
* Nem volt verziószám a kérésben
A válasz kizárólag HTML tartalom lehet.
=== Kérés ===
# telnet szervernév 80
GET /index.html
=== Válasz ===
A szerver egyszerűen visszaküldi a HTML dokumentumot:
Hello World
A válaszban nincs:
* állapot sor
* fejléc mező
* Content-Type
* Content-Length
=== Korlátok ===
* Nem támogatta a képeket, CSS-t, külön erőforrásokat
* Nem volt hibakezelési mechanizmus
* Nem alkalmas komplex webalkalmazásokhoz
=== Összegzés ===
A HTTP/0.9 egy rendkívül egyszerű, csak GET-et támogató, fejléc nélküli protokoll volt, amely kizárólag HTML dokumentum visszaküldésére szolgált. Ez tekinthető a modern webkommunikáció kiindulópontjának.
==== HTTP/1.0 (1996) ====
=== Jellemzők: ===
* Minden kérés külön TCP kapcsolat
* Nincs alapértelmezett persistent connection
* Egyszerű szöveges protokoll
* Nincs kötelező Host fejléc
=== Problémák: ===
* Sok TCP handshake
* Hosszú késleltetés
* Nem hatékony párhuzamos erőforrás-letöltés
Példa kommunikáció:
Egyszerű kérés felépítése:
$ telnet server 80
Trying N.N.N.N...
Connected to szerver.
Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.1 200 OK
Date: Sun, 15 Feb 2026 03:32:17 GMT
Server: Apache/2
Last-Modified: Tue, 27 Feb 2024 06:32:03 GMT
ETag: "0-612572f2e4ba2"
Accept-Ranges: bytes
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8
Connection closed by foreign host.
==== HTTP/1.1 (1997) ====
=== Fejlesztések: ===
* Persistent connection (Keep-Alive)
* Host header kötelező
* Chunked transfer encoding
* Pipeline támogatás
Példa a hagyományos kapcsolatra:
$ telnet server 80
Trying N.N.N.N...
Connected to server.
Escape character is '^]'.
GET / HTTP/1.1
Host: server
HTTP/1.1 403 Forbidden
Date: Sun, 15 Feb 2026 03:47:36 GMT
Server: Apache/2.4.62 (AlmaLinux)
Last-Modified: Mon, 24 Mar 2025 16:15:24 GMT
ETag: "1680-63118e9567f00"
Accept-Ranges: bytes
Content-Length: 130
Content-Type: text/html; charset=UTF-8
Hello world!
Connection closed by foreign host.
Példa persistent kapcsolatra:
$ telnet server 80
Trying N.N.N.N...
Connected to server.
Escape character is '^]'.
GET / HTTP/1.1
Host: xxx
Connection: keep-alive
TARTALOM
GET / HTTP/1.1
Host: xxx
Connection: close
TARTALOM
Connection closed by foreign host.
Előny:
* Kevesebb TCP kapcsolat
* Jobb teljesítmény
Probléma:
HOL (Head-of-line) blokkolás (több kérés esetén). Mivel a kérések sorrendjében válaszol a szerver, ezért egy lassú feldolgozási művelet blokkolja a többi kérés kiszolgálását.
==== HTTP/2 (2015) ====
Alapja: a Google 2009-ben fejlesztett SPDY (kiejtve: “speedy”) kísérleti alkalmazásrétegű protokoll a HTTP/1.1 teljesítmény korlátainak megszüntetésére.
Fő jellemzők:
* Bináris protokoll
* Multiplexing (több stream egy TCP kapcsolaton)
* Header compression (HPACK)
* Server Push
Előny:
* Megszűnik az alkalmazás-szintű head-of-line blocking
* Jelentősen jobb teljesítmény
Hátrány:
* TCP head-of-line blocking továbbra is fennáll csomagszinten
Példa:
$ curl -v -s -o /dev/null --http2 https://server
* Host server:443 was resolved.
* IPv6: (none)
* IPv4: N.N.N.N
* Trying N.N.N.N:443...
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [1565 bytes data]
* CAfile: /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
* CApath: none
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS change cipher, Change cipher spec (1):
{ [1 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [25 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [2577 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / x25519 / RSASSA-PSS
* ALPN: server accepted http/1.1
* Server certificate:
* subject: CN=server
* start date: Jan 20 03:10:26 2026 GMT
* expire date: Apr 20 03:10:25 2026 GMT
* subjectAltName: host "server" matched cert's "server"
* issuer: C=US; O=Let's Encrypt; CN=R12
* SSL certificate verify ok.
* Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 2: Public key type RSA (4096/152 Bits/secBits), signed using sha256WithRSAEncryption
* Connected to r-l.hu (N.N.N.N) port 443
* using HTTP/1.x
} [5 bytes data]
> GET / HTTP/1.1
> Host: r-l.hu
> User-Agent: curl/8.15.0
> Accept: */*
>
* Request completely sent off
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [281 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [281 bytes data]
< HTTP/1.1 200 OK
< Date: Sun, 15 Feb 2026 04:10:24 GMT
< Server: Apache/2.4.62 (AlmaLinux)
< Last-Modified: Sun, 15 Feb 2026 04:09:05 GMT
< ETag: "0-64ad4ffd21f44"
< Accept-Ranges: bytes
< Content-Length: 0
< Content-Type: text/html; charset=UTF-8
<
* Connection #0 to host r-l.hu left intact
Több tartalom lekérése:
$ curl --http2 -s -o /dev/null https://server/index.html https://server/style.css https://server/app.js
==== HTTP/3 (2022) ====
Alapja: A QUIC (Quick UDP Internet Connections) egy modern, titkosított, multiplexelt transzport protokoll, amely UDP felett működik, és amelyet eredetileg a Google fejlesztett ki. IETF szabvány (RFC 9000).
A QUIC célja a TCP + TLS + HTTP/2 kombináció leváltása egy egyetlen, hatékonyabb protokollal, amely csökkenti a késleltetést és javítja a kapcsolat stabilitását.
Jellemzők:
* TCP helyett UDP
* TLS 1.3 integrált
* Nincs TCP head-of-line blokkolódás
* Gyorsabb kapcsolatfelépítés 0-RTT (Round-Trip Time)
* Connection ID-t használ a TCP IP + port azonosítás helyett
Előny:
* Jelentősen alacsonyabb késleltetés
* Mobil hálózatokon stabilabb
===== HTTP verziók összehasonlítása =====
^ Verzió ^ Szállítási réteg ^ Formátum ^ Multiplexing ^ Head-of-line blocking ^
| HTTP/1.0 | TCP | Szöveges | Nem | Igen |
| HTTP/1.1 | TCP | Szöveges | Korlátozott (pipeline) | Igen |
| HTTP/2 | TCP | Bináris | Igen | TCP szinten igen |
| HTTP/3 | QUIC (UDP) | Bináris | Igen | Nem |
===== HTTP kérés metódusok =====
=== HTTP metódusok összefoglaló táblázat ===
A metódus biztonságos (safe), ha nem változtatja meg a szerver állapotát. Ilyen metódusok
Egy metódus idempotens, ha ugyanazt a kérést többször elküldve a szerver állapota az első végrehajtás után már nem változik tovább.
^ Metódus ^ Safe ^ Idempotens ^ Van body? ^ Tipikus használat ^
| GET | Igen | Igen | Nem | Erőforrás lekérdezése |
| HEAD | Igen | Igen | Nem | Csak header lekérdezése |
| POST | Nem | Nem | Igen | Adatküldés, űrlap, API |
| PUT | Nem | Igen | Igen | Erőforrás létrehozása/felülírása |
| DELETE | Nem | Igen | Nem | Erőforrás törlése |
| OPTIONS | Igen | Igen | Nem | Támogatott metódusok lekérdezése |
| PATCH | Nem | Nem | Igen | Részleges módosítás |
| TRACE | Igen | Igen | Nem | Diagnosztika |
Példák:
Kapcsolódás minden esetben:
telnet server 80
Fontos:
* HTTP/1.1 esetén kötelező a ''Host'' header
* A header részt üres sor zárja le
* Body esetén kötelező a ''Content-Length''
=== GET ===
GET / HTTP/1.1
Host: server
Connection: close
=== HEAD ===
HEAD / HTTP/1.1
Host: server
Connection: close
=== POST ===
POST /login HTTP/1.1
Host: server
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
Connection: close
username=test&password=123
=== PUT ===
PUT /file.txt HTTP/1.1
Host: server
Content-Type: text/plain
Content-Length: 11
Connection: close
Hello World
=== DELETE ===
DELETE /file.txt HTTP/1.1
Host: server
Connection: close
=== OPTIONS ===
OPTIONS / HTTP/1.1
Host: server
Connection: close
Ez utóbbi kérésre a válasz:
...
Allow: GET, POST, HEAD
...
=== PATCH ===
PATCH /user/1 HTTP/1.1
Host: server
Content-Type: application/json
Content-Length: 18
Connection: close
{"name":"ujnev"}
=== TRACE ===
TRACE / HTTP/1.1
Host: server
Connection: close
Fontos a sorrend!
* A metódus az első szó a kérésben
* A státuszkód a válasz első sorában jelenik meg
* A header és a body között üres sor található
* A kapcsolat lezárását a ''Connection: close'' header vagy a szerver TCP bontása jelzi
===== HTTP válasz (állapot) kódok =====
^ Tartomány ^ Jelentés ^
| 1xx | Információ |
| 2xx | Siker |
| 3xx | Átirányítás |
| 4xx | Kliens hiba |
| 5xx | Szerver hiba |
^ Kód ^ Megnevezés ^ Jelentés ^
| 100 | Continue | A kliens folytathatja a kérést |
| 101 | Switching Protocols | Protokollváltás (pl. WebSocket) |
| 102 | Processing | A kérés feldolgozás alatt |
| 200 | OK | Sikeres kérés |
| 201 | Created | Erőforrás létrejött |
| 202 | Accepted | Feldolgozás elfogadva |
| 203 | Non-Authoritative Information | Nem hiteles forrásból származó válasz |
| 204 | No Content | Sikeres, de nincs válasz body |
| 205 | Reset Content | Kliens nézetének visszaállítása |
| 206 | Partial Content | Részleges tartalom (Range kérés) |
| 300 | Multiple Choices | Több válaszlehetőség |
| 301 | Moved Permanently | Végleges átirányítás |
| 302 | Found | Ideiglenes átirányítás |
| 303 | See Other | Más erőforrás GET-tel |
| 304 | Not Modified | Nem változott (cache) |
| 307 | Temporary Redirect | Ideiglenes, metódust megőrzi |
| 308 | Permanent Redirect | Végleges, metódust megőrzi |
| 400 | Bad Request | Hibás kérés |
| 401 | Unauthorized | Hitelesítés szükséges |
| 402 | Payment Required | Fizetés szükséges (fenntartott) |
| 403 | Forbidden | Tiltott hozzáférés |
| 404 | Not Found | Nem található |
| 405 | Method Not Allowed | Metódus nem engedélyezett |
| 406 | Not Acceptable | Nem elfogadható formátum |
| 407 | Proxy Authentication Required | Proxy hitelesítés szükséges |
| 408 | Request Timeout | Kérés időtúllépés |
| 409 | Conflict | Ütközés |
| 410 | Gone | Végleg eltűnt |
| 411 | Length Required | Content-Length hiányzik |
| 412 | Precondition Failed | Előfeltétel nem teljesült |
| 413 | Payload Too Large | Túl nagy kérés |
| 414 | URI Too Long | Túl hosszú URI |
| 415 | Unsupported Media Type | Nem támogatott médiatípus |
| 416 | Range Not Satisfiable | Érvénytelen tartomány |
| 417 | Expectation Failed | Expect header hiba |
| 418 | I'm a teapot | RFC humoros státuszkód |
| 429 | Too Many Requests | Túl sok kérés (rate limit) |
| 500 | Internal Server Error | Belső szerverhiba |
| 501 | Not Implemented | Nem implementált |
| 502 | Bad Gateway | Hibás gateway válasz |
| 503 | Service Unavailable | Szolgáltatás nem elérhető |
| 504 | Gateway Timeout | Gateway időtúllépés |
| 505 | HTTP Version Not Supported | HTTP verzió nem támogatott |