SEN2008 · 7. hafta · Transport Layer Concepts (I): Services, elements of a transport protocol, TCP, UDP

Taşıma katmanı I: portlar, UDP, TCP segmenti ve el sıkışma

Taşıma katmanının işi, port ile çoklama, UDP checksum hesabı, TCP başlığı, seq/ack numaraları ve üçlü el sıkışma. Vizede seq/ack ve checksum soruları buradan çıkar.

transport layermultiplexingdemultiplexingport numbersocketUDPchecksumone's complementTCP segmentsequence numberacknowledgment numbercumulative ACKthree-way handshakeSYNFINreliable data transfer

Ağ katmanı paketi bir hosttan diğerine taşır. Ama o hostta tarayıcı, Spotify ve SSH aynı anda çalışıyor. Paketin hangi programa gideceğini taşıma katmanı (transport layer) belirler. Bu hafta iki protokolü göreceksin: hızlı ama söz vermeyen UDP ve güvenilir ama daha ağır TCP. Sınavda en sık çıkan sorular checksum hesabı ve seq/ack numaralarıdır. Altın kurallar:

  1. Port, süreci seçer. IP adresi hostu, port numarası o hosttaki soketi bulur.
  2. UDP soketi 2 değerle, TCP soketi 4 değerle tanımlanır.
  3. Checksum: topla, eldeyi başa sar, ters çevir. Alıcıda toplam 0xFFFF çıkmalı.
  4. ack = beklenen sonraki bayt. Yani seq + uzunluk.
  5. SYN ve FIN birer numara yer. Veri taşımasalar bile.

Taşıma katmanı ne iş yapar?

Uygulama katmanı mesajı üretir. Taşıma katmanı onu segmentlere (segment) böler, başlık ekler ve ağ katmanına verir. Karşı tarafta başlığa bakıp veriyi doğru sokete (socket) teslim eder. IP “en iyi çaba” (best effort) hizmetidir: paket kaybolabilir, bozulabilir, sırası karışabilir. Taşıma katmanı bunun üzerine ne kadar güvence koyacağını seçer.

ÖzellikUDPTCP
BağlantıYok (connectionless)El sıkışma ile kurulur
Güvenilir teslimHayırEvet (ACK + yeniden gönderim)
Sıralı teslimHayırEvet
Akış kontrolü (flow control)Yokrwnd ile var
Tıkanıklık kontrolü (congestion control)Yokcwnd ile var
Başlık8 bayten az 20 bayt
Tipik kullanımDNS, video/ses akışı, oyunWeb, e-posta, dosya aktarımı

Hiçbiri gecikme ya da bant genişliği garantisi vermez. Bu, sınavda klasik bir “hangisi doğru değil” şıkkıdır.

Çoklama ve ayrıştırma (multiplexing / demultiplexing)

Gönderen tarafta birçok soketten gelen veriyi toplayıp başlığa port yazmaya çoklama (multiplexing) denir. Alıcı tarafta başlıktaki porta bakıp veriyi doğru sokete dağıtmaya ayrıştırma (demultiplexing) denir.

Port numarası 16 bittir, yani 216=655362^{16} = 65536 değer var. 0-1023 arası iyi bilinen portlardır (well-known ports). İstemci tarafı genellikle işletim sisteminin verdiği geçici (ephemeral) bir port kullanır.

  • UDP: soket (hedef IP, hedef port) ile bulunur. Farklı istemcilerden aynı porta gelen datagramlar aynı sokete düşer. Kaynak bilgisi sadece cevap adresi olarak kullanılır.
  • TCP: soket (kaynak IP, kaynak port, hedef IP, hedef port) ile bulunur. Web sunucusu 80’de dinler ama her istemci bağlantısı için ayrı bir soket açar.

TUZAK · “aynı hedef port = aynı soket” sadece UDP için doğru. TCP’de iki farklı istemci aynı sunucu portuna bağlansa bile kaynak IP veya kaynak port farklı olduğu için iki ayrı soket vardır.

UDP ve checksum

UDP başlığı dört alandan oluşur, her biri 16 bit: kaynak port, hedef port, uzunluk (length, başlık dahil bayt), checksum. Toplam 8 bayt. 120 baytlık veri taşıyan datagramın length alanı 128 olur. IPv4 üzerinde en büyük UDP verisi 65535 − 20 − 8 = 65507 bayttır.

Checksum, iletimde bit bozulmasını yakalamak içindir. UDP checksum’ı başlığı, veriyi ve IP adreslerini içeren bir sözde başlığı (pseudo-header) kapsar. Hesap yöntemi:

  1. Veriyi 16 bitlik kelimelere böl ve topla.
  2. Toplam 16 biti aşarsa taşan elde (carry) en düşük bite eklenir (wraparound).
  3. Sonucun birler tümleyenini (one’s complement) al: her biti ters çevir.

