---
title: TCP
source: 'https://academia.sh/tr/kurslar/ag-modelleri/tcp'
course: 'Ağ Modelleri ve Protokoller'
language: tr
updated: '2026-08-17T18:07:13+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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:

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

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

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

Burada $R$ son ölçüm, $\alpha = 1/8$ ve $\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.

```python
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:

$$
\text{en çok verim} = \frac{\text{pencere}}{\text{RTT}}
$$

```python
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
$2^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 $\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.
