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 veribölütü alır. Şüphesiz, aynı anda bağlantı başlatma durumunda alıcı tarafa eski bir yinelenmiş "EŞZ" veribölütü gelme olasılığı da vardır. "Baştan-başlat" veribö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 veribö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 4.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 veribölütünün gidişi veya bir veribölütünün A'dan B'ye varışı gösterilmiştir. Sola ok (
<--) ise tersini belirtir. Nokta üçlemeleri (...) bir veribölütünün hala ağda olduğunu (geciktiğini), bir "XXX" kaybolan veya reddedilen bir veribölütünü gösterir. Açıklamalar parantez içinde gösterilmiştir. TCP durumları bir veribö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). Veribö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.
Şekil 4.7'nin 2. satırında TCP A 100 ile başlayan sıra numaraları kullanacağını belirten bir
EŞZ veribö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 veribölütüyle yanıt verir. 5. satırda ise, TCP A bir miktar veri yollar. 5. satırdaki veribö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 4.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.
Üç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.
Basit bir eski kopyalardan kurtulma örneği
Şekil 4.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 veribö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.
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 veribölütü gönderir. Senaryo
Şekil 4.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.
3. satırda
EŞZ vardığında, TCP B eşzamanlanmış durumdaydı ve gelen veribö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 4.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 4.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.
Şekil 4.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İNLEme durumuna geri dönüyor.
Başka durumlar da olasıdır, hesaba katılanlardan BŞT üretimi ve işlenmesi ile ilgili olanlar aşağıdadır.
Baştan Başlatmanın İstenmesi
Genel bir kural olarak, baştan başlatma (BŞT) gelen bir veribö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 veribölütüne bir BŞT içermiyorsa yanıt olarak bir BŞT gönderilir. Özellikle iki tarafın da başlatmadığı mevcut olmayan bir bağlantıya gelen EŞZler bu anlamda reddedilirler.
Gelen veribölütü bir ALN alanına sahipse, baştan başlatma için sıra numarası veribölütünün ALN alanından alınır, aksi takdirde başlan başlatma sıra numarası sıfırdır ve ALN alanının değeri gelen veribölütünün veribö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 veribölütü henüz gönderilmemiş birşeylerin alındığı bilgisini içeriyorsa (veribölütü kabul edilebilir olmayan bir ALN taşıyordur) veya gelen veribö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 veribö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 da BŞT gönderilir; veya gelen veribö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 veribölütünü gönderirken saptamış olur ve bağlantı sonlandırılır). Eğer bizim EŞZ alındılanmışsa (tabii ki, gelen veribölütünde) ve bir baştan-başlat gönderilmeli değilse gelen veribölütünün öncelik seviyesi ile yerel öncelik seviyesi tam olarak eşleşmelidir.
Eğer gelen veribölütünde bir ALN alanı varsa BŞT için bu veribölütünün ALN 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 veribölütünün veribö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 veribö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 veribölütüne sebep olmalı ve bağlantı aynı durumda kalmalıdır.
Eğer gelen veribö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 veribölütünün ALN alanından alınır.
EŞZ-GÖNDER hariç tüm durumlarda, tüm BŞT veribö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.