Çözümlü örnek: kelimeler 0xB4A2, 0x6C3F, 0x1E90.

0xB4A2                         1011 0100 1010 0010
+ 0x6C3F  = 0x120E1  (17 bit, elde var)
            0x20E1 + 1 = 0x20E2   0010 0000 1110 0010
+ 0x1E90  = 0x3F72   (elde yok)   0011 1111 0111 0010
toplam    = 0x3F72
checksum  = ters çevir         1100 0000 1000 1101  = 0xC08D

Alıcı tüm kelimeleri checksum ile birlikte toplar: 0x3F72 + 0xC08D = 0xFFFF. Bütün bitler 1 ise hata görülmemiştir. Tek bir 0 bile varsa paket bozuktur.

İPUCU · hex’te ters çevirme. Birler tümleyeni = 0xFFFF − x. 0x3F72 için: F−3=C, F−F=0, F−7=8, F−2=D → 0xC08D. Bit bit yazmana gerek yok.

TUZAK · checksum her hatayı yakalamaz. İki kelimede aynı bit konumunda biri 0→1, diğeri 1→0 dönerse toplam değişmez ve hata görünmez. Checksum tespit eder, düzeltmez.

Güvenilir veri aktarımı (rdt) fikri

TCP’nin güvenilirliği adım adım kurulan bir modelden gelir. Ders kitabındaki rdt sürümlerini şöyle özetleyebilirsin:

SürümKanal varsayımıEklenen mekanizma
rdt1.0Kusursuz kanalHiçbir şey, sadece gönder
rdt2.0Bitler bozulabilirChecksum + ACK/NAK + yeniden gönderim
rdt2.1ACK/NAK da bozulabilir1 bitlik sıra numarası (0/1) ile tekrar tespiti
rdt2.2Aynı, NAK’sızSon doğru paketin numarasıyla ACK (tekrar ACK = NAK)
rdt3.0Kayıp da olabilirZamanlayıcı (timer), süre dolunca yeniden gönder

rdt3.0 bir dur-bekle (stop-and-wait) protokolüdür. Verimliliği düşük olduğu için TCP boru hattı (pipelining) kullanır: ACK beklemeden birden fazla segment gönderir. Bunun Go-Back-N ve Selective Repeat ayrıntısını 3. haftada gördün.

TCP segmenti

 0                   16                  31
+---------------------+--------------------+
|   kaynak port       |   hedef port       |
+---------------------+--------------------+
|              sequence number             |
+------------------------------------------+
|          acknowledgment number           |
+------+------+-------+--------------------+
|offset| rsv  | flags |  receive window    |
+------+------+-------+--------------------+
|     checksum        |  urgent pointer    |
+---------------------+--------------------+
|        options (değişken)                |
+------------------------------------------+
|        veri                              |
  • Sequence number: segmentteki ilk baytın numarası. TCP baytları numaralar, segmentleri değil.
  • Acknowledgment number: alıcının beklediği sonraki bayt. Kümülatif (cumulative): “buna kadar her şey geldi” demek.
  • Data offset (header length): başlık boyu, 4 baytlık kelime cinsinden. 5 ise 20 bayt, 8 ise 32 bayt (12 bayt seçenek).
  • Flags: SYN (bağlantı aç), ACK (ack alanı geçerli), FIN (kapat), RST (sıfırla), PSH, URG.
  • Receive window: akış kontrolü için alıcının boş tampon miktarı (8. hafta).

Çözümlü örnek: ISN 7200 olan istemci 1000, 1000, 600 baytlık üç segment gönderiyor.

segment   seq     uzunluk   bu segmentin ACK'i
1         7201    1000      8201
2         8201    1000      9201
3         9201     600      9801

Üçlü el sıkışma ve kapanış

TCP veri göndermeden önce iki taraf başlangıç sıra numaralarını (ISN) paylaşır. İstemci ISN = 4000, sunucu ISN = 9000 olsun:

1) istemci → sunucu   SYN=1          seq=4000
2) sunucu → istemci   SYN=1, ACK=1   seq=9000   ack=4001
3) istemci → sunucu   ACK=1          seq=4001   ack=9001   (veri taşıyabilir)
4) istemci 500 bayt   seq=4001  → sunucunun cevabı ack=4501

Neden iki yönlü değil de üç adım? İki adımda sunucu, istemcinin kendi ISN’ini aldığını bilemez. Eski bir gecikmiş SYN yüzünden boşuna bağlantı açılabilir.

Kapanışta her yön ayrı kapatılır. İstemci FIN (seq 5501) gönderir, sunucu ack 5502 ile onaylar. Sunucu işini bitirince kendi FIN’ini (seq 12001) yollar, istemci ack 12002 döner ve TIME_WAIT durumunda bir süre bekler. Böylece son ACK kaybolursa tekrar gönderebilir.

TUZAK · SYN flood. Sunucu her SYN için kaynak ayırıp yarı açık bağlantı tutarsa saldırgan sahte kaynak adresli SYN’lerle tabloyu doldurabilir. SYN cookie bu yüzden var. 10. haftadaki DoS konusunda tekrar göreceksin.

Kümülatif ACK ve kayıp

100, 150, 200, 250 numaralı 50’şer baytlık dört segment gönderildi, 150 kayboldu:

gelen   alıcının ACK'i
100     150
150     (kayıp)
200     150   (tekrar ACK)
250     150   (tekrar ACK)

Alıcı sıra dışı segmentleri tamponlayabilir ama ACK numarası hep ilk eksik bayttır. 150 yeniden gelince ACK birden 300’e atlar.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
ack = alınan son baytın numarasıack = beklenen sonraki bayt (seq + uzunluk)
SYN veri taşımadığı için numara tüketmezSYN ve FIN 1 numara tüketir
TCP segmentleri numaralarTCP baytları numaralar
UDP de soketleri 4-tuple ile ayırırUDP: (hedef IP, hedef port)
Checksum hatayı düzeltirSadece tespit eder, o da her zaman değil
Taşan eldeyi atarımElde en düşük bite eklenir (wraparound)
Data offset = bayt cinsinden boy4 baytlık kelime sayısı: × 4
TCP gecikme garantisi verirNe TCP ne UDP zamanlama ya da hız garantisi verir

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

Which transport-layer protocol provides a reliable, in-order byte stream with connection setup?

  1. UDP
  2. IP
  3. TCP
  4. ICMP
Cevabı göster
C) TCP

UDP bağlantısızdır, güvenilirlik vermez. IP ve ICMP ağ katmanıdır. Bağlantı kuran (handshake), kaybı telafi eden ve baytları sırayla teslim eden protokol TCP.

Soru 2kolay

Port numbers are 16-bit fields. How many distinct port numbers exist?

Cevabı göster
65536

16 bit ile 216=655362^{16} = 65536 farklı değer yazılır: 0 ile 65535 arası. 0-1023 arası iyi bilinen portlar (well-known ports): HTTP 80, HTTPS 443, DNS 53, SSH 22.

Soru 3orta

A host receives UDP datagrams from two different clients, both sent to destination port 5000 on the host. How does the host demultiplex them, and how would this differ for TCP?

  1. UDP uses the 4-tuple, TCP uses only the destination port
  2. Both go to the same UDP socket (identified by destination IP and port); TCP would use separate sockets identified by the 4-tuple
  3. UDP creates one socket per client; TCP uses one socket for all clients
  4. Both protocols use only the source port
Cevabı göster
B) Both go to the same UDP socket (identified by destination IP and port); TCP would use separate sockets identified by the 4-tuple

UDP soketi iki değerle tanımlanır: (hedef IP, hedef port). Kaynağı farklı olsa da iki datagram aynı sokete düşer. TCP soketi dört değerle tanımlanır: (kaynak IP, kaynak port, hedef IP, hedef port). Her istemci bağlantısı ayrı soket olur.

Soru 4orta

Compute the 16-bit Internet checksum (one's complement of the one's complement sum) of the two words 0x8F21 and 0x9A4C.

Cevabı göster
0xD691

Topla: 0x8F21 + 0x9A4C = 0x1296D. 16 biti aşan elde (1) en alta eklenir: 0x296D + 1 = 0x296E.
Birler tümleyeni: her bit ters çevrilir. 0x296E = 0010 1001 0110 1110 → 1101 0110 1001 0001 = 0xD691.
Hızlı kontrol: 0x296E + 0xD691 = 0xFFFF.

Soru 5orta

A receiver gets the data words 0x3A10, 0x7C05 and the checksum field 0x49AE. Does it detect an error?

Cevabı göster
Yes, the sum is 0xFFC3, not 0xFFFF

Alıcı veri kelimelerini ve checksum'ı birlikte toplar: 0x3A10 + 0x7C05 = 0xB615, 0xB615 + 0x49AE = 0xFFC3 (elde yok).
Hatasız olsaydı sonuç 0xFFFF (hepsi 1) çıkardı. 0xFFC3 olduğu için hata var. Doğru checksum 0x49EA olmalıydı.

Soru 6kolay

A TCP segment carries sequence number 2300 and 700 bytes of data. What acknowledgment number does the receiver send if everything before it has arrived?

Cevabı göster
3000

ACK numarası, beklenen bir sonraki baytın numarasıdır: 2300 + 700 = 3000. Segment 2300 ile 2999 arası baytları taşır.

Soru 7orta

In a three-way handshake, the client's ISN is 4000 and the server's ISN is 9000. Give the acknowledgment number in the SYNACK, and the sequence and acknowledgment numbers of the client's final ACK.

