Transmission Control Protocol

Vügar SALAHLI (vugar.salahli@students.comu.edu.tr)
Çanakkale Onsekiz Mart Üniversitesi,
Bilgisayar Mühendisliği Bölümü

15/04/2003, v.0.2b

Bu belgede, TCP paketinin yapısı, özellikleri ve TCP iletişiminin nitelikleri açıklanmıştır.


1. GİRİŞ



TCP yani Transmission Control Protocol yedi katmanlı OSI referans modelinin, aktarım katmanında yer alır. TCP iki hostun birbirleriyle güvenilir ve bağlantılı haberleşmesini sağlar.

Bağlantılı haberlelşme: Bilgisayarlar iletişime geçmeden önce aralarında bir oturum açarlar. Oturumun açılması sırasında bilgisayarlar kendi iletişim parametrelerini birbirlerine iletirler ve bu parametreleri dikkate alarak iletişimde bulunurlar.

Güvenilirlikli Haberleşme: Bilginin karşı tarafa gittiğinden emin olma durumudur. Bu güvenilirlik, bilginin alındığına dair karşı taraftan gelen bir onay mesajı ile sağlanır. Eğer bilgi gönderildikten belli süre sonra bu mesaj gelmezse paket yeniden gönderilir.

Telnet, FTP, SMTP gibi protokoller TCP' yi kullanır.

TCP de tanımlı temel görevleri aşağıdaki gibi sıralayabiliriz:

TCP kendisine atanmış olan bu görevleri yapabilmek amacıyla aktarım katmanında veri parçalarının önüne başlık bilgisi ekler. Başlık bilgisi ve veri parçası birlikte TCP segmenti olarak anılır. Her segmente sıra numarası verilir. Bu segmentler belli sayılarda gönderilir. Alıcı bilgisayar da frameler yani segmentler kendine ulaştıkça bunları tampon belleğine yerleştirir. İki ardışık çerçeve tampon belleğe yerleşince alici bilgisayar gönderilen en son çerçeve için bir onay mesajını gönderici bilgisayara yollar. TCP segmentinde başlık içindeki alanların kullanımı amaçları aşağıdaki gibidir.


Şekil 1.1 TCP Segment Formatı




Bayraklar: Denetim fonksiyonlarını sağlarlar

Port : TCP ve UDP (User Datagram Protocol, TCP den farklı olarak hem bağlantısız, hem de güvensiz bağlantı sağlar. Fakat, TCP ye göre daha hızlıdır) üst protokollerle bağlantıda portları kullanır. TCP kendine gelen paket içerisindeki TCP başlığında yer alan hedef port numarasına bakarak ilgili veriyi bu port ile temsil edilen uygulamaya gönderir. Bu port numaraları hedef port numaraları olarak kullanılır. Hizmet alan uygulamaya port numarası hostun IP adresi ve hedef TCP port numarası göz önünde bulundurularak otomatik olarak o anda atanır.

Pencere Yönetimi: Pencere mekanizması karşı hosttan onay alınmadan önce TCP'nin bir çok segmenti en uygun şekilde iletmesini sağlar. Pencere kullanımı ile akış kontrolü de sağlanmış olur.

Akış Kontrolü: Son uçtan son uca akış kontrolü ile değişken boyutlu pencere uygulamaları geliştirilebilmektedir. TCP'nin güvenlik servislerinden biridir.



2. TCP`nin Ana özellikleri



TCP üst katmanlara aşağıdaki servisleri sağlar:



TCP bağlantı-yönlendirmeli bir protokoldür. Bundan şunu anlarız ki TCP, modülüne giren veya çıkan her bir ‘kullanıcı verisi nehir-akışı` ile ilgili durum ve konum bilgilerini sağlar. TCP aynı zamanda bir ağ veya çoklu ağlar boyunca yerleşmiş bir alıcı kullanıcı uygulaması ile (veya diğer ULP) uçtan-uca veri transferi yapılmasından sorumludur. Şekil 1-1`de TCP`nin, veriyi üç ağ boyunca iki host arasında iletmesi gösterilmiştir. TCP iletim yaparken sıra numaraları ve pozitif acknowledgment`ler kullanır.

İletilen her bir bayt için bir sıra numarası atanır. Alıcı TCP modülü bir toplamsal-hata rutini kullanarak verinin iletim boyunca bir hasara uğrayıp uğramadığını kontrol eder. Eğer veri kabul edilebilir ise, TCP gönderici-TCP modülüne bir pozitif acknowledgment gönderir. Eğer veri hasarlı ise, alıcı-TCP veriyi yok eder ve bir sıra numarası kullanarak gönderici-TCP`ye sorun hakkında bilgi gönderir. TCP zamanlayıcıları tedavi ölçümleri yapmadan önce zaman kaymasının aşırı olmadığından emin olurlar. Tedavi ölçümleri alıcı siteye acknowledgment gönderilerek veya veriyi gönderici siteye yeniden-göndererek yapılır.
 

Şekil 1-1 Aktarım Katmanının Diğer Katmanlarla İlişkisi


TCP, veriyi bir ULP`den nehir-yönlendirmeli biçimde alır. Nehir-yönlendirmeli protokoller ayrık karakterler (blok, çerçeve veya datagram değil) göndermek üzere tasarlanmamışlardır. Baytlar bir ULP`den nehir temelli, yani bayt-bayt gönderilir. Baytlar TCP katmanına varınca, TCP segmentleri olarak gruplaşırlar. Bu segmentler daha sonra diğer varışa iletilmek üzere IP`ye (veya başka bir alt-katman-protokolüne) geçirilir. Segment uzunluğuna TCP karar verir, ancak bir sistem geliştiricisi TCP`nin bu kararı nasıl  vereceğine karar verebilir.

TCP ayrıca ikilenmiş veri kontrolü yapar. Eğer gönderici TCP veriyi tekrar yollarsa, alıcı TCP tüm ikilenmiş gelen veriyi yok eder. örneğin, alıcı TCP acknowledgment trafiğini belli bir zamanda gerçekleştirmezse, gönderici TCP veriyi yeniden gönderir ve veri ikilenmiş olur.

