Ders 15 / 18
TCP
Üç aşamalı el sıkışma, sıra ve onay numaraları, yeniden iletim zamanlayıcısının hesabı, akış denetimi ve bağlantı durum makinesi.
İçindekiler
Önceki ders bir akışı adlandıran dörtlüyü kurdu. Adlandırma, akışın güvenilir olacağını söylemez: ağ katmanı paket kaybedebilir, sırayı bozabilir, aynı paketi iki kez teslim edebilir ve alıcıyı işleyebileceğinden hızlı besleyebilir.
TCP (Transmission Control Protocol) bu dört sorunu birden üstlenir ve uygulamaya tek bir soyutlama sunar: sıralı, kayıpsız, yinelemesiz bir bayt akışı. Bu dersin sorusu, bu sözün hangi düzeneklerle tutulduğudur.
Verilen Sözler
| Söz | Nasıl tutulur |
|---|---|
| Teslim | Onaylanmayan veri yeniden gönderilir |
| Sıra | Her bayta sıra numarası verilir, alıcı yeniden sıralar |
| Yinelemesizlik | Aynı sıra numarasındaki ikinci kopya atılır |
| Akış denetimi | Alıcı, kabul edebileceği bayt sayısını bildirir |
| Bütünlük | Sağlama, sözde başlıkla birlikte hesaplanır |
Söz verilmeyen şeyler de bilinmelidir. TCP mesaj sınırı korumaz: uygulamanın üç ayrı yazma çağrısı, karşı tarafta tek bir okumada birleşmiş olarak gelebilir. Gecikme üst sınırı vermez; kayıp durumunda yeniden iletim, gecikmeyi belirgin biçimde artırır. Karşı tarafın veriyi işlediğini de garanti etmez; onay, verinin taşıma katmanı arabelleğine ulaştığını gösterir.
Başlık
TCP başlığı seçeneksiz hâlde 20 bayttır.
| Alan | Boyut | İşlev |
|---|---|---|
| Kaynak bağlantı noktası | 2 bayt | Gönderen uç nokta |
| Hedef bağlantı noktası | 2 bayt | Alıcı uç nokta |
| Sıra numarası | 4 bayt | Bu segmentin ilk baytının akıştaki konumu |
| Onay numarası | 4 bayt | Beklenen bir sonraki baytın numarası |
| Veri ofseti | 4 bit | Başlık uzunluğu (32 bitlik sözcük) |
| Bayraklar | 8 bit | SYN, ACK, FIN, RST, PSH, URG ve tıkanıklık bitleri |
| Pencere | 2 bayt | Alıcının kabul edebileceği bayt sayısı |
| Sağlama | 2 bayt | Başlık, yük ve sözde başlık üzerinde |
| İvedi işaretçi | 2 bayt | URG bayrağıyla birlikte anlamlı |
| Seçenekler | 0–40 bayt | MSS, pencere ölçeği, zaman damgası, seçmeli onay |
Sağlamanın sözde başlık üzerinde hesaplanması, kaynak ve hedef IP adreslerinin de hesaba katılması demektir. Amaç, yanlış makineye teslim edilmiş bir segmentin sezilmesidir. Bunun yan etkisi, NAT ve PAT dersinde görüldüğü gibi adres dönüştürücünün sağlamayı yeniden hesaplamak zorunda kalmasıdır.
Üç Aşamalı El Sıkışma
Bağlantı, veri gönderilmeden önce kurulur. Kurulum üç segment alır:
| Adım | Yön | Bayraklar | Taşıdığı |
|---|---|---|---|
| 1 | İstemci → Sunucu | SYN | İstemcinin başlangıç sıra numarası, MSS ve seçenekler |
| 2 | Sunucu → İstemci | SYN + ACK | Sunucunun başlangıç sıra numarası, istemcininkinin onayı |
| 3 | İstemci → Sunucu | ACK | Sunucunun sıra numarasının onayı |
Üç adımın gerekliliği bakışımlıdır: her iki yön de ayrı ayrı kurulur. TCP çift yönlüdür; her yönün kendi sıra numarası dizisi vardır. İstemci kendi numarasını bildirir ve onaylatır, sunucu da aynısını yapar. İki bakışımlı alışverişten biri (sunucunun onayı ile kendi bildirimi) tek segmentte birleştirildiği için toplam üç segment olur.
Başlangıç sıra numarası sıfır değil, rastgele seçilir. Gerekçe iki katlıdır. Eski bir bağlantının geciken segmentleri, aynı dörtlüyle kurulan yeni bir bağlantıya karışmamalıdır. İkincisi güvenliktir: numara tahmin edilebilirse, dışarıdan bir taraf akışa geçerli görünen segmentler enjekte edebilir.
El sıkışma bir gidiş–dönüş süresi maliyeti getirir. Veri gönderilmeden önce en az bir tam tur beklenir; bu maliyet, kısa alışverişlerde toplam sürenin büyük bölümünü oluşturabilir.
Sıra ve Onay Numaraları
TCP sıra numarasını segmente değil bayta verir. Bir segmentin sıra numarası, taşıdığı ilk baytın akıştaki konumudur.
Başlangıç numarası 1000 ve MSS 1460 olan bir akış:
| Segment | Sıra numarası | Kapsadığı aralık |
|---|---|---|
| 1 | 1000 | 1000 – 2459 |
| 2 | 2460 | 2460 – 3919 |
| 3 | 3920 | 3920 – 5379 |
| 4 | 5380 | 5380 – 6839 |
Onay numarası, beklenen bir sonraki baytın numarasıdır ve birikimlidir: 6840 onayı, 6839’a kadar her şeyin alındığı anlamına gelir.
Birikimli onayın bir sonucu vardır. İkinci segment kaybolur, üçüncü ve dördüncü ulaşırsa, alıcı onay numarasını 2460’ta tutmak zorundadır — çünkü 2460’tan itibaren bir boşluk vardır. Üçüncü ve dördüncü segmentleri aldığını bildiremez.
Bu eksiklik seçmeli onay (selective acknowledgement) seçeneğiyle giderilir: alıcı, aldığı kesintisiz aralıkları ayrıca listeler. Gönderen böylece yalnızca gerçekten eksik olan segmenti yeniden gönderir; seçenek olmadığında boşluktan sonraki her şeyi yeniden göndermek zorunda kalabilir.
El sıkışmadaki SYN ve kapanıştaki FIN bayrakları birer sıra numarası tüketir. Veri taşımasalar da onaylanmaları gerekir; sıra numarası tüketmeleri bunu sağlar.
Yeniden İletim
Gönderilen her segment, onaylanana kadar bir arabellekte saklanır. Onay gelmezse segment yeniden gönderilir. Ne kadar bekleneceğine yeniden iletim zaman aşımı (retransmission timeout, RTO) karar verir.
Sabit bir süre seçilemez: aynı bağlantı üzerinde gidiş–dönüş süresi yol boyunca değişir. Süre çok kısa seçilirse gereksiz yeniden iletim yapılır ve ağ zaten sıkışıkken daha da yüklenir; çok uzun seçilirse kayıp geç fark edilir ve verim düşer.
Çözüm, ölçülen gidiş–dönüş sürelerinden yürüyen bir tahmin üretmektir:
Burada son ölçüm, ve ’tür. İkinci terim, sürenin değişkenliğini hesaba katar: kararlı bir yolda RTO ölçüme yaklaşır, dalgalı bir yolda ondan uzaklaşır.
ALFA, BETA, K = 1 / 8, 1 / 4, 4 olcumler = [100.0, 104.0, 96.0, 180.0, 102.0, 98.0] # ms srtt = olcumler[0] rttvar = olcumler[0] / 2 rto = srtt + K * rttvar print(f"{'ölçüm':>8s} {'SRTT':>8s} {'RTTVAR':>8s} {'RTO':>8s}") print(f"{olcumler[0]:8.2f} {srtt:8.2f} {rttvar:8.2f} {rto:8.2f}") for r in olcumler[1:]: rttvar = (1 - BETA) * rttvar + BETA * abs(srtt - r) srtt = (1 - ALFA) * srtt + ALFA * r rto = srtt + K * rttvar print(f"{r:8.2f} {srtt:8.2f} {rttvar:8.2f} {rto:8.2f}")
ölçüm SRTT RTTVAR RTO 100.00 100.00 50.00 300.00 104.00 100.50 38.50 254.50 96.00 99.94 30.00 219.94 180.00 109.95 42.52 280.01 102.00 108.95 33.87 244.44 98.00 107.58 28.14 220.15
Dördüncü satırdaki 180 ms’lik sıçrama tek başına ortalamayı 110 ms’ye taşımış, değişkenliği ise 30’dan 42,5’e çıkarmıştır; RTO 220 ms’den 280 ms’ye yükselir. Sonraki kararlı ölçümlerle değer yeniden iner.
Zaman aşımı gerçekleştiğinde RTO ikiye katlanır ve segment yeniden gönderilir. Ard arda zaman aşımlarında süre üstel olarak büyür. Bu davranış, ağın yanıt vermediği durumda yeniden iletim trafiğinin sorunu ağırlaştırmasını önler.
Zaman aşımını beklemenin pahalı olduğu durumlar için ikinci bir düzenek vardır. Alıcı, sıradan sonraki bir segment aldığında aynı onay numarasını tekrarlar; gönderen aynı onayı üç kez alırsa zaman aşımını beklemeden segmenti yeniden gönderir. Buna hızlı yeniden iletim (fast retransmit) denir ve sonraki dersteki tıkanıklık davranışıyla birlikte işler.
Akış Denetimi
Gönderen, alıcının işleyebileceğinden hızlı gönderirse alıcının arabelleği taşar ve veri atılır. Akış denetimi (flow control) bunu önler: alıcı, her onayda kabul edebileceği bayt sayısını bildirir. Bu değere alma penceresi (receive window) denir.
Gönderenin onaysız gönderebileceği veri miktarı pencereyi aşamaz. Bunun doğrudan bir verim sonucu vardır:
for pencere, rtt in ((65535, 0.020), (65535, 0.100), (262144, 0.100)): print(f"pencere {pencere:7d} bayt, RTT {rtt*1000:5.0f} ms -> en çok {pencere*8/rtt/1e6:8.2f} Mb/s")
pencere 65535 bayt, RTT 20 ms -> en çok 26.21 Mb/s pencere 65535 bayt, RTT 100 ms -> en çok 5.24 Mb/s pencere 262144 bayt, RTT 100 ms -> en çok 20.97 Mb/s
Pencere alanı 16 bittir; en büyük değeri 65 535 bayttır. Yüksek gecikmeli bir yolda bu değer verimi 5 Mb/s’ye hapseder — bağlantının kapasitesi ne olursa olsun. Sorun pencere ölçeği seçeneğiyle çözülür: el sıkışmada bir kaydırma miktarı bildirilir ve pencere değeri ile çarpılır. En büyük kaydırma 14’tür ve pencereyi bir gibabaytın az altına taşır.
Alıcı arabelleği dolduğunda pencere sıfır bildirilir ve gönderen durur. Alıcı yer açtığında bir pencere güncellemesi gönderir; bu güncelleme kaybolursa bağlantı kilitlenir. Gönderen bunu önlemek için düzenli olarak tek baytlık yoklama segmentleri yollar.
Akış denetimi yalnızca alıcının kapasitesini gözetir. Yolun kapasitesi ayrı bir sorundur ve sonraki dersin konusudur.
Durum Makinesi
Bir TCP uç noktası, tanımlı durumlar arasında geçiş yapar.
| Durum | Anlamı |
|---|---|
| CLOSED | Bağlantı yok |
| LISTEN | Sunucu, gelen istekleri bekliyor |
| SYN-SENT | İstemci SYN gönderdi, yanıt bekliyor |
| SYN-RECEIVED | Sunucu SYN aldı, SYN+ACK gönderdi |
| ESTABLISHED | Veri alışverişi yapılabilir |
| FIN-WAIT-1 / FIN-WAIT-2 | Kapatmayı başlatan tarafın bekleyişi |
| CLOSE-WAIT | Karşı taraf kapattı, yerel uygulama henüz kapatmadı |
| LAST-ACK | Son onay bekleniyor |
| TIME-WAIT | Kapanış tamamlandı, gecikmiş segmentler bekleniyor |
Kapanış, kurulumun aksine dört segment alır ve iki yön ayrı ayrı kapatılır. Bir taraf FIN gönderdiğinde yalnızca kendi göndereceği verinin bittiğini bildirir; karşı taraf veri göndermeye devam edebilir. Bu duruma yarı kapalı denir.
CLOSE-WAIT durumunda uzun süre kalan bağlantılar bir uygulama hatasının imzasıdır: karşı
taraf kapatmış, yerel uygulama soketi kapatmayı unutmuştur.
TIME-WAIT durumu, kapatmayı başlatan tarafta bir süre boyunca tutulur. İki nedeni vardır.
Son onay kaybolursa karşı taraf FIN’i yineler ve onun yanıtlanabilmesi için durumun ayakta
kalması gerekir. İkincisi, bu bağlantıya ait geciken segmentlerin, aynı dörtlüyle kurulacak
yeni bir bağlantıya karışmasını önlemektir.
Bir sunucu yeniden başlatıldığında “adres kullanımda” hatası alması bu durumdan kaynaklanır;
önceki derste geçen SO_REUSEADDR seçeneği bu kısıtı gevşetir.
RST bayrağı ayrı bir yol izler: bağlantıyı el sıkışmadan, anında sonlandırır. Kapalı bir bağlantı noktasına gelen segmente ve durumu bozulmuş bağlantılara verilen yanıt budur.
Özet
- TCP sıralı, kayıpsız, yinelemesiz bir bayt akışı sunar; mesaj sınırı korumaz ve gecikme üst sınırı vermez.
- El sıkışma üç segmenttir çünkü iki yön ayrı kurulur; başlangıç sıra numarası eski segmentlerin karışmasını ve enjeksiyonu önlemek için rastgele seçilir.
- Sıra numarası bayta verilir; onay birikimlidir ve boşluk oluştuğunda ilerleyemez, seçmeli onay bu eksiği giderir.
- RTO, yürüyen ortalama ve değişkenlikten hesaplanır; zaman aşımında ikiye katlanır, üç yinelenen onay hızlı yeniden iletimi tetikler.
- Alma penceresi verimi ile sınırlar; 65 535 bayt ve 100 ms’de bu sınır 5,24 Mb/s’dir ve pencere ölçeği seçeneğiyle aşılır.
- Kapanış dört segmenttir ve yönler ayrı kapatılır;
TIME-WAIT, kaybolan son onay ve geciken segmentler için tutulur.
Sonraki Adım
Akış denetimi alıcının kapasitesini korur; yolun kapasitesi hakkında hiçbir şey söylemez. Alıcı bir megabaytlık pencere bildiriyorsa, gönderen bunu ağ ne durumda olursa olsun dolduracaktır. Sonraki ders, gönderenin ağın kapasitesini nasıl tahmin ettiğini, kaybı bir sinyal olarak nasıl okuduğunu ve pencerenin verim üzerindeki etkisini hesapla ele alacak.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.