İçeriğe geç
academia.sh

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:

SRTT(1α)SRTT+αR\text{SRTT} \leftarrow (1-\alpha)\,\text{SRTT} + \alpha R

RTTVAR(1β)RTTVAR+βSRTTR\text{RTTVAR} \leftarrow (1-\beta)\,\text{RTTVAR} + \beta \lvert \text{SRTT} - R \rvert

RTO=SRTT+4RTTVAR\text{RTO} = \text{SRTT} + 4 \cdot \text{RTTVAR}

Burada RR son ölçüm, α=1/8\alpha = 1/8 ve β=1/4\beta = 1/4’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:

en c¸ok verim=pencereRTT\text{en çok verim} = \frac{\text{pencere}}{\text{RTT}}

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 2k2^k 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 pencere/RTT\text{pencere}/\text{RTT} 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat