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.

Şekil 7. Bağlantı Eşzamanlamasında Üçlü Uzlaşımın En Basit Kullanımı
    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.

Şekil 8. Aynı Anda Bağlantı Eşzamanlaması
    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.

Şekil 9. Eski EŞZ Kopyasından Kurtulma
    TCP 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 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.

Şekil 10. Yarı Açık Bağlantının Keşfi
    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.

Şekil 11. Yarı Açık Bağlantının Açık Taraftan Keşfedilmesi
      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İNLEme durumuna geri dönüyor.

Şekil 12. Eski EŞZ kopyasının iki Edilgen Soketi İlklendirmesi
    TCP 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:

  1. Bir bağlantı mevcut değilse (KAPALI), gelen bir veri bö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 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ü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 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.

  2. 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 bir ALN 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 da BŞ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 bizim EŞ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ı varsa BŞT için bu veri bö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 veri bölütünün veri bölütü uzunluğunun toplamı atanır. Bağlantı mevcut durumunu korur.

  3. 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ün ALN 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.