3.4. Bağlantının Kurulması
Bir bağlantı kurmak için "üçlü uzlaşım" yöntemi kullanılır. Bu yöntem normal olarak bir TCP tarafından başlatılır, diğer TCP tarafından yanıtlanır. Bu yöntem iki TCP'nin de aynı anda yöntemi başlatması durumunda da iş görür. Aynı anda başlatma durumunda, her TCP bir "EŞZ
" alındıktan sonra gönderilmesi gereken alındının olmadığı, sadece "EŞZ
" taşıyan birer veri bölütü alır. Şüphesiz, aynı anda bağlantı başlatma durumunda alıcı tarafa eski bir yinelenmiş "EŞZ
" veri bölütü gelme olasılığı da vardır. "Baştan-başlat" veri bölütleri bu gibi durumlarda kullanılarak sorun aşılabilir.
Aşağıda birkaç tane bağlantı başlatma örneği verilmiştir. Bu örneklerde, alıcı TCP'nin veriyi geçerli olduğundan emin oluncaya kadar teslim etmediği veri taşıyan veri bölütleri kullanılarak yapılan bir bağlantı eşzamanlaması gösterilmemiş olsa da, bu tamamen meşrudur. (Gösterilse de, bağlantı KURULU
durumuna geçinceye kadar verinin tamponlanması gerekecekti.) Üçlü uzlaşım yöntemi yanlış bağlantı olasılığını azaltır. Bu sınama için ise bilgi sağlayan iletilerle bellek arasındaki ödünleşimin gerçeklenimidir.
En basit üçlü uzlaşım Şekil 7'de gösterilmiştir. Şekildeki gösterim şöyle yorumlanmalıdır: Her satır atıf yapılabilmesi için numaralanmıştır. Sağa ok (-->
) ile TCP A'dan TCP B'ye bir TCP veri bölütünün gidişi veya bir veri bölütünün A'dan B'ye varışı gösterilmiştir. Sola ok (<--
) ise tersini belirtir. Nokta üçlemeleri (...) bir veri bölütünün hala ağda olduğunu (geciktiğini), bir "XXX" kaybolan veya reddedilen bir veri bölütünü gösterir. Açıklamalar parantez içinde gösterilmiştir. TCP durumları bir veri bölütünün gidişi veya varışından SONRA ki durumu gösterir (içerikler her satırın ortasında gösterilmiştir). Veri bölütü içerikleri kısaltmalar kullanılarak sıra numarası, denetim bayrakları ve alındı alanı ile gösterilmiştir. Pencere, adresler, uzunluklar ve metin gibi alanlar duru bir görünüm yararına dışarda bırakılmıştır.
TCP A TCP B 1. KAPALI DİNLE 2. EŞZ-GÖNDER --> <SIRA=100><DNT=EŞZ> --> EŞZ-ALINDI 3. KURULU <-- <SIRA=300><ALN=101><DNT=EŞZ,ALN> <-- EŞZ-ALINDI 4. KURULU --> <SIRA=101><ALN=301><DNT=ALN> --> KURULU 5. KURULU --> <SIRA=101><ALN=301><DNT=ALN><VERİ> --> KURULU Bağlantı eşzamanlamasını sağlamak için üçlü uzlaşımın basit kullanımı
Şekil 7'nin 2. satırında TCP A 100 ile başlayan sıra numaraları kullanacağını belirten bir EŞZ
veri bölütü göndererek uzlaşımı başlatır. 3. satırda, TCB B, TCB A'dan bir EŞZ
aldığını belirten bir alındı (ALN
) ve bir EŞZ
gönderir. TCB B'nin EŞZ
'yi 100 sıra numarası ile kabul ettiğini ve alındı alanında sıra numarası olarak 101 belirterek 101 sıra numaralı sekizliyi beklediğini belirttiğine dikkat ediniz.
4. satırda, TCP A, TCP B'nin EŞZ
'si için bir ALN
içeren verisiz bir veri bölütüyle yanıt verir. 5. satırda ise, TCP A bir miktar veri yollar. 5. satırdaki veri bölütünün sıra numarasının 4. satırdaki ile aynı oluşuna dikkat ediniz. Bunun sebebi ALN
'nin sıra numarası uzayında bir yer işgal etmeyişidir (Etseydi, bir de ALN
alındılaşmak için uğraşacaktık).
Aynı anda başlatma Şekil 8'de gösterildiği üzere biraz daha karmaşıktır. Her TCP sırayla KAPALI
, EŞZ-GÖNDER
, EŞZ-ALINDI
, KURULU
durumlarına geçer.
TCP A TCP B 1. KAPALI KAPALI 2. EŞZ-GÖNDER --> <SIRA=100><DNT=EŞZ> ... 3. EŞZ-ALINDI <-- <SIRA=300><DNT=EŞZ> <-- EŞZ-GÖNDER 4. ... <SIRA=100><DNT=EŞZ> --> EŞZ-ALINDI 5. EŞZ-ALINDI --> <SIRA=100><ALN=301><DNT=EŞZ,ALN> ... 6. KURULU <-- <SIRA=300><ALN=101><DNT=EŞZ,ALN> <-- EŞZ-ALINDI 7. ... <SIRA=101><ALN=301><DNT=ALN> --> KURULU Bağlantının aynı anda eşzamanlanması
Üçlü uzlaşımın başlıca sebebi, eski yinelenmiş bağlantı ilklendirmelerinin karışıklığa neden olmasını önlemektir. Bunu sağlayabilmek için özel bir denetim iletisi, baştan-başlat (BŞT
) icadedilmiştir. Eğer alıcı TCP eşzamanlama yapılan durumlardan birinde (EŞZ-GÖNDER
, EŞZ-ALINDI
) ise makul bir BŞT
aldığında DİNLE
durumuna döner. Eğer alıcı TCP, eşzamanlanmış durumlardan birinde (KURULU
, SON-BEKLE-1
, SON-BEKLE-2
, KAPAT-BEKLE
, KAPANIŞ
, SON-ALN
, ZMN-BEKLE
) ise bağlantıyı terkeder ve kullanıcıyı bilgilendirir. Bu son durumu daha ileride "yarı açık" bağlantılar olarak inceleyeceğiz.
EŞZ
Kopyasından KurtulmaTCP A TCP B 1. KAPALI DİNLE 2. EŞZ-GÖNDER --> <SIRA=100><DNT=EŞZ> ... 3. (eski kopya) ... <SIRA=90><DNT=EŞZ> --> EŞZ-ALINDI 4. EŞZ-GÖNDER <-- <SIRA=300><ALN=91><DNT=EŞZ,ALN> <-- EŞZ-ALINDI 5. EŞZ-GÖNDER --> <SIRA=91><DNT=BŞT> --> DİNLE 6. ... <SIRA=100><DNT=EŞZ> --> EŞZ-ALINDI 7. EŞZ-GÖNDER <-- <SIRA=400><ALN=101><DNT=EŞZ,ALN> <-- EŞZ-ALINDI 8. KURULU --> <SIRA=101><ALN=401><DNT=ALN> --> KURULU Eski EŞZ Kopyasından Kurtulma
Basit bir eski kopyalardan kurtulma örneği Şekil 9'da ele alınmıştır. 3. satırda, TCB B'ye eski bir EŞZ
kopyası gelmektedir. TCB B bunun eski bir kopya olduğunu bilemez ve normal şekilde yanıtlar (4. satır). TCP A, ALN
alanının yanlış olduğunu saptar ve veri bölütünü güvenilir kılacak şekilde seçilmiş bir SIRA
alanıyla bir BŞT
(baştan-başlat) döndürür. TCB B, BŞT
aldığında DİNLE
durumuna geçer. Son defa olarak özgün EŞZ
6. satırda gönderildiğinde eşzamanlama normal olarak başlar. Eğer 6. satırdaki EŞZ
, BŞT
'den önce B'ye varırsa BŞT
'nin göndericisiyle her iki yönde biraz daha karmaşık bir değiştokuş oluşabilir.
3.4.1. Yarı Açık Bağlantılar ve Diğer Aykırılıklar
Eğer TCP'lerden biri diğer ucun haberi olmaksızın kapanmış veya bağlantıyı terketmişse ya da bellek kaybı ile sonuçlanan bir çökme sonucu bağlantının iki ucu arasındaki eşzamanlama bozulmuşsa bağlantı yarı açıktır denir. Böyle bağlantılarda, uçlardan biri veri göndermeye çalışırsa uzlaşım kendiliğinden baştan başlatılır. Yine de, yarı açık bağlantılar olağandışı durumlardan olup kurtarma işlemi de sessizce yapılır.
Eğer A tarafında bağlantı artık mevcut değilse ve B tarafındaki kullanıcı bir veri göndermeye çalışırsa, işlem, B tarafındaki TCP'nin bir baştan-başlat denetim iletisi almasıyla sonuçlanacaktır. Böyle bir ileti B tarafındaki TCP'nin bir şeyleri yanlış yaptığını belirtir ve bağlantıyı terketmesi beklenir.
A ve B isimli iki kullanıcı süreci iletişim halindeyken A'da bellek kaybına sebep olan bir çökmenin yaşandığını varsayalım. İşletim sisteminin A'nın TCP'sini destekleyişine bağlı olarak bir takım hatadan kurtulma mekanizmaları mevcut olabilir. TCP tekrar ayağa kalktığında, A, görevine baştan ya da kurtarma noktasından başlayacaktır. Sonuç olarak A, muhtemelen bağlantıya ya tekrar bir AÇma işlemi uygulayacak veya açık olduğunu sandığı bağlantıdan GÖNDERme işlemini deneyecektir. İkinci durumda, yerel (A'nın) TCP'den "bağlantı açık değil" şeklinde bir hata iletisi alır. Bir bağlantı kurmak için A'nın TCP'si EŞZ
içeren bir veri bölütü gönderir. Senaryo Şekil 10'da gösterildiği gibi sürüp gider. TCP A'nın çöküşü sonrası, kullanıcısı bağlantıyı yeriden açmaya çalışırken, TCB B'nin kullanıcısı ise bağlantının açık olduğunu düşünmektedir.
TCP A TCP B 1. (ÇÖKÜŞ) (gönderi 300, alım 100) 2. KAPALI KURULU 3. EŞZ-GÖNDER --> <SIRA=400><DNT=EŞZ> --> (??) 4. (!!) <-- <SIRA=300><ALN=100><DNT=ALN> <-- KURULU 5. EŞZ-GÖNDER --> <SIRA=100><DNT=BŞT> --> (Terket!!) 6. EŞZ-GÖNDER KAPALI 7. EŞZ-GÖNDER --> <SIRA=400><DNT=EŞZ> --> Yarı Açık Bağlantının Keşfi
3. satırda EŞZ
vardığında, TCP B eşzamanlanmış durumdaydı ve gelen veri bölütü pencere dışındaydı. Verilecek yanıt, beklediği sıra numarasını belirten bir alındı (ALN
100) göndermek olacaktı; öyle yaptı. TCP A'nın gördüğü ise gönderdiği hiçbirşeyin alınmamış olduğuydu ve üstelik eşzamanlama da yoktu; bir baştan-başla (BŞT
) gönderdi, çünkü bağlantının yarı açık olduğunu saptamıştı. TCP B'nin, 5. satırda bağlantıyı terkettiğini, TCP A'nın ise bağlantıyı kurmaya çalıştığını görürüz. Artık sorun Şekil 7'deki üçlü uzlaşıma indirgenmiştir.
TCP A çökerken TCP B'nin eşzamanlı olduğunu düşündüğü bağlantı üzerinden veri göndermeyi denediği durumla ilgili ilginç bir durum daha vardır. Bu, Şekil 11'de gösterilmiştir. Bu durumda, TCP A'ya TCP B'den gelen veri (2. satır) kabul edilemez, çünkü artık bağlantı mevcut değildir; dolayısıyla TCP A bir BŞT
gönderir. BŞT
kabul edilebilir olduğundan TCP onu işleme sokar ve bağlantıyı terkeder.
TCP A TCP B 1. (ÇÖKÜŞ) (gönderi 300, alım 100) 2. (??) <-- <SIRA=300><ALN=100><VERİ=10><DNT=ALN> <-- KURULU 3. --> <SIRA=100><DNT=BŞT> --> (Terket!!) Yarı Açık Bağlantının Açık Taraftan Keşfedilmesi
Şekil 12'de EŞZ
bekleyen edilgen bağlantılı A ve B TCP'lerini görüyoruz. TCP B'ye 2. satırda eski bir yinelenmiş gelerek TCP B'yi telaşlandırıyor. Bir EŞZ-ALN göndererek (3. satırda) TCP A'nın bir BŞT
üretmesine sebep oluyor (3. satırdaki ALN
kabul edilebilir değildir). TCP B baştan başlamayı kabul ediyor ve tekrar edilgen DİNLE
me durumuna geri dönüyor.
EŞZ
kopyasının iki Edilgen Soketi İlklendirmesiTCP A TCP B 1. DİNLE DİNLE 2. ... <SIRA=Z><DNT=EŞZ> --> EŞZ-ALINDI 3. (??) <-- <SIRA=X><ALN=Z+1><DNT=EŞZ,ALN> <-- EŞZ-ALINDI 4. --> <SIRA=Z+1><DNT=BŞT> --> (DİNLEme durumuna geç!) 5. DİNLE DİNLE Eski EŞZ Kopyasının iki Edilgen Soketi İlklendirmesi
Başka durumlar da olasıdır, hesaba katılanlardan BŞT
üretimi ve işlenmesi ile ilgili olanlar aşağıdadır.
3.4.2. Baştan Başlatmanın İstenmesi
Genel bir kural olarak, baştan başlatma (BŞT
) gelen bir veri bölütünün mevcut bağlantı için tasarlanmamış olması halinde gönderilmelidir. Bu durum açıkça belli değilse bir baştan başlatma gönderilmemelidir.
Üç grup durum vardır:
-
Bir bağlantı mevcut değilse (
KAPALI
), gelen bir veri bölütüne birBŞT
içermiyorsa yanıt olarak birBŞT
gönderilir. Özellikle iki tarafın da başlatmadığı mevcut olmayan bir bağlantıya gelenEŞZ
ler bu anlamda reddedilir.Gelen veri bölütü bir
ALN
alanına sahipse, baştan başlatma için sıra numarası veri bölütününALN
alanından alınır, aksi takdirde başlan başlatma sıra numarası sıfırdır veALN
alanının değeri gelen veri bölütünün veri bölütü uzunluğu ile sıra numarasının toplamı olur. BağlantıKAPALI
durumda kalır. -
Bağlantı eşzamanlama yapılan durumlardan (
DİNLE
,EŞZ-GÖNDER
,EŞZ-ALINDI
) birinde değilse ve gelen veri bölütü henüz gönderilmemiş birşeylerin alındığı bilgisini içeriyorsa (veri bölütü kabul edilebilir olmayan birALN
taşıyordur) veya gelen veri bölütü bir güvenlik seviyesine ya da seviye ve bağlantı için istenen bölüm ile uyumsuz bir bölüme sahipse bir baştan-başlat gönderilir.Bizim
EŞZ
alındılanmamışsa ve gelen veri bölütünün öncelik seviyesi istenen öncelik seviyesinden daha yüksekse ya yerel öncelik seviyesi yükseltilir (sistem veya kullanıcı izin vermişse) ya daBŞT
gönderilir; veya gelen veri bölütünün öncelik seviyesi istenen öncelik seviyesinden daha düşükse öncelikler eşleşmiş gibi devam edilir (uzak TCP öncelik seviyesini bizimki ile eşleşmek üzere yükseltemezse bunu sonraki veri bölütünü gönderirken saptamış olur ve bağlantı sonlandırılır). Eğer bizimEŞZ
alındılanmışsa (tabii ki, gelen veri bölütünde) ve bir baştan-başlat gönderilmeli değilse gelen veri bölütünün öncelik seviyesi ile yerel öncelik seviyesi tam olarak eşleşmelidir.Eğer gelen veri bölütünde bir
ALN
alanı varsaBŞT
için bu veri bölütününALN
alanındaki sıra numarası kullanılır, aksi takdirde,BŞT
için sıra numarası sıfır olurken,ALN
alanına sıra numarası ile gelen veri bölütünün veri bölütü uzunluğunun toplamı atanır. Bağlantı mevcut durumunu korur. -
Eğer bağlantı eşzamanlanmış durumdaysa (
KURULU
,SON-BEKLE-1
,SON-BEKLE-2
,KAPAT-BEKLE
,KAPANIŞ
,SON-ALN
,ZMN-BEKLE
) kabul edilebilir olmayan bir veri bölütü (pencere dışı bir sıra numarası veya kabul edilebilir olmayan bir alındı numarası), sadece o anki gönderi sıra numarasını ve alınması umulan sonraki sıra numarasını belirten bir alındı içeren verisiz bir veri bölütüne sebep olmalı ve bağlantı aynı durumda kalmalıdır.Eğer gelen veri bölütü bağlantı için istenen seviye, bölüm veya önceliğe uymayan bir güvenlik seviyesi, bölümü veya önceliğine sahipse bir
BŞT
gönderilir ve bağlantıKAPALI
duruma döner.BŞT
sıra numarası gelen veri bölütününALN
alanından alınır.
3.4.3. Baştan Başlama İşlemi
EŞZ-GÖNDER
hariç tüm durumlarda, tüm BŞT
veri bölütleri SIRA
alanlarına bakılarak doğrulanır. Bir baştan başlatmanın geçerli olabilmesi için onun sıra numarası pencere içinde kalmalıdır. EŞZ-GÖNDER
durumunda ise (bir ilk EŞZ
'ye yanıt olarak bir BŞT
alınması) baştan başlatmanın kabul edilebilmesi için ALN
alanı EŞZ
alındısını içermelidir.
BŞT
'nin alıcısı ilk değerlendirmeyi yapar ve durumunu değiştirir. Eğer alıcı DİNLE
durumundaysa onu yoksayar. Eğer alıcı EŞZ-ALINDI
durumundaysa ve önceki durumu DİNLE
durumu ise alıcı DİNLE
durumuna geri döner, aksi takdirde, alıcı bağlantıyı terkeder ve KAPALI
durumuna geçer. Eğer alıcı bunlar dışında bir durumdaysa bağlantıyı terkeder ve kullanıcıyı bilgilendirip KAPALI
duruma geçer.