WWW’nin İletişim Protokolü : HTTP – 1/2

Bu yazımızda WWW(World Wide Web)‘nin iletişim protokolü olan HTTP hakkında bilgiler vereceğim.

Günümüz dünyasında hepimizin bir “tık” ile ulaştığı bilgileri, sosyal ağlarda kurulan iletişimi, bir YouTube videosunu evlerimize ya da avuç içimize getirmekle yükümlü olan bu iletişim protokolünü daha yakından inceleyelim.

Aslında tarayıcımızı açıp “http://serkancay.com” yazdığımızda bir HTTP Request yapmış oluyoruz. Bu yazdığımızı anlayan ve iletişimi başlatan protokol HTTP’dir. İstekleri anlayıp buna göre kaynakları iletmekle yükümlüdür ve OSI modelinde 7. katmanda bulunmaktadır. Ayrıntılı bilgi ve tarihçesi: Viki

Kaynaklar demişken ilk iş olarak URL yapısından bahsedelim:

<scheme>://<host>:<port>/<path>?<query>#<fragment>

şeklinde genel bir yapısı vardır.

Burada “scheme” alanı aksini belirtmediğiniz sürece tarayıcılar tarafından varsayılan olarak HTTP veya HTTPS olarak algılanır. Bunun dışında FTP gibi dosya aktarımı için kullanılan protokollerde vardır ancak bu yazımızda HTTP üzerinde duracağız.

“host” dediğimiz alan ulaşmaya çalıştığımız sitenin IP’sine karşılık gelen alan adıdır.

“port” kısmını belki günlük olarak kullandığımız çoğu sitede belirtmiyoruz ama HTTP varsayılan olarak 80. portta çalışıyor ve tarayıcı isteği buna göre yapıyor. Aslında http://serkancay.com ile http://serkancay.com:80 aynı yeri işaret etmektedir. Tabii örneğin sunucu 80 değilde 81. porttan HTTP Request’lerini dinleseydi http://serkancay.com:81 yazacaktık.

Port’tan sonra gelen kısım “path” yani yol. Bu bir yolu veya bir dosyayı işaret edebilir. Her zaman fiziksel bir yeri işaret etmek zorunda değil. Örneğin http://serkancay.com/logo.png fiziksel bir dosyayı işaret ediyorken http://serkancay.com/index.php/category/genel ifadesi bir sayfayı işaret ediyor.

Soru işareti(?)’nden sonra gelen kısım “query” olarak ifade edilir. İsim-değer çiftleriyle isteği iletir. Bu tip URL’i en çok arama motorlarında görürüz. https://www.google.com.tr/?q=deneme şeklinde yapılan işlem “q” adıyla ve “deneme” değeriyle Google sunucularına bir HTTP isteği yapar. Her zaman tek değer çifti gönderilmez. Eğer 2 veya daha fazla değer çifti gönderilecekse bunlar & işaretiyle ayrılırlar. ?deger1=deneme1&deger2=deneme2 şeklinde URL devam eder.

“fragment” dediğimiz ve # işaretinden sonra gelen kısım sunucuyla herhangi bir işlem yapmaz. Sadece o an bulunulan HTML sayfasında bir yeri işaret eder.

Özel karakterler?..

Hiçbir URL’de boşluk karakteri göremezsiniz. Örneğin: http://serkancay.com/benim hakkimda şeklinde bir URL’den söz edemeyiz. Bunun sebebi anlaşılabilirliği zorlaştırmasıdır. Bu tip bir karakter kolaylıkla kaybolabilir. Tek boşluk mu yoksa çift boşluk mu gibi anlaşmazlıklar çıkabilir. Bunun dışında “fragment”ler için kullanılan # karakteri, ^ karakteri gibi ağ cihazları tarafından düzgün iletilemeyen karakterler “unsafe” olarak nitelendirilen ve doğrudan kullanılmaması gereken karakterlerdir. Bu tip karakterlere ihtiyaç duyulduğunda URL Encoding devreye girer. Unsafe karakter ASCII Encode edilerek URL’ye yerleştirilebilir. Örneğin: http://serkancay.com/benim%20hakkimda şeklinde bir URL’den söz edilebilir. Çünkü boşluk karakteri yerine ASCII karşılığı olan %20 kullanılmıştır. Bu tarz Unsafe karakterlerin ASCII karşılıkları buradan incelenebilir.

Kaynak Tipleri

Biz bir HTTP isteği yaparken aslında bir kaynak istiyoruz. En bilinen kaynak HTML kaynaklarıdır. Bir istek yapıyoruz ve tarayıcımızda yorumlanan bir HTML sayfası açılıyor diyelim. Burada HTTP kaynak yönetimini çok iyi bir şekilde yapıyor. Aslında biz kaynak isterken HTML istiyoruz ve sunucu bize text/html şeklinde bir kaynak dönüyor. Burada text birincil veya genel medya tipi, html bu kaynağın alt tipidir. Bu şekilde birçok MIME standartına sahibiz: image/jpeg, image/png, application/xml gibi.. Buradan tüm tipleri görebilirsiniz.

Basit Bir HTTP Request Yapalım

Aslında biz bu tarz istekleri her gün her saat yapıyoruz fakat bunu otomatize eden tarayıcıdır. Biz arka planda dönen işleri şu yazıyı okuyana kadar bilmiyorduk belkide. Şimdi biz bu isteği bizzat kendimiz elle yapacağız.

Telnet benzeri bir terminal programıyla HTTP istekleri yapabilirsiniz.

Terminali açalım ve aşağıdaki komutu yazalım

Burada 80 portunu belirtmemizin sebebi Telnet’in varsayılan olarak 23. portu kullanmasıdır. Biz 80. porttan serkancay.com adresine bağlanacağız.

Komutu verdikten sonra aşağıdaki gibi bilgilendirici yazılar çıkıp sizden istek bekleyecektir.

İşte burada biz HTTP isteğimizi yazacağız.

Sırası ile yazıp en sonunda iki kere Enter tuşuna basarsanız isteğiniz sunucuya iletilecektir. Burada GET ile metodumuzu belirliyoruz, / ile ana sayfa yani kök dizini görmek istiyoruz, HTTP/1.1 versiyon bilgisidir. Alttaki kısım “header” kısmıdır ve HTTP 1.1’de host belirtmeniz zorunludur.

Geriye bize bir HTTP cevabı dönmüştür. Başlık bilgileri ve HTML kodları içeren cevabımız normal bir tarayıcıdan girseydik yorumlanacak ve bize düzgün biçimde gösterilecekti.

HTTP Request Metodları

Birincil metodumuz GET metodudur. Bu metod kaynak çekmeye yarar. GET metodu sadece bir kaynağı getirmelidir, kaynak üzerinde değişiklik yapmamalıdır. Kaynak güncellenecekse POST ile yapılmalıdır. Bunların dışında PUT kaynağı kaydetmek, DELETE kaynağı silmek, HEAD kaynağın header bilgisini almak için kullanılır.

Bir POST isteği nasıldır?

Örneğimiz HTML formundan alınan isim ve soyisim verilerini POST metodu ile işleyen bir HTTP isteğidir.

Daha sonra bu kullanıcıyı GET metodu ile arayalım..

İki örnekte görüldüğü üzere POST metodu verileri “body” kısmından alırken GET doğrudan URL üzerinden almaktadır.

 

Bir sonraki yazımızda Request ve Response’un genel yapısından ve içeriğinden bahsedeceğiz..

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir