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.
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:
- Port, süreci seçer. IP adresi hostu, port numarası o hosttaki soketi bulur.
- UDP soketi 2 değerle, TCP soketi 4 değerle tanımlanır.
- Checksum: topla, eldeyi başa sar, ters çevir. Alıcıda toplam 0xFFFF çıkmalı.
- ack = beklenen sonraki bayt. Yani
seq + uzunluk. - 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.
| Özellik | UDP | TCP |
|---|---|---|
| Bağlantı | Yok (connectionless) | El sıkışma ile kurulur |
| Güvenilir teslim | Hayır | Evet (ACK + yeniden gönderim) |
| Sıralı teslim | Hayır | Evet |
| Akış kontrolü (flow control) | Yok | rwnd ile var |
| Tıkanıklık kontrolü (congestion control) | Yok | cwnd ile var |
| Başlık | 8 bayt | en az 20 bayt |
| Tipik kullanım | DNS, video/ses akışı, oyun | Web, 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 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:
- Veriyi 16 bitlik kelimelere böl ve topla.
- Toplam 16 biti aşarsa taşan elde (carry) en düşük bite eklenir (wraparound).
- 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üm | Kanal varsayımı | Eklenen mekanizma |
|---|---|---|
| rdt1.0 | Kusursuz kanal | Hiçbir şey, sadece gönder |
| rdt2.0 | Bitler bozulabilir | Checksum + ACK/NAK + yeniden gönderim |
| rdt2.1 | ACK/NAK da bozulabilir | 1 bitlik sıra numarası (0/1) ile tekrar tespiti |
| rdt2.2 | Aynı, NAK’sız | Son doğru paketin numarasıyla ACK (tekrar ACK = NAK) |
| rdt3.0 | Kayıp da olabilir | Zamanlayı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üşünce | Doğrusu |
|---|---|
| ack = alınan son baytın numarası | ack = beklenen sonraki bayt (seq + uzunluk) |
| SYN veri taşımadığı için numara tüketmez | SYN ve FIN 1 numara tüketir |
| TCP segmentleri numaralar | TCP baytları numaralar |
| UDP de soketleri 4-tuple ile ayırır | UDP: (hedef IP, hedef port) |
| Checksum hatayı düzeltir | Sadece tespit eder, o da her zaman değil |
| Taşan eldeyi atarım | Elde en düşük bite eklenir (wraparound) |
| Data offset = bayt cinsinden boy | 4 baytlık kelime sayısı: × 4 |
| TCP gecikme garantisi verir | Ne 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ç.
Which transport-layer protocol provides a reliable, in-order byte stream with connection setup?
- UDP
- IP
- TCP
- ICMP
Cevabı göster
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.
Port numbers are 16-bit fields. How many distinct port numbers exist?
Cevabı göster
16 bit ile 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.
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?
- UDP uses the 4-tuple, TCP uses only the destination port
- Both go to the same UDP socket (identified by destination IP and port); TCP would use separate sockets identified by the 4-tuple
- UDP creates one socket per client; TCP uses one socket for all clients
- Both protocols use only the source port
Cevabı göster
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.
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
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.
A receiver gets the data words 0x3A10, 0x7C05 and the checksum field 0x49AE. Does it detect an error?
Cevabı göster
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ı.
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
ACK numarası, beklenen bir sonraki baytın numarasıdır: 2300 + 700 = 3000. Segment 2300 ile 2999 arası baytları taşır.
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
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.
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
İ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.
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
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.
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
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).
Why does a protocol like rdt2.1 need sequence numbers even though the channel only corrupts (never loses) packets?
- To order packets that arrive out of order
- Because a corrupted ACK/NAK forces the sender to retransmit, and the receiver must recognize the duplicate
- To compute the checksum
- To identify the destination port
Cevabı göster
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.
During teardown the client sends FIN with sequence number 5501. What acknowledgment number does the server return for it?
Cevabı göster
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).