Cevabı göster
SYNACK ack = 4001; final ACK seq = 4001, ack = 9001

SYN veri taşımaz ama 1 sıra numarası tüketir. Sunucu SYNACK'te seq = 9000, ack = 4000 + 1 = 4001 gönderir.
İstemcinin üçüncü segmenti: seq = 4001 (kendi ISN'i + 1), ack = 9000 + 1 = 9001.

Soru 8orta

After a handshake with client ISN 7200, the client sends three segments of 1000, 1000 and 600 bytes. What is the sequence number of the third segment, and the ACK number that acknowledges all three?

Cevabı göster
9201; ACK 9801

İlk veri baytı 7201 (SYN 7200'ü tüketti).
1. segment: seq 7201, 1000 bayt → sonraki 8201.
2. segment: seq 8201 → sonraki 9201.
3. segment: seq 9201, 600 bayt → hepsini onaylayan ACK 9801.

Soru 9orta

A TCP header has its data offset (header length) field set to 8. How long is the header, and how many bytes of options does it carry?

Cevabı göster
32 bytes; 12 bytes of options

Data offset 32 bitlik (4 baytlık) kelime sayısıdır: 8 × 4 = 32 bayt. Seçeneksiz TCP başlığı 20 bayt, kalan 32 − 20 = 12 bayt seçenek.

Soru 10zor

A sender transmits four segments with sequence numbers 100, 150, 200, 250 (50 bytes each). The segment with seq 150 is lost; the others arrive. Using cumulative ACKs, which ACK numbers does the receiver send for the three arriving segments, in order?

Cevabı göster
150, 150, 150

100 numaralı segment gelir: 100-149 tamam, ACK 150.
200 gelir ama 150 eksik. Kümülatif ACK "150'yi bekliyorum" der: ACK 150 (birinci tekrar).
250 gelir, hâlâ 150 eksik: ACK 150 (ikinci tekrar). Gönderen aynı ACK'yi tekrar tekrar görür; üç tekrar ACK hızlı yeniden gönderimi tetikler (8. hafta).

Soru 11zor

Why does a protocol like rdt2.1 need sequence numbers even though the channel only corrupts (never loses) packets?

  1. To order packets that arrive out of order
  2. Because a corrupted ACK/NAK forces the sender to retransmit, and the receiver must recognize the duplicate
  3. To compute the checksum
  4. To identify the destination port
Cevabı göster
B) Because a corrupted ACK/NAK forces the sender to retransmit, and the receiver must recognize the duplicate

ACK ya da NAK bozulursa gönderen ne olduğunu bilemez ve paketi yeniden gönderir. Alıcı bu paketi daha önce aldıysa yeni veri sanıp iki kez teslim eder. 1 bitlik sıra numarası (0/1) tekrarı ayırt etmeyi sağlar.

Soru 12orta

During teardown the client sends FIN with sequence number 5501. What acknowledgment number does the server return for it?

Cevabı göster
5502

FIN de SYN gibi veri taşımadan 1 sıra numarası tüketir. Onayı 5501 + 1 = 5502.

Doğrulama: Checksum'lar (16 bit, wraparound ile birler tümleyeni toplamı), seq/ack aritmetiği ve başlık boyutları node ile hesaplandı (verify/SEN2008/07.mjs).

Deftere not kartı

Taşıma katmanı: süreçten sürece (process-to-process). IP: hosttan hosta. Port 16 bit: 0-65535; 0-1023 well-known (HTTP 80, HTTPS 443, DNS 53, SSH 22). UDP soketi = (hedef IP, hedef port). TCP soketi = 4-tuple (kaynak IP, port, hedef IP, port). UDP başlığı 8 bayt: src port, dst port, length, checksum. Bağlantısız, sırasız, güvenilirlik yok. Checksum: 16 bitlik kelimeleri topla, taşan elde en alta eklenir, sonra bitleri ters çevir. Alıcı: veri + checksum toplamı 0xFFFF değilse hata. Checksum her hatayı yakalamaz. TCP başlığı min 20 bayt; data offset × 4 = başlık boyu. Bayraklar: SYN ACK FIN RST PSH URG. seq = segmentteki ilk baytın numarası. ack = beklenen SONRAKİ bayt (kümülatif). ack = seq + veri uzunluğu. SYN ve FIN 1 numara tüketir, saf ACK tüketmez. El sıkışma: SYN(seq=x) → SYNACK(seq=y, ack=x+1) → ACK(seq=x+1, ack=y+1). Kapanış: FIN → ACK → FIN → ACK; FIN'i ilk gönderen TIME_WAIT bekler. rdt: checksum (bozulma) + ACK/NAK + seq no (tekrar) + timer (kayıp) = rdt3.0.