TCP push fonksiyonu kavramını destekler. Bir uygulama; alt katmandaki TCP`ye geçirdiği tüm verinin iletildiğinden emin olmak istediğinde push fonksiyonunu çalıştırılır. Böylece, push fonksiyonu TCP`nin tampon yönetimini ele geçirir. ULP push`u kullanmak için, push parametresi bayrağı 1`e set edilmiş bir send komutunu TCP`ye gönderir. Bu işlem TCP`nin, tüm tamponlanmış trafiği bir veya daha fazla segment içerisinde varışa ilerletmesini gerektirir. TCP kullanıcısı bir close-bağlantı işlemi kullanarak da push fonksiyonunu sağlayabilir.

TCP acknowledgment`ler için sıra numaraları kullanır. TCP bu sıra numaralarını aynı zamanda, segmentlerin son varışa sırası ile varıp varmadıklarını kontrol etmek üzere, segmentleri yeniden-sıralamada kullanır. TCP bağlantısız bir sistemin üzerinde yer aldığı için ki bu sistem internet içerisinde dinamik, çoklu rotalar kullanabilir, internette ikilenmiş datagramların oluşması muhtemeldir. Daha önce değindiğimiz gibi, TCP ikilenmiş datagramlar içerisinde taşınmış, ikilenmiş segmentleri yok eder.

TCP her bir oktete sıra numarası verir. Daha sonra ilettiği bu oktetlere karşılık acknowledgment (ACK) bekler. Eğer belirli aralıklarla beklenen ACK`leri almazsa ACK almadığı kısımları yeniden varış host`a iletir. TCP olumsuz bir geri bildirim mekanizması kullanmaz.

Alıcı TCP modülü gönderici verisi üzerinde akış kontrolü yapabilir. Böylece tampon overrun ve alıcı cihazın doyması (saturation) gibi sorunlar engellenir. TCP`nin kullandığı kavramın, haberleşme protokollerinde kullanımı alışılmış değildir. Akış kontrolü göndericiye bir "pencere" değeri verilmesine dayanır. Gönderici bu pencere ile belirlenmiş sayıda bayt iletebilir, pencere kapanınca gönderici veri göndermeyi durdurmalıdır.
TCP`nin bir hüneri de host cihazı üzerindeki çoklu kullanıcı oturumlarını çoğullayabilmesidir. çoğullama; TCP ve IP modüllerindeki portlar ve soketler için basit isimlendirme anlaşmaları kullanılarak gerçekleştirilir. TCP, iki TCP varlığı arasında tam-duplex iletim sağlar. Böylece bir dönüş işareti beklemeksizin (half-duplex`te gereklidir) eşzamanlı iki-yönlü iletim yapılır.

TCP kullanıcının bağlantı için güvenlik ve öncelik seviyeleri belirleyebilmesine olanak tanır. Bu iki özellik, tüm TCP ürünlerinde bulunmayabilir ancak TCP DOD standardında tanımlanmışlardır. TCP iki kullanıcı arasında hoş close sağlar. Hoş close bağlantı koparılmadan önce tüm trafiğin ACK`larının oluşturulduğundan emin olunmasını sağlar.




3. Portlar ve Soketler



Host cihazındaki bir TCP üst-katman kullanıcısı bir port numarası ile tanımlanır. Port değeri IP internet adresi ile birleşerek bir soket oluşturur. Bu değer internet boyunca tek olmalıdır. Bir soket çifti her bir uç-nokta bağlantısını tek olarak tanımlar. örneğin,
 
Gönderici Soket = Kaynak IP Adresi + Kaynak Port Numarası numarası
Alıcı soket = Hedef IP Adresi + Hedef Port Numarası

Portları yüksek-katman işlemleri için haritalamak bir host`un iç sorunu olarak ele alınsa da, Internet sıklıkla kullanılan yüksek-katman işlemlerinin numaralarını yayınlar. Tablo 1-1`de yaygın kullanılan port numaraları; isimleri ve tanımları ile birlikte listelenmiştir.

TCP sıklıkla kullanılan portlar için özel numaralar saptamasına rağmen, 255`in üzerindeki değerler özel olarak kullanılabilir. 255`in üzerindeki değerlerin daha-az anlamlı 8-biti 0`a set edilmiştir ve organizasyonlar bunları istedikleri yönde kullanırlar. 0-255 arası numaralar her zaman rezervedir.

Tablo 1-1 Yaygın Internet Port Numaraları

Port atama ve port sağlama örnekleri

Şekil 1-2`de iki host arasında port numaralarının nasıl atandığı ve yönetildiği görülmektedir. Birinci olayda, A host`u, C host`una bir TCP segmenti gönderir. Bu segment bir yüksek-seviye prosesi ile haberleşmek için bir TCP bağlantısı isteğidir. Burada SMTP`ye atanmış port 25 istenmektedir. Varış port değeri 25 olarak sabitlenmiştir. Ancak, kaynak port tanımlayıcısı bölgesel bir sorundur. Bir host cihazı iç işlemleri için herhangi bir uygun numara seçebilir. İkinci bağlantı ise, (şekilde 2 rakamı ile gösterildi) SMTP`yi kullanmak üzere C host`una yapılmıştır. Neticede, varış portu 25 aynıdır. Kaynak port tanımlayıcısı farklıdır; bu durumda 401`e set edilmiştir. SMTP erişimi için iki farklı numaranın kullanılması A host`u ve C host`undaki iki oturum arasında bir karışıklık olmasını engeller.

Şekil 1-2 Varış Portu Kullanarak bir Oturumun Kurulması

Şekil 1-3`de, Şekil 1-2`deki iki segmentin nasıl bağlantı kurduğu gösterilmektedir. A ve C host`ları tipik olarak TCP bağlantıları ile ilgili bilgileri port tablolarında saklarlar. Dikkat edilirse bu tabloların kaynak ve varış değerleri arasında ters bir ilişki vardır. A host`unun port tablosunda, kaynaklar 400 ve 401, ve iki varış da 25`dir. C host`unda ise iki kaynak da 25, ve varışlar 400 ve 401`dir. Bu suretle, TCP modülleri ileri ve geri haberleşebilmek için kaynak ve varış port numaralarını terslerler.

