Tipik bir HTTP oturumu

HTTP gibi istemci-sunucu protokollerinde, oturumlar üç aşamadan oluşur:

  1.  İstemci bir TCP bağlantısı kurar (veya taşıma katmanı TCP değilse uygun bir bağlantı kurar).
  2. İstemci isteğini gönderir ve cevabı bekler.
  3. Sunucu isteği işler, bir durum kodu ve uygun verileri içeren cevabını geri gönderir.

HTTP/1.1'den itibaren, artık üçüncü aşama tamamlandıktan sonra bağlantı kapanmaz ve istemciye başka bir istek daha verilir: yani ikinci ve üçüncü aşamalar artık istenildiği kadar tekrarlanabilir.

Bağlantı kurma

İstemci-sunucu protokollerinde bağlantıyı kuran istemcidir. HTTP'de bağlantı açmak, altta yatan taşıma katmanında bağlantı başlatmak anlamına gelir; bu da genellikle TCP'dir.

TCP ile bir bilgisayardaki HTTP sunucusu için varsayılan port 80'dir. 8000 veya 8080 gibi diğer portlar da kullanılabilir.  Getirilecek sayfanın URL'si, alan adını ve port numarasını içerir; eğer port 80 ise yazılmasa da olur. Ayrıntılı bilgi için bakınız: Web'de kaynakları belirleme.

Not: İstemci-sunucu modeli, sunucunun istemciye açık bir istek olmadan veri göndermesine izin vermez. Bu soruna geçici bir çözüm bulmak için, web geliştiricileri bazı teknikler kullanmaktadır: XMLHTTPRequest, Fetch API , WebSockets API, veya benzer protokolleri kullanarak düzenli aralıklarla sunucu ping'lenir.

İstemci isteği gönderimi

Bağlantı kurulduktan sonra, kullanıcı aracısı -user agent- istek gönderebilir (kullanıcı aracısı genellikle bir web tarayıcısıdır, ancak crawler gibi başka bir program da olabilir). Bir istemci isteği, CRLF ile ayrılan (satır başı, ardından satır sonu karakteri), üç bloğa bölünmüş metin direktiflerinden oluşur:

  1. İlk satırda bir istek yöntemi ve ardından gelen parametreleri bulunur:
    • belgenin yolu, yani protokol veya alan adı olmayan mutlak bir URL
    • HTTP protokolü sürümü
  2. Sonraki satırlar sunucuya hangi tür verilerin uygun olduğu (kullanılacak dil veya MIME türleri gibi) veya davranışını değiştiren başka veriler (örneğin önbelleğe alınmışsa bir yanıt göndermeme) hakkında bilgi veren bir HTTP başlığını temsil eder. Bu HTTP başlıkları boş bir satırla biten bir blok oluşturur.
  3. Son blok genellikle POST metodu tarafından kullanılan ek verileri barındıran isteğe bağlı bir veri bloğudur.

İstek örnekleri

developer.mozilla.org sitesinin kök sayfasını yani http://developer.mozilla.org/ sayfasını getirme, ve sunucuya kullanıcı aracısının sayfayı mümkünse Fransızca olarak tercih ettiğini bildirmek:

GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr

Sondaki boş satırın veri bloğunu başlık bloğundan ayırdığına dikkat ediniz. HTTP başlığı olarak Content-Length belirtilmediğinden bu veri bloğu boş olarak sunulur, böylece başlıkların bittiğini işaret ederek sunucunun bu boş satırı alır almaz isteği işlemesine imkan verir.

Örneğin bir formun sonucunu gönderme:

POST /iletisim_formu.php HTTP/1.1
Host: developer.mozilla.org
Content-Length: 64
Content-Type: application/x-www-form-urlencoded

adi=Joe%20Kullanici&istegi=Bana%20bir%20katalog%20gonderir%20misiniz

İstek metotları

