HTTP gibi istemci-sunucu protokollerinde, oturumlar üç aşamadan oluşur:
- İstemci bir TCP bağlantısı kurar (veya taşıma katmanı TCP değilse uygun bir bağlantı kurar).
- İstemci isteğini gönderir ve cevabı bekler.
- 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.
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:
- İ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ü
- 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.
- 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:
- İ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.
- 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.
- 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ı.