Murphy kanunları TCP için bile geçerlidir. Başka bir host`un C host`una aynı kaynak ve varış port değerleri ile bir bağlantı isteği göndermesi olasıdır. Varış port değerlerinin aynı olması olağandışı değildir. çünkü iyi-bilinen portlara sıklıkla ulaşım isteği vardır. Bu durumda, varış portu 25 SMTP`yi tanımlayacaktır. Kaynak port tanımlayıcıları bölgesel bir olay olduğundan Şekil 1-4`te de gördüğümüz gibi B host`u kaynak portunu 400 olarak seçmiştir.

Şekil 1-3 Port Numaralarının Sağlanması

Şekil 1-4 Port Tanımlayıcılarının Ayrıştırılması

Ek bir tanımlayıcı olmaksızın, A ve C host`ları arasındaki ve B ve C host`ları arasındaki bağlantılarda çakışma olacaktır çünkü her iki bağlantı da aynı varış ve kaynak port numaralarını kullanmaktadır. Bu gibi durumlarda, C host`u datagramların IP başlıklarındaki IP adreslerini kullanarak ayrımı kolayca başarır.  Bu durumda kaynak portları ikilenir ancak internet adresleri oturumları farklılaştırır.

çoğu sistem IP adresleri ve port numaralarına ek olarak bir protokol ailesi değeri kullanarak ayrıca bir soket tanımlar. örneğin, IP bir protokol ailesidir; DECnet de bir başkasıdır. Hangi protokol ailelerinin tanımlanacağı olayı satıcı ve işletim sistemine bağlıdır.


Çoğullamayı desteklemek üzere soketlerin kullanımı

Port numaraları birden fazla uç-nokta bağlantısı için kullanılabildiğinden, kullanıcılar bir port kaynağını eşzamanlı olarak paylaşabilir. Şöyle ki, birçok kullanıcı eşzamanlı olarak bir port üzerinde çoğullanabilir. Şekil 1-4`te, üç kullanıcı port 25`i paylaşmaktadırlar (daha sonra açıklayacağımız UDP de port çoğullamasını destekler).


Pasif ve Aktif Open`lar

TCP portları ile iki şekilde bağlantı kurulmasına izin verilir. Bunlar  pasif-open ve aktif-open`dır. Pasif-open modu ULP`ye (örneğin bir sunucu); TCP ve host işletim sistemine, uzak sistemden (örneğin bir istekçi prosesi) bağlantı isteği beklemelerini söyleme izni verir. Bu durumda TCP ve host işletim sistemi bir aktif-open yayınlamak yerine bağlantı isteği bekler. Host işletim sistemi bu isteği alınca, bu uca bir tanımlayıcı atar. Bu özellik bir aktif-open gecikmesi ile karşılaşmaksızın uzak kullanıcıların haberleşmesini sağlamak için kullanılabilir.

Pasif-open isteyen bir uygulama prosesi, her kullanıcıdan (gereksinimlerle eşleşen bir profil veren) bağlantı isteği kabul edebilir. Eğer hiç bir çağrı kabul edilebilir değilse (profil eşleşmesiz), yabancı soket numarasının tümü 0`larla doldurulur. özelleşmemiş yabancı soketlere yalnızca pasif-open`larda izin verilir.

Bağlantı kurulmasının ikinci şekli aktif-open`dır. Aktif-open, ULP bir bağlantı kurulması için özel bir soketi görevlendirdiğinde kullanılır. Tipik olarak, aktif-open bir pasif-open porta bir bağlantı kurulması için yayın yapar.

İki aktif-open birbirlerine aynı zamanda yayın yapsalar dahi, TCP bağlantıyı kurar. Bu özellik; uygulamaların, başka bir uygulamanın aynı zamanda bir open yayınlaması ile ilgilenmeksizin, herhangi bir zamanda open yayınlamalarına olanak sağlar.

TCP aktif- ve pasif-open`ların beraber kullanımına ilişkin anlaşmalar sağlar. Birincisi, bir aktif-open özel bir soket ve, opsiyonel olarak, bu soketin öncelik ve güvenlik seviyelerini tanımlar. TCP bir open`ı, eğer uzak soket eşleşen bir pasif-open`a sahipse veya eğer uzak soket eşleşen bir aktif-open yayınlamışsa, kabul eder. Bazı TCP uygulamaları iki tip pasif-open tanımlamaktadır.

Tam tanımlı pasif-open: Aktif- ve pasif-open`daki varış adresi aynıdır. Böylece, bölgesel pasif-open işlemi yabancı soketi tamamen tanımlamıştır. Aktif-open`ın güvenlik parametresi pasif-open`ın güvenlik parametresi aralığındadır.

Tanımlanmamış pasif-open: Adreslerin eşleşmeye ihtiyacı yoktur, fakat güvenlik parametreleri kabul edilebilir bir aralıkta olmalıdır. Alternatif olarak, hiçbir güvenlik parametresi kontrol edilmeyebilir.

Bir open sırasında az yada hiçbir gerçeklik istemeyen bir TCP prosesi örneği anonymous FTP`dir. Bu servis Internetteki çeşitli organizasyonlar tarafından sunulur. Kullanıcının FTP sunucusuna kendini "quest" gibi bir password`la tanımlamasını gerektirir ki, aslında bu bir password değildir.



4. İletim Kontrol Bloğu (Transmission Control Block)



TCP`nin her bağlantı için çeşitli parametreleri hatırlaması gerektiğinden, TCP bir iletim kontrol bloğunda (TCB) bilgiler saklar. Aşağıdaki girişler TCB`de saklanır:

