12 Uygulama katmanı: web, e-posta ve dosya aktarımı
6. haftada portları ve bir web isteğinin dört adımını gördün. O adımlarda bağlantıyı TCP kuruyor, paketi IP taşıyordu. Bu hafta en üst katmana, uygulamaların kendi aralarında konuştuğu dile bakıyoruz. Tarayıcı web sunucusuyla HTTP konuşur, e-posta programı posta sunucusuyla SMTP ve IMAP konuşur, dosya aktaran program FTP ya da SFTP konuşur. Her protokolün kendi kuralları, kendi hata mesajları ve kendi portu vardır. Bir şikâyet geldiğinde hangi protokolün işinin bozulduğunu bilirsen aramaya doğru yerden başlarsın.
Sınavda sorulur: URL’nin parçaları (protokol, alan adı, port, yol); HTTP isteği ve yanıtı, GET ile POST farkı; durum kodu grupları ve 200, 301, 404, 500; HTTPS’te TLS’in iki işi (şifreleme ve sertifikayla sunucunun kimliğini doğrulama) ve kilit simgesinin neyi göstermediği; SMTP, IMAP ve POP3’ün görevleri; IMAP ile POP3 farkı; tarayıcıdan girilen e-postanın HTTPS kullanması; MX kaydı; e-postadaki “Kimden” satırının kanıt olmaması; FTP ile SFTP farkı; soruda verilen bir portu protokolüyle eşleştirme.
Sınav dışı (bilgi amaçlı): e-posta ve dosya aktarımı portlarının numaraları (soruda geçerse protokolüyle birlikte verilir), SPF, DKIM ve DMARC’ın nasıl çalıştığı, FTP’nin aktif ve pasif modu, HTTP/2 ile HTTP/3 farkı, çerez ve oturum.
12.1 Bir URL’nin parçaları
Tarayıcının adres çubuğuna yazdığın satıra URL denir. URL bir kaynağın internetteki tam adresidir: hangi protokolle, hangi sunucuya, hangi porttan bağlanılacağını ve sunucudan ne isteneceğini söyler.
https://okul-sunucu.example:8443/duyurular/sinav.html
└─┬─┘ └────────┬────────┘ └┬─┘└─────────┬─────────┘
protokol alan adı port yol
| Parça | Örnekte | Kim kullanır |
|---|---|---|
| Protokol | https |
Tarayıcı hangi dili konuşacağını ve varsayılan portu buradan seçer |
| Alan adı | okul-sunucu.example |
DNS bunu IP adresine çevirir (6. ve 9. hafta) |
| Port | 8443 |
TCP bu porta bağlanır. Yazılmazsa protokolün varsayılan portu kullanılır: https için 443, http için 80 |
| Yol | /duyurular/sinav.html |
Sunucu hangi sayfayı göndereceğine buna bakarak karar verir |
URL’nin her parçası farklı bir adımda kullanılır. Alan adı yanlışsa DNS hata verir, port kapalıysa bağlantı kurulamaz, yol yanlışsa sunucu “bu sayfa yok” der. Hata mesajı hangi parçanın sorunlu olduğunu gösterir.
12.2 Vaka 1: Adres doğru görünüyor, sayfa yok
Bir öğrenci sınav takviminin adresini mesajlaşma grubundan kopyalıyor. Sayfa açılmıyor, tarayıcıda “404 Not Found” yazıyor. Öğrenci “Okulun interneti yine gitti” diye düşünüyor. Aynı adresi komutla deniyoruz:
> curl.exe -I https://okul-sunucu.example/duyuru/sinav-takvimi
HTTP/1.1 404 Not Found
Content-Type: text/html; charset=utf-8
-I seçeneği curl’e sayfanın kendisini değil, yalnız yanıtın başlık satırlarını getirmesini söyler. Windows PowerShell’de curl yazınca başka bir komut çalıştığı için komutun adı curl.exe diye yazılır (4. hafta).
12.2.1 Kanıt ne söylüyor
Çıktının ilk satırı durum satırıdır. Sunucu her yanıtın başına üç basamaklı bir durum kodu koyar. Kodun ilk basamağı yanıtın hangi gruba girdiğini söyler:
| Grup | Anlamı | Sık görülen kod |
|---|---|---|
2xx |
İstek başarılı | 200 OK: sayfa gönderildi |
3xx |
Kaynak başka bir adreste, tarayıcı oraya gider | 301 Moved Permanently: sayfa kalıcı olarak taşındı |
4xx |
İstekte sorun var | 404 Not Found: bu yolda sayfa yok |
5xx |
Sunucu isteği işlerken hataya düştü | 500 Internal Server Error: sunucudaki yazılım hata verdi |
Burada 404 geldi. Bir yanıt geldiyse alan adı çözülmüş, TCP bağlantısı kurulmuş ve sunucu isteği okumuş demektir. Ağ çalışıyor. Sorun URL’nin yol kısmında: mesajlaşma grubundaki adreste duyurular yerine duyuru yazılmış. Doğru yolla istek 200 OK döndürür.
404 ve 500 gibi kodları sunucu gönderir. Bu kodu görüyorsan sunucuya ulaşmışsın demektir. Modemi yeniden başlatmak ya da Wi-Fi’ı değiştirmek bu sorunu çözmez. 404 görünce önce adresi, 500 görünce sitenin kendisini sorgula. Ağ sorunu varken durum kodu gelmez, 6. haftada gördüğün Could not resolve host ya da Connection timed out gibi bir hata gelir.
12.2.2 HTTP isteği ve yanıtı
Tarayıcı sunucuya bir HTTP isteği gönderir, sunucu da bir HTTP yanıtı döndürür. İstek kısa ve okunabilir bir metindir:
GET /duyurular/sinav.html HTTP/1.1
Host: okul-sunucu.example
İlk sözcük isteğin türüdür, buna yöntem denir. Bu derste iki yöntem yeter:
GET: bir sayfayı ya da dosyayı ister. Adres çubuğuna adres yazıp Enter’a bastığında tarayıcıGETgönderir.POST: sunucuya veri gönderir. Bir giriş formunu ya da ödev yükleme formunu gönderdiğinde tarayıcıPOSTkullanır.
Yanıtın ilk satırı durum satırıdır (HTTP/1.1 200 OK), ardından başlık satırları ve sayfanın kendisi gelir. Bütün bu metin TCP bağlantısının içinde gider. HTTP’de metin şifrelenmez: aynı ağdaki biri trafiği yakalarsa formda gönderdiğin parolayı da okuyabilir. HTTPS’te aynı istek TLS ile şifrelenmiş bağlantının içinde gider.
12.3 Vaka 2: Gönderen okul, sayfa kilitli, hesap çalındı
Bir öğrenciye şu e-posta geliyor:
Kimden : Bilgi İşlem <[email protected]>
Konu : Hesabınız 24 saat içinde kapatılacak
İçerik : Hesabınızı doğrulamak için tıklayın:
https://okul-example-giris.example/oturum
Öğrenci bağlantıya tıklıyor. Açılan sayfa okulun giriş sayfasına benziyor, adres çubuğunda kilit simgesi var. Öğrenci kullanıcı adını ve parolasını giriyor. Ertesi gün hesabından başkası giriş yapmış.
12.3.1 Kanıt ne söylüyor
İki şey öğrenciyi yanılttı: “Kimden” satırı ve kilit simgesi. İkisi de sitenin gerçek olduğunu kanıtlamaz.
“Kimden” satırı kanıt değildir. E-postayı gönderen program “Kimden” satırına istediği adresi yazabilir. E-postayı taşıyan SMTP protokolü bu satırın doğru olup olmadığını kendisi denetlemez. Bugün posta sunucuları sahte göndericiyi yakalamak için ek denetimler yapar ve sahte iletilerin çoğunu istenmeyen posta klasörüne atar. Ama hepsini yakalayamaz.
Kilit simgesi neyi gösterir? HTTPS’te TLS iki iş yapar:
- Şifreleme: Tarayıcıyla sunucu arasındaki trafiği şifreler. Yoldaki biri paketleri yakalasa da içeriği okuyamaz.
- Kimlik doğrulama: Sunucu tarayıcıya bir sertifika gösterir. Sertifika, sitenin alan adını doğrulayan ve güvenilir bir kuruluşun imzaladığı elektronik belgedir. Tarayıcı imzayı denetler ve sertifikadaki adın adres çubuğundaki alan adıyla aynı olup olmadığına bakar.
Kilit simgesi bu iki denetimin geçtiğini gösterir: “Bağlantı şifreli ve gerçekten okul-example-giris.example adlı sunucuyla konuşuyorsun.” Sitenin dürüst olduğunu göstermez. Sahte sitenin sahibi kendi alan adını almış ve o ada sertifika da almış. Bağlantı şifreli, ama parola doğrudan saldırgana gitmiş.
Asıl kanıt alan adının kendisi. Okulun giriş sayfası okul.example alan adındaysa okul-example-giris.example başka bir alan adıdır, içinde “okul” sözcüğünün geçmesi bir şey değiştirmez. Böyle bir e-posta geldiğinde bağlantıya tıklama, okulun adresini adres çubuğuna kendin yaz.
Tarayıcı “Bağlantınız gizli değil” diye uyarıyorsa ve altında NET::ERR_CERT_COMMON_NAME_INVALID ya da NET::ERR_CERT_DATE_INVALID gibi bir kod varsa sertifika denetimi geçmemiş demektir. Sertifika başka bir ada ait olabilir, süresi dolmuş olabilir ya da araya biri girmiş olabilir. Bu sayfada parola girme. Bu tür saldırıları ve korunma yollarını 13. haftada göreceğiz.
12.4 E-posta nasıl gider?
E-postada tarayıcıdan farklı olarak iki ayrı iş vardır: iletiyi göndermek ve gelen iletiyi okumak. İki işi farklı protokoller yapar. Okuldaki bir öğretim elemanının [email protected] adresine e-posta gönderdiğini düşünelim:
Gönderenin SMTP Okulun posta SMTP Alıcının posta IMAP / POP3 Alıcının
programı ──────→ sunucusu ──────→ sunucusu ←────────── telefonu
│ (posta kutusu)
│ DNS: "posta.example'ın postasını
│ hangi sunucu alır?" (MX kaydı)
- Gönderenin e-posta programı iletiyi SMTP ile okulun posta sunucusuna verir.
- Okulun sunucusu alıcının alan adına bakar ve DNS’e sorar: “
posta.example’ın postasını hangi sunucu alıyor?” DNS’te bu soruyu cevaplayan kayda MX kaydı denir. - Okulun sunucusu iletiyi yine SMTP ile alıcının posta sunucusuna aktarır. İleti orada alıcının posta kutusunda bekler.
- Alıcı telefonunu açınca e-posta uygulaması IMAP ya da POP3 ile posta kutusuna bağlanır ve iletiyi alır.
SMTP iletiyi gönderir ve bir sunucudan ötekine taşır. IMAP ve POP3 posta kutusundaki iletiyi okutur. SMTP posta kutusunu okumaz, IMAP ve POP3 de ileti göndermez. Bu yüzden bir e-posta programını kurarken iki ayrı sunucu bilgisi istenir: gelen posta sunucusu (IMAP ya da POP3) ve giden posta sunucusu (SMTP).
E-postanı tarayıcıdan okuyorsan, örneğin okulun web postasına giriyorsan, bilgisayarın SMTP ya da IMAP konuşmaz. Tarayıcın web sunucusuyla HTTPS konuşur, SMTP ve IMAP işlerini sunucu tarafı yapar. Okul ağı IMAP portunu engellese bile web postası açılır.
12.5 Vaka 3: Postalar bilgisayarda var, telefonda yok
Bir öğretim elemanı okul e-postasını yıllardır bilgisayarındaki e-posta programıyla okuyor. Yeni telefonuna da hesabı ekliyor. Telefonda gelen kutusu boş. Yeni gelen iletiler bir an telefonda görünüyor, bilgisayar açılınca telefondan da kayboluyor.
Bilgisayardaki programın hesap ayarları:
Gelen posta sunucusu : pop.okul.example
Hesap türü : POP3
[x] İletileri indirdikten sonra sunucudan sil
Telefondaki hesap türü ise IMAP.
12.5.1 Kanıt ne söylüyor
İki protokol posta kutusunu farklı kullanır:
| IMAP | POP3 | |
|---|---|---|
| İletiler nerede durur? | Sunucudaki posta kutusunda | Cihaza indirilir |
| Okundu bilgisi, klasörler | Bütün cihazlarda eşitlenir | Yalnız indiren cihazda kalır |
| Birden çok cihaz | Hepsi aynı kutuyu görür | Her cihaz kendi indirdiğini görür |
Bilgisayardaki program POP3 ile bağlanıyor ve “sunucudan sil” ayarı açık. Program her açıldığında yeni iletileri indiriyor ve sunucudan siliyor. Telefon IMAP ile sunucudaki kutuya bakıyor ve kutuyu boş buluyor. Telefonun bağlantısında bir sorun yok, gösterecek ileti kalmamış.
POP3 her zaman silmez. İndirdikten sonra sunucuda kopya bırakmak bir program ayarıdır. Ama kopya kalsa bile okundu bilgisi ve klasörler cihazlar arasında eşitlenmez. Birden çok cihaz kullanılan bugünkü düzende hesabı IMAP ile kurmak gerekir. Çözüm: bilgisayardaki hesabı IMAP ile yeniden kurmak. Eski iletiler bilgisayarda kalır, istenirse programdan sunucudaki klasöre taşınır.
12.6 Vaka 4: Gelen posta geliyor, giden gitmiyor
Bir öğrenci dizüstü bilgisayarındaki e-posta programına okul hesabını elle ekledi. Gelen iletiler sorunsuz iniyor. İleti göndermeye çalışınca program bir süre bekliyor, sonra “Giden posta sunucusuna bağlanılamadı” diyor. Programdaki ayarlar:
Gelen (IMAP) : imap.okul.example port 993
Giden (SMTP) : smtp.okul.example port 25
Öğrenci iki portu PowerShell’de Test-NetConnection ile deniyor (6. hafta):
PS> Test-NetConnection imap.okul.example -Port 993
ComputerName : imap.okul.example
RemoteAddress : 203.0.113.24
RemotePort : 993
InterfaceAlias : Wi-Fi
SourceAddress : 192.168.1.34
TcpTestSucceeded : True
PS> Test-NetConnection smtp.okul.example -Port 25
WARNING: TCP connect to (203.0.113.25 : 25) failed
ComputerName : smtp.okul.example
RemoteAddress : 203.0.113.25
RemotePort : 25
InterfaceAlias : Wi-Fi
SourceAddress : 192.168.1.34
PingSucceeded : True
PingReplyDetails (RTT) : 18 ms
TcpTestSucceeded : False
PS> Test-NetConnection smtp.okul.example -Port 587
...
TcpTestSucceeded : True
12.6.1 Kanıt ne söylüyor
Gelen postanın çalışması bilgisayarın ağa bağlı olduğunu, DNS’in çalıştığını ve okulun sunucusuna ulaşılabildiğini gösteriyor. Sorun yalnız gönderme tarafında. Gönderme SMTP’nin işi, okuma IMAP’ın işi: biri çalışırken öteki bozuk olabilir.
İkinci çıktıda sunucu ping’e cevap veriyor ama 25 numaralı porta bağlantı kurulamıyor. Sunucu ayakta, sorun portta. SMTP’nin iki ayrı kullanımı vardır:
- Sunucudan sunucuya aktarım: posta sunucuları birbirine TCP 25 üzerinden ileti aktarır.
- Programdan sunucuya gönderme: e-posta programı iletiyi kendi sunucusuna TCP 587 üzerinden, kullanıcı adı ve parolayla verir.
Pek çok internet sağlayıcısı ve kurum ağı, sıradan bilgisayarların dışarıya 25 numaralı porttan bağlanmasını engeller. Ele geçirilmiş bilgisayarların istenmeyen posta göndermesini böyle önlerler. Öğrencinin programı da 25’i deniyor. Üçüncü test 587’nin açık olduğunu gösteriyor. Giden sunucu portu 587 yapılıp kimlik doğrulama açılınca ileti gidiyor.
Gelen posta ile giden posta ayrı protokollerle, ayrı portlardan ve çoğu zaman ayrı sunucularla çalışır. Birinin çalışması ötekinin çalıştığını göstermez. ping’in sunucudan cevap alması da hizmetin portunun açık olduğunu göstermez.
12.7 Dosya aktarımı: FTP ve SFTP
Bir web sitesinin dosyalarını sunucuya yüklemek ya da sunucudan bir yedeği indirmek için dosya aktarım protokolü kullanılır.
FTP, en eski dosya aktarım protokollerinden biridir. İstemci önce sunucunun TCP 21 portuna bağlanır, komutlar bu bağlantıdan gider. Dosyanın kendisi ayrı bir veri bağlantısıyla aktarılır. FTP hiçbir şeyi şifrelemez: kullanıcı adı, parola ve dosya ağda açık gider. Kafeteryadaki ortak Wi-Fi’da FTP ile siteye dosya yükleyen biri parolasını aynı ağdaki herkese göstermiş olur.
SFTP, dosyayı 6. haftada gördüğün SSH bağlantısının içinden aktarır. Bu yüzden SSH’in portu olan TCP 22’yi kullanır ve her şeyi şifreler. Sunucuda SSH ile giriş yapabiliyorsan çoğu zaman SFTP ile dosya da aktarabilirsin. Windows’ta komut hazır gelir:
PS> sftp [email protected]
[email protected]'s password:
Connected to okul-sunucu.example.
sftp> put rapor.pdf
Uploading rapor.pdf to /home/ogrenci/rapor.pdf
sftp> exit
Adları benzese de SFTP, FTP’nin bir sürümü değildir, SSH’in üstünde çalışan ayrı bir protokoldür. FTP’yi TLS ile şifreleyen sürüme FTPS denir. Bugün yeni bir kurulumda dosya aktarmak için SFTP ya da HTTPS üzerinden çalışan bir yükleme sayfası kullanılır, şifresiz FTP kullanılmaz.
12.8 Hepsi bir arada
| Ne yapıyorsun? | Protokol | Taşıma ve port | Şifreli mi? |
|---|---|---|---|
| Web sayfası açmak | HTTP | TCP 80 | Hayır |
| Web sayfası açmak | HTTPS | TCP 443 | Evet, TLS |
| E-posta programından ileti göndermek | SMTP | TCP 587 | Evet, TLS |
| İletiyi bir posta sunucusundan ötekine aktarmak | SMTP | TCP 25 | Sunucular anlaşırsa |
| Posta kutusunu birden çok cihazda kullanmak | IMAP | TCP 993 | Evet, TLS |
| İletiyi posta kutusundan cihaza indirmek | POP3 | TCP 995 | Evet, TLS |
| E-postayı tarayıcıdan okumak | HTTPS | TCP 443 | Evet, TLS |
| Bir alan adının posta sunucusunu bulmak | DNS (MX kaydı) | UDP 53 | Hayır |
| Dosya aktarmak | FTP | TCP 21 | Hayır |
| Dosya aktarmak | SFTP | TCP 22 (SSH) | Evet, SSH |
Bu tablodaki e-posta ve dosya aktarımı portlarını ezberlemen gerekmez. 6. haftadaki dört port (HTTP 80, HTTPS 443, DNS 53, SSH 22) yeter. Bir soruda başka bir port geçerse protokolüyle birlikte verilir, senden beklenen o protokolün ne iş yaptığını bilmendir. IMAP ve POP3’ün şifresiz eski portları da vardır (143 ve 110), bugün TLS’li sürümleri kullanılır.
12.9 Ekranda ne gördük
Derste aşağıdaki komutlar canlı çalıştırılır. Senin bilgisayarında adresler ve süreler farklı çıkabilir. Komutları Windows’ta PowerShell’de çalıştır (6. haftanın “Ekranda ne gördük” kısmında nasıl açılacağı yazıyor).
> curl.exe -I http://emrecan.dev
HTTP/1.1 301 Moved Permanently ← 3xx: kaynak başka adreste
Location: https://emrecan.dev/ ← tarayıcı buraya gider: HTTP'den HTTPS'e
> curl.exe -I https://emrecan.dev/yok-boyle-sayfa
HTTP/2 404 ← sunucu cevap verdi: ağ çalışıyor, yol yanlış
> nslookup -type=mx gmail.com
Non-authoritative answer:
gmail.com MX preference = 5, mail exchanger = gmail-smtp-in.l.google.com
gmail.com MX preference = 10, mail exchanger = alt1.gmail-smtp-in.l.google.com
gmail.com MX preference = 20, mail exchanger = alt2.gmail-smtp-in.l.google.com
← gmail.com'a gelen postayı bu sunucular alır
← küçük sayı önce denenir, ötekiler yedektir
PS> Test-NetConnection smtp.gmail.com -Port 587
TcpTestSucceeded : True ← gönderme portu açık
PS> Test-NetConnection imap.gmail.com -Port 993
TcpTestSucceeded : True ← okuma portu açık
İlk komutta adres http ile yazıldı. Sunucu sayfayı göndermek yerine 301 ile HTTPS adresine yönlendirdi. Tarayıcıya http:// yazdığında adres çubuğunun kendiliğinden https://’e dönmesinin nedeni bu yönlendirmedir. İkinci yanıt HTTP/2 ile geldi: aynı protokolün daha yeni bir sürümü, durum kodları aynıdır.
12.11 Tek sayfa özet
- URL dört parçadır: protokol, alan adı, port, yol. Port yazılmazsa protokolün varsayılanı kullanılır.
- HTTP istek ve yanıttır.
GETsayfa ister,POSTveri gönderir. - Durum kodu gruplarını ilk basamaktan oku:
2xxbaşarılı,3xxyönlendirme,4xxistekte sorun,5xxsunucuda hata. Durum kodu geldiyse sunucuya ulaşılmıştır. - HTTPS trafiği şifreler ve sertifikayla sunucunun alan adını doğrular. Kilit simgesi sitenin dürüst olduğunu göstermez: alan adını kendin oku.
- E-postadaki “Kimden” satırı kanıt değildir, SMTP bu satırı denetlemez.
- SMTP gönderir ve sunucudan sunucuya aktarır. IMAP ve POP3 posta kutusunu okutur. Gelen ile giden ayrı çalışır.
- IMAP iletileri sunucuda tutar ve cihazları eşitler. POP3 iletileri cihaza indirir.
- MX kaydı, bir alan adına gelen postayı hangi sunucunun aldığını söyleyen DNS kaydıdır.
- Tarayıcıdan okunan e-posta HTTPS kullanır.
- FTP parolayı ve dosyayı şifresiz taşır. SFTP SSH’in içinden, şifreli aktarır.
12.12 Bu bölümün kazanımları
Bu bölümü bitiren öğrenci:
- URL’yi protokol, alan adı, port ve yol olarak ayırır ve her parçanın hangi adımda kullanıldığını açıklar.
- HTTP durum kodunu doğru gruba bağlar ve sorunun ağda mı sunucuda mı olduğunu ayırt eder.
- HTTPS’in şifrelemeyle ve sertifikayla neyi doğruladığını, kilit simgesinin neyi göstermediğini açıklar.
- SMTP, IMAP ve POP3’ün görevlerini ve tarayıcıdan okunan e-postanın HTTPS kullandığını açıklar.
- IMAP ile POP3’ün posta kutusunu nasıl kullandığını karşılaştırır.
- MX kaydının işini ve e-postadaki “Kimden” satırının neden kanıt olmadığını açıklar.
- Gelen ve giden posta sorununda kanıtı doğru protokole ve porta bağlar.
- FTP ile SFTP’yi şifreleme ve kullandığı bağlantı bakımından ayırt eder.
