HTTP Protokolünü Anlamak

Mert Eroğlu
Teknoloji ve Mühendislik Blogu
5 min readOct 29, 2019

--

Kim okumalı: Web yazılımları geliştirmeye başlayacaklar, başlamış olup eksiklik hissedenler, bilgisayar haberleşmesine ilgisi olanlar ve genel olarak başlık tarafından ilgisi uyandırılanlar.

2018 yılında web yazılımları geliştirmeye ilk adımlarımı attım. Ardı ardına dersleri takip ederek, kolları sıvayıp kod yazarak ve takıldığım yerde dokümantasyonlara bakarak kendim de beklemediğim bir sürede birçok şey öğrendim. Geliştirme ortamında kod yazıp tarayıcıda onun hatasız kusursuz çalıştığını görmenin mutluluğunu bilenleriniz vardır, ancak bir eksiklik hissediyordum. Bir şey oluyordu, hoşuma gitmeyen bir şey; yaptıklarım çalışıyordu ama arka planda neler döndüğünü anlayamıyordum.

Sonraki yıl “bilgisayar haberleşmesi” isimli lisans dersini aldığımda bazı taşlar yerine oturdu. Web nedir, server nedir, client nedir, tarayıcıda bir linke veya butona tıkladığımda neler olur? Kafamın bir yerlerinde döndüğü halde henüz ismini koyamamış olduğum soruların bunlar olduğunu farkettim, cevapları sayesinde de birçok şey anladım. Biraz yukarıda bahsettiğim kavramların ve genel olarak web dediğimiz olgunun kalbinde HTTP protokolü bulunduğu için bu yazıya böyle bir başlığı uygun gördüm. O zaman beraber keşfedelim mi?

HTTP Genel Bakış

HyperText Transfer Protocol kelimelerinin kısaltması olan bu ismi hiper metin aktarım protokolü olarak çevirebiliriz dilimize. Hiper metinler doğrusal olarak akıp gitmeyen, içerisinde başka metinlere referanslar bulunan ve bu metinlere doğrudan erişim sağlanan metinler olarak düşünülebilir. Bunun en bariz örneği her gün onlarcasını dolaştığımız web sayfaları. İncelediğimiz bu protokolde bu tarz metinlerin yanı sıra resimler ve stil sayfaları gibi başka dosyaların da aktarımı yapılabiliyor. Buna ‘protokol’ denmesinin sebebi ise giden ve gelen mesajların önceden belirlenmiş ve sabit bir formatta olması.

Bir web sayfası bir veya birden fazla nesneden oluşur. Bir nesne belirli bir url üzerinden erişilebilen video veya jpeg görüntüsü gibi, HTML gibi bir dosyadır. Genelde web sayfalarına erişirken bir HTML dosyasına erişiriz ve onun içerisinde diğer nesnelere referanslar olur. HTML dosyaları ulaşmak istediğimiz içeriği taşırken onun referans olduğu nesneler de web sayfasının tasarımını (CSS), tarayıcıdaki davranış ve tepkilerini (JavaScript) ve diğer aksesuarlarını (resim, video, ses vb.) barındırır. Böylece karşınıza burada gördüğünüz gibi bir sayfa çıkar. HTTP ise bu sayfaların sistematik olarak server ve client arasında alışverişini sağlar.

HTTP Server — Client

HTTP protokolü server-client yapısında çalışır. Türkçe terimlere geçmek istersek server yerine sunucu, client yerine istemci diyelim. İstemcilerin web sayfalarını sunuculardan nasıl isteyeceğini ve sunucuların bu sayfaları istemcilere nasıl aktaracağını HTTP tanımlar. Bu yapıda istemciler genellikle bilgisayarlarımızda çalıştırdığımız tarayıcılardır, sunucular ise uzak bilgisayarlarda sürekli olarak açık tutulan programlardır. Kullanılmakta olan en popüler web sunucuları Apache, IIS ve Nginx olarak listelenebilir. Tarayıcılar web sunucularına HTTP isteğinde bulunur, sunucular ise bunlara HTTP cevabı ile karşılık verir. Bir sunucuya aynı anda birden çok (binlerce veya milyonlarca) HTTP isteği gelebilir. Bu tanımladığımız işlemleri özetleyen küçük bir görseli aşağıda bulabilirsiniz.

HTTP istek ve cevapları

HTTP bir alt katmanda TCP üzerine kurulmuştur. Bu sebeple HTTP haberleşmeleri sırasında gerçekleşebilecek veri kaybı, veya kaybedilen verinin tekrar gönderimi veya doğru sıraya konması gibi konularla TCP ilgilenir. HTTP aynı zamanda durum bilgisi barındırmayan bir protokoldür. Yani, bir kullanıcı bir nesne için birkaç saniye zarfında tekrar istekte bulunursa sunucu “bu nesneyi az önce gönderdim” gibi bir tepki vermez, yaptığını tamamen unutmuştur ve nesneyi kullanıcıya tekrar gönderir.

HTTP İstekleri

HTTP istek mesajları sıradan ASCII biçiminde yazılabilir ve bilgisayar terimlerine hakim birisi tarafından okunabilir. Bu isteklerin ilk satırına istek satırı, sonrasındaki satırlara ise header (üst bilgi) satırları denir. İstek satırında üç alan bulunur; istek metodu alanı, URL alanı ve HTTP versiyonu alanı. URL isteğin yapıldığı web adresidir, her isteğin geçerli bir adresi olmalıdır. İstek metodlarını ise farklı bir başlık altında inceleyeceğiz.

HTTP isteği header satırlarında sunucuya bilgi vermek ve ondan da önce sunucunun barındırıldığı host adresini belirtmek için isteğe ait bilgiler bulundurulur. Bunların en sık kullanılanları; Host: istekte bulunulan dosyaların barındırıldığı uzak bilgisayarın web adresi, User-Agent: kullanıcının tarayıcı ve bilgisayar bilgileri, Accept: kabul edilecek format (örneğin html ya da json), olarak sıralanabilir. Bunların ayrıntıları veya diğer header isimleri için MDN Request Headers sayfasını ziyaret edebilirsiniz. Aşağıda örnek bir HTTP isteği bulabilirsiniz.

GET /public/page.html HTTP/1.1

Host: www.itu.edu.tr

User-agent: Mozilla/5.0

Accept: text/html

HTTP İstek Metodları

Yukarıdaki örnek HTTP isteğinde de görülebileceği gibi bir tarayıcı bir nesne için istekte bulunduğunda GET metodunu kullanır. Bunun yanında geliştirdiğimiz programlar içerisinden veya POSTMAN gibi yardımcı araçlar üzerinden farklı metodlara sahip HTTP istekleri gönderebiliriz. HTTP isteğinin metodu o isteğin anlamsal olarak bir kategoriye dahil edilmesini sağlar. Örneğin GET metodu sunucudan veri almak için kullanılır ve özellikle kullanıcı şifresi gibi hassas içeriklerin barındırıldığı isteklerde kullanılması tavsiye edilmez.

Diğer önemli ve sık kullanılan istek metodları olarak POST, PUT ve DELETE öne çıkar. POST metodu istekte belirtilen host’a bir varlık, bir veri kümesi veya sadece bir veri göndermek için kullanılır, bunun sonucunda genellikle sunucu tarafında verilerin tutulduğu yere yeni bir veri eklenir. Program geliştirirken kullanıcı kaydı yapmak, login isteği göndermek veya yeni bir blog yazısı oluşturmak gibi istekler için bu metodu kullanırız. PUT metodu sunucu tarafında zaten mevcut olan bir kaynağın içeriğini değiştirmek için kullanılır. Programlarımızda veritabanında kayıtlı bulunan bir verinin tamamını (bazen bir kısmını) değiştirmek için bu metodu kullanırız. DELETE metodu ise kayıtlı olan bir kaynağın tamamen silinmesi için kullanılır. Daha fazlası için MDN HTTP İstekleri sayfasına gidebilirsiniz.

HTTP Cevapları

Cevap mesajları, istek mesajlarında olduğu gibi ASCII olarak aktarılır ve benzer bilgi alanlarına sahiptir. Yukarıda örnek olarak verdiğimiz HTTP isteğine aşağıdakine benzer bir HTTP cevabı almamız mümkündür.

HTTP/1.1 200 OK

Date: Tue, 09 Aug 2011 15:44:04 GMT

Server: Apache/2.2.3 (CentOS)

Content-Type: text/html

(Cevap gövdesi…)

Bu HTTP cevabında ilk satır durum satırı olarak isimlendirilir. Durum satırında protokol versiyonu, durum kodu ve ona karşılık gelen durum mesajı bulundurulur. Sonraki üç satır (daha fazla da olabilirdi) HTTP cevabının header satırlarıdır.

Date: gelen istek sonucunda sunucunun istenilen nesneleri kendi dosya sisteminden çekip istemciye sunduğu anın tarihi ve zamanıdır.

Server: Sunucu ile ilgili bilgidir, istek mesajındaki ‘User-agent’ bilgisine benzerlik gösterir.

Content-Type: sunulan nesnelerin türüdür, istemci gelen veriyi nasıl yorumlayacağını bu üst bilgi sayesinde bilir. Diğer olası header satırları hakkında bilgi almak için MDN Response Headers sayfasını ziyaret edebilirsiniz.

Cevap gövdesi olarak gösterdiğimiz yer ise istekte bulunulan asıl nesnelerdir.

HTTP Durum Kodları

HTTP durum kodları ve mesajları sunucu tarafından istemciye gönderilen cevaplarda isteğin nasıl sonuçlandığını belirten alanlardır. Yukarıdaki örnek HTTP cevabında durum satırında ‘200 OK’ görmüştük. Bu sunucu tarafından isteğin başarıyla işlenip sonuç olarak geçerli bir nesne döndürüldüğü anlamına gelir. HTTP durum kodları genel kategorilere ayrılır ve bu kategorilere göre ilk sayıları değişir. Bu kategoriler aşağıdaki gibidir.

1xx Bilgi mesajları

2xx Başarılı

3xx Yeniden yönlendirme

4xx İstemci hatası

5xx Sunucu hatası

Yazdığımız programlarda attığımız istekler sonucu dönen durum kodunu baz alarak bazı işlemler gerçekleştirmek, veya kullanıcılarımıza daha anlamlı hata mesajları göstermek isteyebiliriz. Sunucudan alma olasılığımız yüksek bazı durum kodları şunlardır:

200: OK (İstek başarılı)

401: Unauthorized (Yetkisiz erişim)

403: Forbidden (Erişim yasağı)

404: Not Found (Dosya bulunamadı)

500: Internal Server Error (Sunucu içerisinde hata)

HTTP durum kodlarının ve mesajlarının tamamına HTTP Status Codes sayfasından erişebilirsiniz.

Referans: Bu yazı hazırlanırken James F. Kurose ve Keith W. Ross tarafından hazırlanan “Computer Networking — A Top Down Approach” isimli kitaptan bol miktarda yararlanılmıştır.

Twitter |LinkedIn | GitHub

--

--