TCB aynı zamanda gönderme ve alma sıra numaraları (sequence number) ile ilgili belirli değişkenler içerir. Bu değişkenler Tablo 1-2`de anlatılmıştır. Sıradaki bölümde bunların nasıl kullanıldıklarını anlatacağız.

Tablo 1-2  Gönderme ve Alma Değişkenleri

1.5 TCP Pencere ve Akış-Kontrol Mekanizmaları


Tablo 1-2`deki değerleri kullanarak, bu bölümde TCP/IP`nin iki bağlantı uç noktası arasında nasıl akış-kontrol mekanizmaları sağladığını göreceğiz. Bu analize başlamak için, Şekil 1-5`i inceleyelim. A ve B ile etiketli kutular iki TCP modülünü göstermektedir. A modülü, B modülüne iki veri birimi (veya iki bayt) gönderiyor (aslında, yalnızca iki oktet göndermek olağan bir şey değildir ancak bu örnek olayı basitleştirmektedir). Bu segmentler SEQ = 1 ve SEQ = 2 olarak etiketlidir. Bu transferin etkisi şeklin altındaki  kutudaki gönderme değişkenleri incelenerek görülebilir. SND UNA değişkeni baytların henüz onaylanmadığını gösterir (bayt 2). Ancak değişken isminin altındaki okların gösterdiği gibi bu aralıktan küçük değerler gönderilmiş ve onaylanmıştır (bayt 0). Daha büyük sayılar (bayt 1 ve 2) gönderilmiş ancak onaylanmamıştır. SND NXT gönderilecek diğer oktetin sıra numarasını tanımlar (bayt 3). Pencere limit işaretçisi pencere kapanmadan önce gönderilebilecek en büyük sayıyı verir. SND WND değeri TCP pencere segment alanından türetilir. Şekil 1-5`in altındaki kutuda, pencere limiti SND UNA + SND WND olarak hesaplanmıştır. Bu değer 5`tir çünkü SND UNA = 2 ve SND WND = 3`dür.

A modülü 1 ve 2 birimini gönderdiği için, kalan gönderme penceresi 3 birimdir. Şöyle ki, A 3, 4, 5. birimlerini iletebilir ancak 6 birimini iletemez. Bu pencere şekilde kutu içine alınmıştır.

Şekil 1-5 TCP Gönderme Penceresi Değişkenleri

TCP pencere kontrolü için yalnızca ACK numarası kullanmaz. Hemen önce dediğimiz gibi, TCP`nin segmentinde taşıdığı ayrık bir numara vardır ve gönderici bilgisayarın gönderme penceresini azaltır veya arttırır. Bu kavram B`nin A`ya bir segment gönderdiği Şekil 1-6`da gösterilmiştir. Segment; 3 ACK alanı ve 6 gönderme penceresi alanı içerir. ACK alanı basitçe önceki trafiği onaylar. Yalnız başına kullanılırsa, A`nın penceresini arttırmaz, azaltmaz, açmaz, veya kapamaz. Pencere yönetimi, gönderme penceresi alanının görevidir. Gönderme penceresinin 6 değerini alması A`nın; 6 değeri artı ACK değeri kadar oktet göndermeye izinli olduğunu belirtir. Yani, pencere limiti = ACK + SND WND olur. Bu şeklin altında gösterildiği gibi, pencere limiti 9 (3+6)`dır. Böylece pencere şekildeki kutu içerisindeki alanda gösterildiği gibi genişletilmiştir.

Şekil 1-6 Bir Pencere Güncellemesinin Sonuçları

Pencere büyüklüğü B bilgisayarı tarafından azaltılabilir. Gönderme penceresi alanı pencerenin genişletilmesine veya daraltılmasına izin verir. Bu yaklaşım ACK alanını hem trafik-ACK`sı için hem de pencere-kontrol işlemleri için kullanmaktan daha esnektir (dikkat edelim ki pencerenin daraltılması trafik akışını feci bir şekilde etkileyebilir).

TCP iletim penceresi kapalı olsa bile acil veri segmenti gönderebilir. Acil veri iletme ihtiyacı varsa segmentin acil biti 1`e set edilmelidir.




5. Yeniden İletim İşlemleri



TCP`nin her bir bağlantı trafiğini sağlamak için tek bir yöntemi vardır. Diğer birçok protokolün tersine, belirgin bir negatif ACK`ye (NAK) sahip değildir. Ancak, ileten varlığın pozitif-ACK`sını almadığı veriler için bir timeout ve retransmit (yeniden-iletim) verisi yayınlamasına dayanır. Bu kavram Şekil 1-7`de gösterilmiştir ve bu şekildeki sekiz işlem kalın sayılarla etiketlidir (1`den 8`e). Bu işlemlerin her biri sıra ile açıklanacaktır. Basit olması açısından Şekil 1-5 ve 1-6`daki pencere değerleri ve işaretçileri Şekil 1-7`ye dahil edilmemiştir.