HTTP protokolü bir kaynak üzerinde gerçekleştirilmek istenen eylemi belirten bir dizi istek metodu tanımlamaktadır. Bu isteklere aslında isim de olabildikleri halde HTTP fiileri de denilir. En sık kullanılan istekler GET ve POST'tur:

  • GET metodu belirtilen kaynağın bir veri temsilini talep eder. GET ile yapılan istekler yalnızca veri almalıdır.
  • POST metodu sunucuya durumunu değiştirmesi için veri gönderir. HTML Formları'nda genellikle bu metot kullanılır.

Sunucu yanıtının yapısı

Bağlanan aracı isteğini gönderdikten sonra, web sunucusu isteği işler ve sonuçta bir yanıt verir. İstemci isteğine benzer şekilde, sunucunun yanıtı CRLF ile ayrılan ve üç bloğa bölünmüş metin direktiflerinden oluşur:

  1. İlk satır, durum satırı, kullanılan HTTP sürümünün onayı ve ardından bir durum isteğinden (ve insan tarafından okunabilen kısa bir açıklamadan) oluşur.
  2. Sonraki satırlar gönderilen veri hakkında istemciye bilgi veren (tür, veri boyutu, kullanılan sıkıştırma algoritması, önbelleğe alma hakkında ipuçları vb.) belirli HTTP başlıklarını içerir. İstemci isteğinde olduğu gibi, bu HTTP başlıkları da boş bir satırla biten bir blok oluşturur.
  3. Son blok isteğe bağlı verileri içeren bir veri bloğudur.

Cevap örnekleri

Başarılı bir web sayfası isteği yanıtı:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 55743
Connection: keep-alive
Cache-Control: s-maxage=300, public, max-age=0
Content-Language: en-US
Date: Thu, 06 Dec 2018 17:37:18 GMT
ETag: "2e77ad1dc6ab0b53a2996dfd4653c1c3"
Server: meinheld/0.6.1
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Vary: Accept-Encoding,Cookie
Age: 7


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>A simple webpage</title>
</head>
<body>
  <h1>Simple HTML5 webpage</h1>
  <p>Hello, world!</p>
</body>
</html>

İstenen kaynağın kalıcı olarak taşındığını belirten bildirim:

HTTP/1.1 301 Moved Permanently
Server: Apache/2.4.37 (Red Hat)
Content-Type: text/html; charset=utf-8
Date: Thu, 06 Dec 2018 17:33:08 GMT
Location: https://developer.mozilla.org/ (bu kaynağın taşındığı yeni bağlantıdır; kullanıcı aracısının bunu getirmesi beklenir)
Keep-Alive: timeout=15, max=98
Accept-Ranges: bytes
Via: Moz-Cache-zlb05
Connection: Keep-Alive
Content-Length: 325 (içerikte kullanıcı aracısının bağlantıyı takip edememesi halinde gösterilecek varsayılan sayfa bulunur)


<!DOCTYPE html... (kullanıcının eksik kaynağı bulmasına yardımcı olan özelleştirilmiş bir sayfa içerir)

İstenen kaynağın bulunamadığını belirten bildirim:

HTTP/1.1 404 Not Found
Content-Type: text/html; charset=utf-8
Content-Length: 38217
Connection: keep-alive
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Content-Language: en-US
Date: Thu, 06 Dec 2018 17:35:13 GMT
Expires: Thu, 06 Dec 2018 17:35:13 GMT
Server: meinheld/0.6.1
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Vary: Accept-Encoding,Cookie
X-Cache: Error from cloudfront


<!DOCTYPE html... (kullanıcının eksik kaynağı bulmasına yardımcı olan özelleştirilmiş bir sayfa içerir)

Yanıt durumu kodları

HTTP yanıt durumu kodları belirli bir HTTP isteğinin başarıyla tamamlanıp tamamlanmadığını gösterir. Yanıtlar beş sınıfa ayrılır: bilgilendirme yanıtları, başarı yanıtları, yönlendirmeler, istemci hataları ve sunucu hataları.

  • 200: Tamam. İstek başarılı oldu.
  • 301: Kalıcı olarak taşındı. Bu yanıt kodu, istenen kaynağın URI'sinin değiştirildiği anlamına gelir.
  • 404: Bulunamadı. Sunucu istenen kaynağı bulamıyor demektir.

Bakınız