Olay 1: TCP cihazı A, TCP cihazı B`ye 300 baytlık bir segment gönderir. Bu örnekte 900 oktet bir pencere ve 300 oktet bir segment büyüklüğü varsayılmıştır. Sıra (SEQ) numarası 3 değerini içerir.

Olay 2: TCP B, trafiği hatalar açısından kontrol eder ve 303 değerinde bir ACK`yi geri gönderir. Hatırlayalım ki, bu değer 302`ye kadar (302 de içinde) tüm trafiği onaylayan dahili bir ACK`dır. Olay 2`de gösterilen oktan anlaşılacağı gibi, trafik segmenti olay 3 olduğunda hala TCP A`ya varamamıştır (okun ucu A`nın yerine daha gelememiştir ).

Olay 3: TCP A`nın penceresi hala açık olduğundan, 303 numarası ile başlayan başka bir veri segmenti gönderir. çeşitli sebeplerden dolayı, bu trafik segmenti TCP B`ye ulaşamamıştır.

Olay 4: Olay 2`de iletilen ACK segmenti TCP A`ya  vararak TCP B`nin 303 numarası ile başlayan bir segment beklediğini belirtir. Bu noktada, TCP A, olay 3`te ilettiği trafiğin alındığını veya bir internet içerisindeki değişken gecikmelerle hala varmadığını veya bunların tersini bilemez. Netice olarak, bu olay 5`le devam eder.

Olay 5: TCP A 603 numarası ile başlayan sıradaki segmenti yollar. Bu TCP B`ye hatasız varır.

Olay 6: TCP B olay 5`te iletilen 603  numaralı segmenti başarı ile alır. TCP B sonra ACK 303`lü bir segment geri yollar çünkü hala 303 numaralı segmenti beklemektedir.

Olay 7: Nihayet, TCP A`nın zamanı dolar ve ACK`sını alamadığı segmentleri yeniden gönderir. Bu örnekte, 303 ve 603`le başlayan segmentleri yeniden yollamalıdır.

Olay 7`de gösterilen fikrin avantajları ve dezavantajları vardır. Bu protokolü oldukça basit yapar, çünkü TCP son ACK`lanmamış segmente bakar ve tüm bunu izleyen segmentleri yeniden iletir. Diğer taraftan, hatasız giden segmentleri yeniden iletmesi olasılığı vardır, örneğin 603 numarası ile başlayan segment gibi ki bu hatasız olarak TCP B`ye varmıştı. Bununla beraber, TCP basitlik uğruna bu biçimde çalışarak, azaltılmış akış riskini göze almıştır.

Olay 8: TCP B 303 ve 603 segmentlerini alınca ve hata kontrollerini yapınca tüm trafik açıklanmış (accounted) olur ve TCP B, 903 değerinde bir ACK`yı geri gönderir.

Şekil 1-7 TCP Yeniden-İletim Şeması




6. TCP ve Kullanıcı Arabirimleri



TCP üst-katman kullanıcıları ile arabirim sağlamak için servis tanım/primitive kavramını kullanır. Arabirim Tablo 1-3`te özetlenen komut ve mesajlar ile sağlanır. Dikkat etmek gerekir ki primitive`ler soyuttur ve asıl gerçekleştirilişleri host`un işletim sistemine bağlıdır. Ayrıca, RFC(Request For Comment) 793 bu arabirimleri genel olarak tanımlar, ancak satıcılar arabirimleri farklı şekillerde gerçekleştirebilirler. Şekil 1-8`de ULP, TCP, ve IP arasındaki ilişki gösterilmiştir.

TCP ve alt-katmanları arasındaki servis tanımlamaları TCP standartlarınca belirlenmemiştir. TCP işlemlerinde şöyle farz edilir ki TCP ve alt-katman birbirlerine bilgileri eşzamansız olarak iletebilirler. TCP alt-katmanının bu arabirimi tanımlamasını bekler (OSI modeli de aynı pratiği takip etmektedir). Eğer IP TCP`nin altında ise bu alt-katman arabirimini IP özellikleri tanımlar.

Tablo 1-3 Tipik TCP Kullanıcı Arabirimleri

 

Şekil 1-8 üst Katman, TCP, ve IP`nin İlişkileri




7. Segmentler



İki TCP modülü arasında değiştirilen PDU`lara  segment denir. Şekil 1-9`da bir segmentin formatı verilmiştir. Segmentin alanlarını bu bölümde inceleyeceğiz.

Segment başlık ve veri olmak üzere iki parçaya ayrılır. Şekil 1-9`da gösterildiği gibi, veri başlığın ardından gelir. Segmentin ilk iki alanı kaynak port ve varış porttur. Bu 16-bit alan TCP bağlantısını kullanarak üst-katman uygulama programlarını tanımlamada kullanılır.

Sıra numarası (sequence number (SEQ)) olarak etiketlenmiş alanın değeri ileten modülün bayt-nehrinin yerini belirtir. TCP bilindiği üzere üst katmandan aldığı veriyi segmentlere böler. Bu segmentlerin her biri genellikle tek bir IP paketi içinde taşınır. TCP, her bir segmente bir numara verir. Amaç, ağlar üzerinde dolaşan bu segmentlerin hedefe varış sıralarının karışması durumunda hedef host`ta çalışan TCP protokolünün bunları tekrar uygun şekilde birleştirip üst katmana sunabilmesinin sağlamaktır (segment boyları sabit değildir).

TCP, karşı TCP ile bağlantıyı ilk kurduğunda, ilk gönderdiği segmente bir numara verir. Bu numaraya başlangıç gönderi sırası (initial send sequence (ISS)) denir. Sıra  numarası 0 ile 231 değeri arasında olabilmektedir.

Şekil 1-9

TCP Segmenti (PDU)

TCP, verideki baytları gruplayarak segmentleri oluşturur ve her bir segment ayrı bir numara ile numaralandırılır. Bir segment, bir numara aldığında bu segment numarasını içinde barındırdığı ilk oktete verir. İçinde barındırdığı diğer oktetlere ise bu numaraların artanlarını verir. Bu segmentten sonra gelen segmentin alacağı numara, bir önceki segmentin içindeki en son oktetin aldığı numaranın bir fazlası olacaktır. Bu sıra numaraları segment başlığı içinde taşınır.

Acknowledgment numarasına bir değer atanarak önceden alınan verilerin onaylanması sağlanır. Bu alandaki değer, ileticiden gelmesi beklenen, bir sonraki baytın sıra numarası değerini belirtir. Bu numara beklenen oktet için set edildiğinden, dahili bir onay kapasitesi sağlar. Şöyle ki, bu değer bu numaraya kadar olan oktetleri ve bu numaralı okteti de onaylar (dikkat edelim ki, onaylanan oktet sayısı ACK numarası-1 adettir).

Veri offset alanı, TCP başlığını oluşturan, 32-bit sıralı kelimelerin sayısını belirtir. Bu alan, veri alanının nerede başladığının tespitinde kullanılır.

Tahmin ettiğiniz gibi, reserved alanı rezerve edilmiştir. 0`a set edilmesi gereken 6 bitten oluşur. Bu bitler gelecekte kullanılmak için saklanmaktadır. Sıradaki altı alana bayraklar denir. TCP`nin kontrol bitleri olarak kullanılırlar ve oturumlar sırasında kullanılan bazı servis ve işlemleri belirtirler. Bitlerin bazıları başlığın diğer alanlarının nasıl yorumlanacağını belirtir. Bu altı bit aşağıdaki bilgileri ifade eder:

URG:Bu bayrak, urgent işaretçisi (acil işaretçisi) alanının anlamlı olup olmadığını belirtir.
ACK: Bu bayrak, acknowledgment alanının anlamlı olup olmadığını belirtir.
PSH: Bu bayrak, modülün push fonksiyonunu işletip işletmeyeceğini belirtir.
RST: Bu bayrak, bağlantının resetlenmesi gerektiğini bildirir.
SYN: Bu bayrak, sıra numaralarının eşzamanlamasının oluşturulmaya çalışıldığını bildirir. SYN bayrağı, bağlantı-kurma segmentlerinde handshaking işlemlerinin oluştuğunu belirtmek için kullanılır.
FIN: Bu bayrak göndericinin gönderecek başka verisi kalmadığını belirtir.

Diğer alan window (pencere) olarak etiketlenmiştir. Değeri, alıcının kaç tane oktet almayı beklediğini gösterir. Bu değer atanırken ACK alanındaki değere dayanılır. Window alanındaki değer, ACK alanındaki değere eklenir ve göndericinin iletmek istediği veri miktarı hesap edilir.

Checksum alanı başlık ve metin de dahil olmak üzere segmentteki tüm 16-bit kelimelerin 1`e tümlenmiş bir toplamını içerir. Checksum  hesabının yapılmasındaki amaç segmentin vericiden bozulmaksızın geldiğine karar vermektir. UDP`nin kullandığına benzer bir sözde-başlık kullanır ki bu sözde-başlığı UDP bölümünde açıklayacağız.

Sıradaki alan acil işaretçisi (urgent pointer)`dir. Bu alan yalnızca URG bayrağı set edildiğinde kullanılır. Acil işaretçisinin amacı acil verinin yerleştiği veri baytını belirtmektir. Acil veriye band-dışı veri de denir. TCP acil veri için ne yapılacağını dikte etmez; bu uygulamaya-özeldir. TCP yalnızca acil verinin nereye yerleştirildiğini belirtir. Acil veri, en azından, nehirdeki ilk bayttır; işaretçi aynı zamanda acil verinin nerede bittiğini de gösterir. Alıcı, acil verinin geldiğini, derhal TCP`yi kullanan uygulamaya haber vermelidir. Acil veri, interrupt`lar, checkpoint`ler, terminal kontrol karakterleri, vs. gibi kontrol işaretleri olabilirler.

Opsiyon alanı TCP`ye gelecekte yapılacak eklemeler düşünülerek tasarlanmıştır. IP datagramlarındaki opsiyon alanına benzer bir biçimde yapılandırılmıştır. Her bir opsiyon içeriği; tek bir bayttan oluşur ki, bu bayt bir opsiyon numarası, opsiyon uzunluğunu içeren bir alan, ve opsiyon değerinin kendisini içerir. Opsiyon alanının kullanımı oldukça sınırlıdır. Şu anda, TCP standardı için yalnızca üç opsiyon tanımlıdır.



8. TCP Bağlantı Yönetim İşlemleri



TCP konum-sürümlü bir protokoldür. İşlemleri (nasıl ve ne zaman TCP varlıkları arasında özel segment alışverişi yapılacağı gibi) birçok kurala uymalıdır. Bu kurallar bir konum-geçiş diyagramı üzerinde anlatılmıştır. TCP bağlantı yönetim işlemlerinin genel bir gösterilimi Şekil 1-10`da  mevcuttur. Bu şekli TCP`nin belirli özelliklerini açıklamak için kullanacağız.

TCP işlemlerine örnekler

TCP`nin open, veri transferi ve close işlemleri aşağıdaki bölümlerde anlatılacaktır. Bu TCP işlemlerini anlatmaya geçmeden önce bir haberleşme protokolündeki, type (tip) ve instance (örnek) terimlerini tanımamız gerekir.

Bir tip, bir objeyi tanımlar. Bu örnekte, TCP bir objedir. Bir instance, bir objenin görünmesidir. Böylece, TCP her çağrıldığında, kendisini gösterir. Birçok kullanıcı prosesi eşzamanlı olarak TCP`yi kullanabildiğinden, her bir kullanıcı oturumu TCP mantığını çağırır, ve her bir çağırma TCP tipinin bir instance`dir. Daha pragmatik terimlerle, her bir kullanıcı TCP çağrısı, bazı TCP servislerinin bir oturumu desteklemek üzere icra edilmesini gösterir. Her bir TCP  instance`i, TCP`nin olay hakkında sürekli bilgilendirilmesini gerektirir. Her bir kullanıcı oturumunun bu bilgi parçaları TCP`de tutulur.

Şekil 1-10 TCP Bağlantı Yönetim Konum Diyagramı

TCP Open İşlemleri

Şekil 1-11`de bağlantı kuran iki TCP varlığı arasındaki ana işlemler gösterilmiştir. TCP A`nın kullanıcısı TCP`ye bir aktif-open primitive`i göndermiştir. Uzak kullanıcı kendi TCP sağlayıcısına bir pasif-open göndermiştir. Bu olaylar, sırası ile 1 ve 2 olayları olarak belirtilmiştir. Bu olaylardan her ikisi de diğerinden daha önce olmuş olabilir.

Şekil 1-11 TCP Open İşlemleri


Bir aktif-open meydana getirmek için TCP A`nın; SYN bayrağı 1`e set edilmiş bir segment hazırlaması gerekir. SYN SEQ 100 olarak kodlanmış segment, TCP B`ye gönderilir (şekilde 3 olarak etiketlenmiştir). Bu örnekte, sıra numarası (SEQ) 100, ISS numarası olarak kullanılmıştır. En yaygın yaklaşım ISS değerini 0 yapmaktır ancak daha önce tartıştığımız kurallara dayanarak ISS değeri herhangi bir sayı seçilebilir ve bu örnekte de ISS = 100 seçilmiştir. SYN kodlaması basitçe SYN bayrağının 1`e set edildiğini gösterir.

TCP B, SYN segmentini alınca 101 sıra numaralı bir acknowledgment`i geri gönderir. Aynı zamanda kendi ISS numarası 177`yi gönderir. Bu olay, 4`le etiketlenmiştir. Bu segmentin alınması ile, TCP A acknowledgment numarası 178`i içeren bir segmentle onay yollar (şekilde olay 5 olarak gösterildi).

Olay 3, 4, ve 5 ile bu handshaking işlemleri oluşunca (ki buna üç-yollu handshake denir), iki TCP modülü, olay 6 ve 7`de olduğu gibi, kendi kullanıcılarına open`lar gönderirler.

Şimdi Şekil 1-12`yi kullanarak, Şekil 1-11`deki işlemlerin Şekil 1-10`daki konum diyagramı kuralları ile ilişkisini gösterebiliriz. Şekil 1-10`daki bilgi yoğunlaştırılıp yeniden çizilerek Şekil 1-12 oluşturulmuştur. Şekil 1-12`de open işlemlerinin segment alışverişleri ve konum geçişleri ile ilişkisi gösterilmiştir. Şeklin en üstü, Şekil 1-11`den türetilmiştir ancak yalnızca iki TCP varlığı arasındaki segment akışını içerir, her bir cihaz içindeki üst ve TCP katmanları arasındaki işlemleri içermez.

Şekil 1-12`nin alt tarafında open`ın konum diyagramının ilgili kısmı gösterilmiştir. Etiketler kalın yazı ile A, B, A-3, A-4, B-3 olarak gösterilmiştir. Bu işaretçiler şeklin üstündeki kalın yazılmış olay numaraları ile eşlenerek; her bir TCP modülünün segmentleri ve konum diyagramlarını nasıl kullandığını göstermek için kullanılabilir.

Şekil 1-12`deki işlemlerin takibine yardımcı olması için, şeklin üst tarafındaki 3 olarak etiketli olaya bakalım. Burada TCP A`nın SYN SEQ 100 yayınladığı görülür. Bu segmentin iletimi öncesi, TCP A bu özel kullanıcı oturumu için CLOSED konumundadır. TCP A, segmenti TCP B`ye gönderdikten sonra konumunu SYN-SENT olarak değiştirir, ve bağlantı için, konum diyagramında gösterildiği gibi, bir TCB girişi oluşturur.

Şekil 1-12 Open İşlemleri, Segment Alışverişi, ve Konum Geçişlerinin İlişkisi


Bundan sonra, diyagramın altına bakalım. A notasyonu TCP A`nın bu kullanıcı oturumu açısından CLOSED konumunda olduğunu gösterir. A-3 ile etiketlenmiş konum geçişi, şeklin üzerinde 3 olarak etiketli TCP A`nın segment yayını ile eşleştirilmiştir. Segment yayınlanınca, TCP A SYN-SENT konumuna girer ve bağlantı için, konum diyagramında gösterildiği gibi, bir TCB girişi oluşturur.

Şimdi TCP B`yi inceleyeceğiz. Şeklin üst kısmında gösterildiği gibi, TCP B LISTEN konumundadır. Konum diyagramında LISTEN konumu B olarak etiketlenmiştir. Diyagramın üst kısmında görüyoruz ki SYN SEQ 100 segmentini alınca, TCP B SYN-RECEIVED konumuna geçer. Bu olaylar konum diyagramında B-3 etiketi ile gösterildi. Şeklin üstünde, olay 4`te ve şeklin altında  B-4`te; TCP B`nin SYN ve ACK geri yolladığını görüyoruz.

Şekil 1-12 üzerindeki analiz şeklin üst ve alt parçalarındaki numara ve olaylar eşlenmeye devam edilerek ilerletilebilir.

TCP`ye yeni başlayan biri sıklıkla ‘TCP modülü kapalı bir TCP soketini başlatabilir mi?` sorusunu yöneltir. Yani, bir bağlantı oluşmadan önce orada bir pasif-open olmalı mıdır? TCP aslında kapalı soketlere open yayınlanmasına müsaade eder. Şekil 1-13`de bu aktivite ve eşzamanlı olarak iki TCP modülünden yayın yapıldığında TCP`nin open`ları nasıl kabul ettiği gösterilmiştir. Kapalı bir TCP soketine bir open yayınlamak ile ilgili soruyu yanıtlamak için, ana gereksinimler şunlardır: Open çağrısı bölgesel ve yabancı soket tanımlayıcılarını içermelidir. Open çağrısı aynı zamanda öncelik, güvenlik ve kullanıcı timeout bilgisi içerebilir. Eğer bu bilgiler mevcut ise, TCP modülü SYN segmentini yayınlar. Şekil 1-13`te, open`lar A ve B`den  yaklaşık olarak aynı anda yollanmıştır. Bu şekildeki olaylar şöyle gelişir:

Şekil 1-13 Closed Konumlara Eşzamanlı Open Yayınlanması


Olay 1: TCP modülleri bu open`ları alınca, bağlantı bilgisini tutmak üzere yeni iletim kontrol blokları yaratırlar.

Olay 2: TCP A ve B de SYN segmentlerini yaklaşık olarak aynı zamanda göndermişlerdir. Bu şekilde okların pozisyonu trafiğin göreceli zaman sırasını göstermek için kullanılmıştır. Böylece TCP B`nin segmenti TCP A`ya ulaştığında daha TCP A`dan gönderilen SYN segmenti TCP B`ye varmamıştır.

Olay 3: Sonuçta TCP A`dan gönderilen SYN segmenti TCP B`ye varır. Olay 2`deki SYN segmentlerinin sonuçları iki TCP modülünün CLOSED`dan SYN-SENT`e ve SYN-RECEIVED`e geçmesidir.

Olay 4 & 5: İki TCP modülü de, SYN segmentlerini onaylamak üzere, birer ACK segmenti yayınlarlar. Olay 5`teki  TCP B`nin segmenti olay 4`teki TCP A`nın segmentinden önce varır. TCP`nin bu eşzamansız yönü bir internet içerisinde değişken gecikmelere sebep olur. Gecikme her iki yönde de değişir.

Olay 6: ACK`nın TCP A tarafından alınması ile (olay 5), TCP A ULP`sine bir bağlantı open işareti yollar.

Olay 7: TCP A`dan gönderilen ACK segmenti sonunda TCP B`ye ulaşır.

Olay 8: Bağlantıyı tamamlamak üzere, TCP B ULP`sine bir bağlantı open gönderir.

TCP Veri Transfer İşlemleri

Şekil 1-14`de bir bağlantıyı başarı ile kurmuş olan iki TCP varlığı gösterilmiştir. Olay 1`de ULP A, TCP A`ya iletim için bir SEND primitive`i ile veri gönderir. Farz edelim ki 50 bayt gönderildi. Olay 2`de görüldüğü gibi, TCP A bu veriyi bir segment haline getirir (paketleme yapar) ve segmenti TCP B`ye sıra numarası 101 ile gönderir. Hatırlayalım ki bu sıra numarası kullanıcı veri nehrinin ilk baytını tanımlar.

Şekil 1-14 TCP Veri Transfer İşlemleri


Uzak TCP`de, olay 3`te veri kullanıcıya (ULP B) teslim edilmiştir. TCP B, olay 4`te gösterildiği gibi, veriyi 151 acknowledgment numaralı bir segmentle onaylar. 151 acknowledgment numarası dahili olarak olay 2`deki segmentle 50 baytın iletildiğini onaylar.

Sonra, TCP B`ye bağlı kullanıcı veri gönderir (olay 5). Bu veri bir segmente olarak paketlenir ve, diyagramdaki olay 6`da olduğu gibi, iletilir. TCP B`den gelen başlangıç sıra numarası 177 idi; böylece, TCP sıralamasına 178 ile başlar. Bu örnekte, TCP 10 oktet iletir. TCP A, acknowledgment numarası 188 olan bir segment geri döndürerek, TCP B`nin 10 segmentini onaylar. Olay 8`de, bu veri TCP A kullanıcısına teslim edilmiştir.


TCP Close İşlemleri

Şekil 1-15`de bir close işlemi gösterilmiştir. Olay 1`de; TCP A kullanıcısı, TCP B`deki eş üst katman protokolü ile işlemlerini bitirmek (close) istemektedir. Burada TCP A, FIN biti 1`e set edilmiş bir segment yollar. Şekil 1-14`deki işlemlerin devamı olduğu düşünülerek 151 sıra numarası kullanılmıştır.

Şekil 1-15 TCP Close İşlemleri

Şekil 1-16 Close İşlemleri, Segment Alışverişi, ve Konum Geçişlerinin İlişkisi


Bu segmentin TCP B`deki etkisi olay 3`ten görülmektedir. TCP B, TCP A`nın FIN SEQ 151`ini onaylar. TCP B`nin segmentinde SEQ = 188 ve ACK = 152`dir. Bundan sonra, TCP B kendi kullanıcısına bir closing primitive`i yayınlar (olay 4).

Uygulama, işlemlerinin konumuna bağlı olarak, close`u kabul edebilir veya etmeyebilir. Bu örnekte, kullanıcı uygulaması, olay 5`te olduğu gibi, close`u onaylar (acknowledges) ve kabul eder. Uygulama bunu takiben TCP B`ye bir "A`yı kapat" primitive`i yollar. Bu primitive TCP B tarafından FIN SEQ 188; ACK 152 olarak haritalanır, ki bu TCP B`nin yayınladığı son segmenttir (olay 6). Dikkat edelim ki, olay 6`da FIN bayrağı 1`e set edilmiştir, SEQ = 188 ve ACK = 152`dir. TCP A bu son segmenti ACK = 189 ile onaylar (olay 7). Tüm bu işlemlerin sonucu olay 8 ve olay 9`da gösterilmiştir. Böylece bağlantı-closed işaretleri kullanıcı uygulamalarına gönderilmiş olur. Bu şekilde bir close oluşturduğundan, TCP hoş close sağlayan bir protokol olarak anılır.

TCP bağlantı yönetiminin bu analizini tamamlamak için, Şekil 1-16`da konum diyagramının close işlemleri ile ilgili kısmı gösterilmiştir. Şeklin üst kısmı Şekil 1-15`in düşük ölçekli bir versiyonudur, ve burada yalnızca segment iletimleri gösterilmiştir.




9. RFC Numaralarına Göre Açıklamalar





10. Bazı Kısaltmalar



OSI - Open System Interconnection Referance Model

ULP – Upper Lower Protocol

UDP – User Datagram Protocol

SMTP – Simple Mail Transfer Protocol

FTP – File Transfer Protocol

TCB – Transmission Control Block

PDU – TCP segmenti

DOD – Başlanğıcta ARPANET tarafından Amerika Savunma Bakanlığı için bugünkü karşılığı INTERNET ve MILNET olan kurum.

DECNet – Digital Marka bilgisayarlar ve diğerleri arasında iletişim için gelişirilen ağ protokolü




11. Kaynaklar



  1. Rıfat Çölkesen, Bülent örencik - Bilgisayar Haberleşmesi ve Ağ Teknolojileri

  2. Muhammed Ali Tal, Network Ekipmanları ve Router Konfigürasyonu

  3. BAY Networks, TCP-IP Tutorial , www.baynetworks.com

  4. T.Socolofscy, TCP-IP Tutorial.

  5. O' Reilly, TCP/IP Network Administration.

  6. O' Reilly, TCP Management.



12. Yasal Açıklamalar



Telif Hakları

Bu belgenin, Linux'da CD Yazımı, 0.1 sürümünün telif hakkı © 2003 Vügar SALAHLI'ya aittir. Bu belgeyi, Free Software Foundation tarafından yayınlanmış bulunan GNU Özgür Belgeleme Lisansının 1.1 ya da daha sonraki sürümünün koşullarına bağlı kalarak kopyalayabilir, dağıtabilir ve/veya değiştirebilirsiniz. Bu Lisansın bir kopyasını http://www.gnu.org/copyleft/fdl.html adresinde bulabilirsiniz.

Feragatname

Bu belgedeki bilgilerin kullanımından doğacak sorumluluklar, ve olası zararlardan belge yazarı sorumlu tutulamaz. Bu belgedeki bilgileri uygulama sorumluluğu uygulayana aittir.

Tüm telif hakları aksi özellikle belirtilmediği sürece sahibine aittir. Belge içinde geçen herhangi bir terim bir ticarî isim ya da kuruma itibar kazandırma olarak algılanmamalıdır. Bir ürün ya da markanın kullanılmış olması ona onay verildiği anlamında görülmemelidir.