Uygulama tcp ip istemci sunucusu. TCP akış soketindeki istemci-sunucu uygulaması. IP Parametre Değerlerini Ayarlama

Bu protokolleri uygulayan sunucular Şirket ağı, istemciye bir IP adresi, ağ geçidi, ağ maskesi, ad sunucuları ve hatta bir yazıcı sağlayın. Kullanıcıların ağı kullanmak için ana bilgisayarlarını manuel olarak yapılandırmaları gerekmez.

QNX Neutrino işletim sistemi, bir IETF komite projesi olan AutoIP adı verilen başka bir otomatik yapılandırma protokolünü uygular. otomatik konfigürasyon. Bu protokol, küçük ağlarda ana bilgisayarlara bağlantı yerel IP adresleri atamak için kullanılır. AutoIP protokolü, diğer ana bilgisayarlarla bir anlaşma şeması kullanarak ve merkezi bir sunucuya başvurmadan, bağlantının yerel IP adresini bağımsız olarak belirler.

PPPoE protokolünü kullanma

PPPoE kısaltması Ethernet Üzerinden Noktadan Noktaya Protokol anlamına gelir. Bu protokol, köprülü bir topolojiye sahip bir Ethernet ağı üzerinden iletim için verileri kapsüller.

PPPoE bir kullanıcı bağlantı özelliğidir Ethernet ağları Dijital abone hattı, kablosuz cihaz veya kablolu modem gibi geniş bantlı bir bağlantı aracılığıyla İnternet'e bağlanın. PPPoE protokolünün ve geniş bant modemin kullanılması kullanıcılara yerel bilgisayar ağı bireysel kimlik doğrulamalı erişim yüksek hızlı ağlar veri aktarımı.

PPPoE protokolü, Ethernet teknolojisini PPP protokolüyle birleştirerek her kullanıcı için uzak bir sunucuya etkili bir şekilde ayrı bir bağlantı oluşturur. Erişim kontrolü, bağlantı hesabı ve servis sağlayıcı seçimi ana bilgisayarlar için değil kullanıcılar için belirlenir. Bu yaklaşımın avantajı ne telefon şirketinin ne de internet servis sağlayıcısının bunun için herhangi bir özel destek sağlamasına gerek olmamasıdır.

Çevirmeli bağlantılardan farklı olarak DSL ve kablolu modem bağlantıları her zaman etkindir. Uzak bir hizmet sağlayıcıya olan fiziksel bağlantı birden fazla kullanıcı arasında paylaşıldığından, trafiğin gönderenlerini ve hedeflerini kaydeden ve kullanıcılardan ücret alan bir muhasebe yöntemine ihtiyaç vardır. PPPoE protokolü, bir iletişim oturumuna katılan kullanıcının ve uzak ana bilgisayarın, adı verilen bir ilk değişim sırasında birbirlerinin ağ adreslerini öğrenmesine olanak tanır. tespit etme(keşif). Bireysel bir kullanıcı ile uzak bir ana bilgisayar (örneğin bir İnternet servis sağlayıcısı) arasında bir oturum kurulduğunda, oturum tahakkuk amacıyla izlenebilir. Birçok ev, otel ve şirket, Ethernet teknolojisini ve PPPoE protokolünü kullanarak dijital abone hatları aracılığıyla halka açık İnternet erişimi sağlar.

PPPoE protokolü aracılığıyla yapılan bağlantı, bir istemci ve bir sunucudan oluşur. İstemci ve sunucu, Ethernet özelliklerine yakın herhangi bir arayüzü kullanarak çalışır. Bu arayüz, yalnızca iş istasyonu tabanlı kimlik doğrulama yerine istemcilere IP adresleri vermek ve bu IP adreslerini kullanıcılarla ve isteğe bağlı olarak iş istasyonlarıyla ilişkilendirmek için kullanılır. PPPoE sunucusu her istemci için noktadan noktaya bağlantı oluşturur.

PPPoE oturumu kurma

PPPoE oturumu oluşturmak için hizmeti kullanmalısınız.pppoed. Modülio-pkt-*nPPPoE protokol hizmetleri sağlar. İlk önce koşman gerekiyorio-pkt-*İleuygun sürücü. Örnek:

TCP akış soketindeki istemci-sunucu uygulaması

Aşağıdaki örnek, düzenli, güvenilir iki yönlü bayt akışları sağlamak için TCP'yi kullanır. Bir istemci ve bir sunucu içeren eksiksiz bir uygulama oluşturalım. Öncelikle TCP akış yuvalarını kullanarak bir sunucunun nasıl oluşturulacağını ve ardından sunucumuzu test etmek için bir istemci uygulamasının nasıl oluşturulacağını göstereceğiz.

Aşağıdaki program, istemcilerden bağlantı isteklerini alan bir sunucu oluşturur. Sunucu eşzamanlı olarak oluşturulmuştur, bu nedenle, sunucu istemciye bağlanmayı kabul edene kadar iş parçacığının yürütülmesi engellenir. Bu uygulama, bir istemciye yanıt veren basit bir sunucuyu gösterir. İstemci sunucuya bir mesaj göndererek bağlantıyı sonlandırır .

TCP Sunucusu

Sunucu yapısının oluşturulması aşağıdaki fonksiyonel şemada gösterilmektedir:

Burada tam kod SocketServer.cs programları:

// System'ı kullanan SocketServer.cs; System.Text'i kullanarak; System.Net'i kullanarak; System.Net.Sockets'ı kullanarak; namespace SocketServer ( class Program ( static void Main(string args) ( // Soket için yerel uç noktayı ayarlayın IPHostEntry ipHost = Dns.GetHostEntry("localhost"); IPAddress ipAddr = ipHost.AddressList; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000 ); // Bir Tcp/Ip soketi oluşturun sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtokolType.Tcp); // Soketi yerel uç noktaya atayın ve gelen soketleri dinleyin try ( sListener.Bind(ipEndPoint); ); sListener. Listen(10); // (true) sırasında bağlantıları dinlemeye başlayın ( ​Console.WriteLine("(0) numaralı bağlantı noktasında bağlantı bekleniyor", ipEndPoint); // Program duraklatılır ve bir bağlantı beklenir. gelen bağlantı Soket işleyicisi = sListener.Accept(); string data = null; // İstemcinin bize bağlanmaya çalışmasını bekledik bayt = yeni bayt Konsolda.Write("Alınan metin: " + veri + " \n\n"); // İstemciye bir yanıt gönder\ string answer = "" + data.Length.ToString() + " karakter cinsinden istek için teşekkür ederiz"; bayt mesajı = Encoding.UTF8.GetBytes(yanıt); işleyici.Send(msg); if (data.IndexOf(" ") > -1) ( Console.WriteLine("Sunucu, istemciyle bağlantıyı sonlandırdı."); break; ) handler.Shutdown(SocketShutdown.Both); handler.Close(); )) ) catch (Exception ex) ( Console.WriteLine (ex.ToString()); ) son olarak ( Console.ReadLine(); )) )) )

Bu programın yapısına bakalım.

İlk adım, soketi yerel bir uç noktaya ayarlamaktır. Bağlantıları dinlemek için bir soket açmadan önce, bunun için yerel bir uç nokta adresi hazırlamanız gerekir. Benzersiz TCP/IP hizmet adresi, ana bilgisayarın IP adresi ile hizmet uç noktasını oluşturan hizmet bağlantı noktası numarasının birleşimiyle belirlenir.

Dns sınıfı, hakkında bilgi döndüren yöntemler sağlar. ağ adresleri cihaz tarafından desteklenen yerel ağ. Bir LAN aygıtının birden fazla ağ adresi varsa, Dns sınıfı tüm ağ adresleri hakkında bilgi döndürür ve uygulamanın diziden hizmet verecek uygun adresi seçmesi gerekir.

Ana bilgisayarın Dns.Resolve() yönteminden elde ettiğimiz ilk IP adresini port numarasıyla birleştirerek sunucu için bir IPEndPoint oluşturalım:

IPHostEntry ipHost = Dns.GetHostEntry("localhost"); IPAdresi ipAddr = ipHost.AddressList; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);

Burada IPEndPoint sınıfı, 11000 numaralı bağlantı noktasındaki localhost'u temsil eder. Daha sonra, Socket sınıfının yeni bir örneğini oluştururuz. akış soketi. Bağlantıları dinlemek için yerel bir uç nokta ayarladıktan sonra bir soket oluşturabiliriz:

Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtokolType.Tcp);

Aktar AdresAilesi Socket sınıfının bir örneğinin bir adresi çözümlemek için kullanabileceği adresleme düzenlerini belirtir.

Parametrede Soket Tipi TCP ve UDP yuvaları farklıdır. İçinde diğer şeylerin yanı sıra aşağıdaki değerleri tanımlayabilirsiniz:

Dgram

Datagramları destekler. Dgram değeri, adres ailesi parametresinde protokol türü ve InterNetwork için Udp'nin belirtilmesini gerektirir.

Çiğ

Temel aktarım protokolüne erişimi destekler.

Aktarım

Akış soketlerini destekler. Akış değeri, protokol türü için Tcp'nin belirtilmesini gerektirir.

Üçüncü ve son parametre ise soket için gereken protokol tipini belirtir. Parametrede Protokol Türü Aşağıdaki en önemli değerleri belirleyebilirsiniz - Tcp, Udp, Ip, Raw.

Bir sonraki adım, yöntemi kullanarak soketi atamak olmalıdır. Bağla(). Bir soket yapıcı tarafından açıldığında ona bir isim atanmaz, yalnızca bir tanıtıcı ayrılır. Sunucu soketine bir ad atamak için Bind() yöntemi çağrılır. İstemci soketinin akışı tanımlayabilmesi için TCP soketi sunucu programının soketine bir ad vermesi gerekir:

SListener.Bind(ipEndPoint);

Bind() yöntemi, bir soketi yerel bir uç noktaya bağlar. Listen() ve Accept() yöntemlerini çağırmaya çalışmadan önce Bind() yönteminin çağrılması gerekir.

Artık bir soket oluşturup ona bir isim verdikten sonra, gelen mesajları şu yöntemi kullanarak dinleyebilirsiniz: Dinlemek(). Dinleme durumunda, soket gelen bağlantı girişimlerini dinleyecektir:

SListener.Listen(10);

Parametre tanımlar birikmiş iş yığını kuyrukta bekleyen maksimum bağlantı sayısını gösterir. Yukarıdaki kodda, parametre değeri kuyrukta en fazla on bağlantının birikmesine izin verir.

Dinleme durumunda, yöntemin kullanıldığı müşteriyle bağlantı kurmayı kabul etmeye hazır olmalısınız. Kabul etmek(). Bu yöntem bir istemci bağlantısı elde eder ve istemci ile sunucu adı ilişkisini tamamlar. Accept() yöntemi, bir bağlantı sağlanana kadar çağıran programın iş parçacığını engeller.

Accept() yöntemi, ilk bağlantı isteğini bekleyen istekler kuyruğundan kaldırır ve onu işlemek için yeni bir yuva oluşturur. Yeni bir soket oluşturulmuş olmasına rağmen orijinal soket dinlemeye devam eder ve istemcilerden gelen birden fazla bağlantı isteğini kabul etmek için çoklu iş parçacığıyla kullanılabilir. Hiçbir sunucu uygulaması dinleme soketini kapatmamalıdır. Gelen istemci isteklerini işlemek için Accept yöntemi tarafından oluşturulan yuvalarla birlikte çalışmaya devam etmesi gerekir.

While (true) ( ​​Console.WriteLine("(0) numaralı bağlantı noktasında bağlantı bekleniyor", ipEndPoint); // Gelen bağlantıyı beklerken program duraklatılır Socket handler = sListener.Accept();

İstemci ve sunucu birbirleriyle bağlantı kurduktan sonra mesajlar aşağıdaki yöntemler kullanılarak gönderilebilir ve alınabilir. Göndermek() Ve Almak() sınıf Soket.

Send() yöntemi, giden verileri bağlı sokete yazar. Receive() yöntemi, gelen verileri akış soketine okur. TCP tabanlı bir sistem kullanıldığında, Send() ve Receive() yöntemleri yürütülmeden önce yuvalar arasında bir bağlantı kurulmalıdır. İstemci ve sunucu uygulamalarının, verilerini ilk önce kimin göndermesi gerektiğini bilmeden birbirlerini engellememeleri için, iletişim kuran iki varlık arasındaki tam protokolün önceden tanımlanması gerekir.

Sunucu ve istemci arasındaki veri alışverişi tamamlandığında aşağıdaki yöntemleri kullanarak bağlantıyı kapatmanız gerekir. Kapat() Ve Kapalı():

Handler.Shutdown(SocketShutdown.Both); işleyici.Close();

SocketShutdown durdurulacak üç değer içeren bir numaralandırmadır: İkisi birden- soket tarafından veri gönderip almayı durdurur, Almak- soketin veri almasını durdurur ve Göndermek- soket tarafından veri gönderimini durdurur.

Soketin Connected özelliğini de false olarak ayarlayan Close() yöntemi çağrılarak soket kapatılır.

TCP istemcisi

Bir istemci uygulaması oluşturmak için kullanılan işlevler aşağı yukarı bir sunucu uygulamasına benzer. Sunucuda olduğu gibi uç noktayı belirlemek, soketi başlatmak, veri gönderip almak ve soketi kapatmak için aynı yöntemler kullanılır.

Ağ protokolleri üzerinden seyahat etmek.

TCP ve UDP'nin her ikisi de aktarım katmanı protokolleridir. UDP, garanti edilmeyen paket teslimatına sahip bağlantısız bir protokoldür. TCP (İletim Kontrol Protokolü), garantili paket teslimatına sahip bağlantı odaklı bir protokoldür. Önce bir el sıkışma yapılır (Merhaba. | Merhaba. | Sohbet edelim mi? | Hadi gidelim.), ardından bağlantı kurulmuş sayılır. Daha sonra paketler bu bağlantı üzerinden ileri geri gönderilir (görüşme devam etmektedir) ve paketin alıcıya ulaşıp ulaşmadığı kontrol edilir. Paket kaybolursa veya kırık olarak ulaşırsa sağlama toplamı, sonra tekrar gönderilir (“tekrar ediyorum, duymadım”). Bu nedenle, TCP daha güvenilirdir, ancak uygulama açısından daha karmaşıktır ve buna bağlı olarak daha fazla saat döngüsü/bellek gerektirir ki bu, mikrodenetleyiciler için en az önemli olanıdır. TCP kullanan uygulama protokollerine örnek olarak FTP, HTTP, SMTP ve diğerleri verilebilir.

TL;DR

HTTP (Köprü Metni Aktarım Protokolü), sunucunun sayfaları tarayıcımıza gönderdiği bir uygulama protokolüdür. HTTP artık yaygın olarak kullanılıyor Dünya çapında Ağ Web sitelerinden bilgi almak için. Resimde, renklerin bir tarayıcı aracılığıyla ayarlandığı, yerleşik bir işletim sistemine sahip bir mikro denetleyici üzerindeki bir lamba gösterilmektedir.

HTTP protokolü metin tabanlıdır ve oldukça basittir. Aslında görünen bu GET yöntemi netcat yardımcı programı tarafından sunucunun yerel IPv6 adresine ışıklarla gönderilir:

~$ nc fe80::200:e2ff:fe58:b66b%mazko 80<

HTTP Yöntemi genellikle büyük harflerle yazılan kısa bir İngilizce kelimedir ve büyük/küçük harfe duyarlıdır. Her sunucu en azından GET ve HEAD yöntemlerini desteklemelidir. GET ve HEAD yöntemlerinin yanı sıra POST, PUT ve DELETE yöntemleri de sıklıkla kullanılmaktadır. GET yöntemi belirtilen bir kaynağın içeriğini talep etmek için kullanılır; bizim durumumuzda GET /b HTTP/1.0 burada /b yolu renkten (mavi) sorumludur. Sunucu cevabı:

HTTP/1.0 200 OK Sunucu: Contiki/2.4 http://www.sics.se/contiki/ Bağlantı: Önbellek Kontrolünü kapat: önbellek yok, depo yok, yeniden doğrulanmalı Pragma: önbellek yok Sona erme tarihi: 0 İçerik- tür: metin/html Contiki RGB

Kırmızı KAPALI

Yeşil KAPALI

Mavi AÇIK

Durum kodu (bizde 200 tane var) sunucu yanıtının ilk satırının bir parçasıdır. Üç basamaklı bir tam sayıdır. İlk rakam durumun sınıfını gösterir. Yanıt kodunun ardından genellikle boşlukla ayrılmış, kişiye bu özel yanıtın nedenini açıklayan İngilizce açıklayıcı bir ifade gelir. Bizim durumumuzda sunucu hatasız çalıştı, her şey yolundaydı (tamam).

Hem istek hem de yanıt başlıklar içerir (her satır ayrı bir başlık alanıdır, ad-değer çifti iki nokta üst üste işaretiyle ayrılır). Başlıklar boş bir satırla biter ve ardından veriler gelebilir.

Tarayıcım yerel IPv6 adresini açmayı reddediyor, bu nedenle mikro denetleyici donanım yazılımına ek bir adres yazılıyor ve aynı önekin simülatörün sanal ağ arayüzüne de atanması gerekiyor:

~$ sudo ip addr add abcd::1/64 dev mazko # linux ~$ netsh arayüzü ipv6 adresi ayarla mazko abcd::1 # windows ~$ curl http://

TCP doğal olarak istemci/sunucu ortamına entegre olur (bkz. Şekil 10.1). Sunucu uygulaması böcekler(dinle) gelen bağlantı isteklerini. Örneğin WWW, dosya aktarımı veya terminal erişim hizmetleri istemcilerden gelen istekleri dinler. TCP'deki iletişimler, sunucuyla bağlantıyı başlatan uygun rutinler tarafından başlatılır (soket programlama arayüzü hakkında Bölüm 21'e bakın).

Pirinç. 10.1.İstemci sunucuyu çağırır.

Gerçekte istemci başka bir sunucu olabilir. Örneğin, posta sunucuları bilgisayarlar arasında e-posta mesajları göndermek için diğer posta sunucularına bağlanabilir.

10.2 TCP Kavramları

Uygulamalar TCP'de verileri hangi biçimde göndermelidir? TCP verileri IP'ye hangi biçimde aktarır? Gönderen ve alan TCP protokolleri, uygulamalar ile bunu uygulamak için gereken veri öğeleri arasındaki bağlantıyı nasıl tanımlar? Tüm bu soruların yanıtları, TCP'nin temel kavramlarını açıklayan aşağıdaki bölümlerde yanıtlanmaktadır.

10.2.1 Giriş ve çıkış veri akışları

Kavramsal Bağlantı modeli, bir veri akışını eş uygulamaya ileten bir uygulamayı içerir. Aynı zamanda bağlantı ortağından veri akışı alabilme özelliğine sahiptir. TCP sağlar Tam dubleks(tam çift yönlü) eşzamanlı olarak servis verilen çalışma modu iki akış veriler (bkz. Şekil 10.2).


Pirinç. 10.2. Uygulamalar veri akışlarını değiştirir.

10.2.2 Segmentler

TCP, bir uygulamadan çıkan veri akışını datagramlarda saklanmaya uygun bir forma dönüştürebilir. Nasıl?

Uygulama verileri TCP'ye gönderir ve bu protokol onu çıkış arabelleği(tampon gönder). Daha sonra, TCP arabellekten veri parçalarını keser ve bunları bir başlık ekleyerek gönderir (bu, bölümler- segment). İncirde. 10.3 verilerin nasıl elde edildiğini gösterir çıkış arabelleği TCP segmentlere ayrılmıştır. TCP, ayrı bir datagram olarak teslim edilmek üzere segmenti IP'ye iletir. Verilerin doğru uzunluktaki parçalar halinde paketlenmesi verimli iletim sağlar; böylece TCP, bir segment oluşturmadan önce çıktı arabelleğinde uygun miktarda veri bulunana kadar bekleyecektir.


Pirinç. 10.3 TCP Segmenti Oluşturma

10.2.3 İtme

Ancak büyük miktarda verinin gerçek dünya uygulamalarına uygulanması çoğu zaman imkansızdır. Örneğin, bir son kullanıcı istemci programı uzak bir sunucuyla etkileşimli bir oturum başlattığında, kullanıcı yalnızca komutları girer (ardından tuşuna basarak) Geri dönmek).

Kullanıcının istemci programı, verilerin uzak ana bilgisayara gönderildiğini bilmek ve bu işlemi hemen gerçekleştirmek için TCP'ye ihtiyaç duyar. Bu durumda kullanılır dışarı itmek(itmek).

Etkileşimli bir oturumda işlemlere bakarsanız, az veri içeren birçok segment bulacaksınız ve ayrıca patlama, hemen hemen her veri segmentinde bulunabilir. Ancak, dosya aktarımları sırasında (en son bölüm hariç) itme kullanılmamalıdır; TCP, verileri en verimli şekilde bölümlere ayırabilecektir.

10.2.4 Acil veriler

Uygulamanın veri iletme modeli, hedefe giden sıralı bir bayt akışını içerir. Tekrar etkileşimli oturum örneğine dönersek, kullanıcının bir tuşa bastığını varsayalım. dikkat(dikkat) veya kırmak(yarıda kesmek). Uzak uygulama, müdahale eden baytları atlayabilmeli ve tuş vuruşuna mümkün olduğunca çabuk yanıt verebilmelidir.

Mekanizma acil veri(acil veriler), bir segmentteki özel bilgileri şu şekilde işaretler: acil. Bunu yaparak TCP, eşine segmentin acil veriler içerdiğini ve nerede bulunduğunu gösterebileceğini söyler. İş ortağı bu bilgiyi mümkün olan en kısa sürede hedef uygulamaya iletmelidir.

10.2.5 Uygulama bağlantı noktaları

İstemci erişmek istediği hizmeti tanımlamalıdır. Bu, ana bilgisayar hizmetinin IP adresinin ve TCP bağlantı noktası numarasının belirtilmesiyle yapılır. UDP gibi TCP bağlantı noktası numaraları da 0 ila 65535 arasındadır. 0 ila 1023 aralığındaki bağlantı noktalarına iyi bilinen adı verilir ve standart hizmetlere erişim için kullanılır.

İyi bilinen bağlantı noktalarının çeşitli örnekleri ve bunlara karşılık gelen uygulamalar Tablo 10.1'de gösterilmektedir. Hizmetler At(bağlantı noktası 9) ve ücretlendirildi(bağlantı noktası 19), UDP aracılığıyla zaten bildiğimiz hizmetlerin TCP sürümleridir. TCP protokolünün 9 numaralı bağlantı noktasına giden trafiğin, UDP protokolünün 9 numaralı bağlantı noktasına giden trafikten tamamen izole edildiği unutulmamalıdır.


Tablo 10.1 Tanınmış TCP Bağlantı Noktaları ve İlgili Uygulamaları

Liman Başvuru Tanım
9 At Gelen tüm verileri iptal et
19 Ücretlendirme Karakter oluşturucu. Karakter akışı değişimi
20 FTP Verileri FTP veri iletme bağlantı noktası
21 FTP'de FTP diyaloğu için bağlantı noktası
23 TELNET Telnet aracılığıyla uzaktan kayıt için bağlantı noktası
25 SMTP SMTP protokolü bağlantı noktası
110 POP3 Kişisel bilgisayarlar için posta örnekleme hizmeti
119 NNTP Çevrimiçi haberlere erişim

İstemcilerin kullandığı bağlantı noktaları ne olacak? Nadir durumlarda, istemci iyi bilinen bir bağlantı noktası üzerinden çalışmaz. Ancak bu gibi durumlarda, bir bağlantı açmak istendiğinde, genellikle işletim sisteminden kendisine kullanılmayan ve ayrılmamış bir bağlantı noktası atamasını ister. Bağlantının sonunda istemcinin bu bağlantı noktasını geri vermesi gerekir; bundan sonra bağlantı noktası başka bir istemci tarafından yeniden kullanılabilir. Ayrılmamış numara havuzunda 63.000'den fazla TCP bağlantı noktası bulunduğundan istemci bağlantı noktası kısıtlamaları göz ardı edilebilir.

10.2.6 Soket adresleri

Zaten bildiğimiz gibi, iletişim için IP adresi ve port kombinasyonuna denir. adres soketi. Bir TCP bağlantısı, bağlantının her iki ucundaki yuva adresiyle tamamen tanımlanır. İncirde. Şekil 10.4, soket adresli (128.36.1.24, port = 3358) istemci ile soket adresli (130.42.88.22, port = 21) sunucu arasındaki bağlantıyı göstermektedir.

Pirinç. 10.4. Soket adresleri

Her datagramın başlığı kaynak ve hedef IP adreslerini içerir. Daha sonra kaynak ve hedef port numaralarının TCP segment başlığında belirtildiğini göreceksiniz.

Genellikle bir sunucu birden fazla istemciyi aynı anda yönetebilir. Benzersiz sunucu soket adresleri tüm istemcilere aynı anda atanır (bkz. Şekil 10.5).


Pirinç. 10.5. Sunucu soket adreslerine bağlı birden fazla istemci

Bir datagram, IP adresleri ve bağlantı noktaları tarafından tanımlanan bir TCP bağlantı bölümünü içerdiğinden, bir sunucunun istemcilere yönelik birden fazla bağlantıyı takip etmesi çok kolaydır.

10.3 TCP Güvenilirlik Mekanizması

Bu bölümde, iletim sırasını koruyarak ve kayıp veya çoğaltmayı önleyerek verileri güvenilir bir şekilde iletmek için kullanılan TCP mekanizmasına bakacağız.

10.3.1 Numaralandırma ve onay

TCP, güvenilir veri aktarımını sağlamak için numaralandırma ve alındı ​​bildirimini (ACK) kullanır. TCP numaralandırma şeması biraz sıra dışıdır: Her bağlantı üzerinden iletildi sekizli seri numarasına sahip olduğu kabul edilir. TCP segment başlığı bir sıra numarası içerir bu segmentteki verilerin ilk sekizlisi.

Alıcının verinin alındığını onaylaması gerekir. Zaman aşımı süresi içinde ACK gelmezse veri yeniden iletilir. Bu yöntem denir röle ile olumlu onay(yeniden iletimle olumlu onay).

TCP verisinin alıcısı, verinin sırayla alındığını ve eksik parça bulunmadığını doğrulamak için gelen sıra numaralarını sıkı bir şekilde kontrol eder. ACK rastgele kaybolabileceğinden veya gecikebileceğinden alıcıya kopya segmentler gelebilir. Sıra numaraları, daha sonra atılan yinelenen verileri tanımlamanıza olanak tanır.

İncirde. Şekil 10.6 TCP'de zaman aşımı ve yeniden iletimin basitleştirilmiş bir görünümünü göstermektedir.


Pirinç. 10.6. TCP'de zaman aşımı ve yeniden iletim

10.3.2 TCP başlığındaki bağlantı noktası, sıra ve ACK alanları

Şekil 2'de gösterildiği gibi. 10.7'de, TCP başlığının ilk birkaç alanı kaynak ve hedef port değerleri, ekteki verilerin ilk baytının sıra numarası ve sıra numarasına eşit bir ACK için alan sağlar Sonraki bayt diğer uçta bekleniyor. Başka bir deyişle, TCP eşinden 30'a kadar tüm baytları alırsa, bu alan bir sonraki iletilecek segmenti belirten 31 değerine sahip olacaktır.


Pirinç. 10.7. TCP başlık alanlarındaki başlangıç ​​değerleri

Küçük bir detay gözden kaçırılamaz. TCP'nin 1'den 50'ye kadar bayt gönderdiğini ve gönderilecek başka veri olmadığını varsayalım. Eğer veri bir eşten alınırsa, TCP kendisine veri eklenmemiş bir başlık göndererek verinin alındığını onaylamalıdır. Doğal olarak bu başlık ACK değerini de içermektedir. Sıra alanında - değer 51'dir, yani. sonraki baytın numarası niyetinde TCP'yi gönderin. TCP bir sonraki veriyi gönderdiğinde, yeni TCP başlığında ayrıca 51'lik bir sıra alanı olacaktır.

10.4 Bağlantı kurma

İki uygulama birbirine nasıl bağlanır? İletişimden önce bunların her biri, belirli bir bağlantının TCP ve IP parametrelerini (örneğin, soket adresleri, geçerli sıra numarası, başlangıç ​​yaşam boyu değeri vb.) depolamak için kullanılacak bir bellek bloğu oluşturmak üzere bir alt yordamı çağırır.

Sunucu uygulaması, sunucuya erişim sağlamak isteyen ve bir istekte bulunan bir istemcinin görünmesini bekler. birleştirmek(bağlan), sunucunun IP adresini ve bağlantı noktasını tanımlar.

Bir teknik özellik var. Her iki taraf da her baytı bir ile değil, ile numaralandırmaya başlar. rastgele seri numarası(Bunun neden yapıldığını daha sonra öğreneceğiz). Orijinal spesifikasyon, ilk sıra numarasının, yaklaşık olarak her 4 µs'de bir artan 32 bitlik bir harici zamanlayıcıya dayalı olarak oluşturulmasını tavsiye eder.

10.4.1 Bağlantı senaryosu

Bağlantı prosedürüne genellikle üç yönlü el sıkışma denir çünkü bir bağlantı kurmak için üç mesaj (SYN, SYN ve ACK) alınıp verilir.

Bağlantının kurulması sırasında ortaklar üç önemli bilgi alışverişinde bulunur:

1. Veri almak için arabellek alanı

2. Gelen bir segmentte taşınan maksimum veri miktarı

3. Giden veriler için kullanılan başlangıç ​​sıra numarası

Her bir tarafın belirtmek için 1. ve 2. işlemleri kullandığını unutmayın. diğer tarafın hareket edeceği sınırlar. Kişisel bir bilgisayarın alma arabelleği küçük olabilir, ancak bir süper bilgisayarın çok büyük bir arabelleği olabilir. Kişisel bir bilgisayarın bellek yapısı, gelen veri parçalarını 1 KB ile sınırlayabilir, ancak bir süper bilgisayar daha büyük bölümleri yönetir.

Karşı tarafın veriyi nasıl göndereceğini kontrol edebilme yeteneği, TCP/IP'yi ölçeklenebilir kılan önemli bir özelliktir.

İncirde. Şekil 10.8 örnek bir bağlantı komut dosyasını göstermektedir. Çizimi aşırı yüklememek için çok basit başlangıç ​​sıra numaraları sunulmuştur. Bu şekilde istemcinin sunucudan daha büyük segmentler alabildiğini unutmayın.


Pirinç. 10.8. Bağlantı kurma

Aşağıdaki işlemler gerçekleştirilir:

1. Sunucu başlatılır ve istemcilere bağlanmaya hazır hale gelir (bu duruma pasif açık denir).

2. İstemci, TCP'den belirtilen IP adresi ve bağlantı noktasında sunucuya bir bağlantı açmasını ister (bu duruma aktif açık denir).

3. İstemci TCP'si ilk sıra numarasını (bu örnekte 1000) alır ve gönderir. segmenti senkronize et(segmenti senkronize et - SYN). Bu segment sıra numarasını, alma penceresinin boyutunu (4K) ve istemcinin alabileceği en büyük segmentin boyutunu (1460 bayt) taşır.

4. Bir SYN geldiğinde sunucunun TCP'si şunları alır: bana ait başlangıç ​​sıra numarası (3000). Başlangıç ​​sıra numarasını (3000), ACK 1001'i (bu, istemci tarafından gönderilen ilk baytın 1001 olarak numaralandırıldığı anlamına gelir), alma penceresi boyutunu (4K) ve sunucunun yapabileceği en büyük segmentin boyutunu içeren bir SYN segmenti gönderir. (1024 bayt) alın.

5. Sunucudan bir SYN/ACK mesajı alan istemci TCP, ACK 3001'i geri gönderir (sunucu tarafından gönderilen verilerin ilk baytı 3001 olarak numaralandırılmalıdır).

6. İstemci TCP'si, uygulamasına bağlantıyı açma talimatını verir.

7. İstemci TCP'sinden bir ACK mesajı alan sunucu TCP, uygulamasına bağlantının açılması konusunda bilgi verir.

İstemci ve sunucu, alınan verilere ilişkin kurallarını duyurur, sıra numaralarını senkronize eder ve veri alışverişine hazır hale gelir. TCP spesifikasyonu aynı zamanda eş uygulamaların eş zamanlı olarak birbirini aktif olarak açtığı başka bir senaryoya da (pek başarılı olmayan) izin verir.

10.4.2 IP parametre değerlerinin ayarlanması

Bağlantı kurmaya yönelik bir uygulama isteği, bağlantı verilerini taşıyacak IP datagramları için parametreler de belirtebilir. Belirli bir parametre değeri belirtilmemişse varsayılan değer kullanılır.

Örneğin bir uygulama, IP önceliği veya hizmet türü için istenilen değeri seçebilir. Bağlı tarafların her biri bağımsız olarak kendi önceliğini ve hizmet türünü belirlediğinden, teorik olarak bu değerler farklı veri akış yönleri için farklılık gösterebilir. Kural olarak pratikte her değişim yönü için aynı değerler kullanılır.

Bir uygulama hükümet veya askeri güvenlik seçeneklerini içerdiğinde, bağlantının her uç noktasının aynı güvenlik düzeylerini kullanması gerekir, aksi takdirde bağlantı kurulmayacaktır.

10.5 Veri aktarımı

Bağlantı oluşturmanın üç adımlı onayı tamamlandıktan sonra veri aktarımı başlar (bkz. Şekil 10.9). TCP standardı, normal verilerin alındı ​​bölümlerine dahil edilmesine izin verir, ancak bağlantı tamamlanana kadar uygulamaya teslim edilmeyecektir. Numaralandırmayı basitleştirmek için 1000 baytlık mesajlar kullanılır. Her TCP başlık bölümü, bağlantı ortağından alınması beklenen bayt sıra numarasını tanımlayan bir ACK alanına sahiptir..


Pirinç. 10.9. Basit veri alışverişi ve ACK akışı

İstemci tarafından gönderilen ilk segment, 1001 ile 2000 arasındaki baytları içerir. ACK alanı, sunucudan alınması beklenen bayt sıra numarasını belirten 3001 değerini içermelidir.

Sunucu, istemciye 1000 baytlık veri içeren (3001 numarasıyla başlayan) bir segmentle yanıt verir. TCP başlık ACK alanı, 1001'den 2000'e kadar olan baytların zaten başarıyla alındığını gösterecektir, bu nedenle istemciden beklenen bir sonraki segment sıra numarası 2001 olmalıdır.

İstemci daha sonra 2001, 3001 ve 4001 baytlarıyla başlayan segmentleri belirtilen sırayla gönderir. İstemcinin gönderilen her segmentten sonra bir ACK beklemediğini unutmayın. Veriler arabellek alanı dolana kadar eşe gönderilir (aşağıda alıcının kendisine gönderilen veri miktarını çok kesin bir şekilde belirleyebileceğini göreceğiz).

Sunucu, tüm segmentlerin iletilmesindeki başarıyı belirtmek için tek bir ACK kullanarak bağlantı bant genişliğinden tasarruf sağlar.

İncirde. Şekil 10.10, ilk segment kaybolduğunda veri aktarımını göstermektedir. Zaman aşımı süresi dolduğunda segment yeniden iletilir. Kayıp bir segment alındığında alıcının her iki segmentin de iletildiğini onaylayan tek bir ACK gönderdiğini unutmayın.


Pirinç. 10.10. Veri kaybı ve yeniden iletim

10.6 Bağlantıyı kapatma

Bir bağlantının normal sonlandırılması, bağlantı açılırken olduğu gibi aynı üçlü el sıkışma prosedürü kullanılarak gerçekleştirilir. Taraflardan her biri aşağıdaki senaryoyu kullanarak bağlantıyı kapatmaya başlayabilir:

A:

B:"İyi".

İÇİNDE:"Ben de işi bitirdim."

A:"İyi".

Aşağıdaki senaryoyu varsayalım (çok nadir kullanılmasına rağmen):

A:"İşim bitti. Gönderilecek başka veri yok."

İÇİNDE:"Tamam. Ancak bazı veriler var..."

İÇİNDE:"Ben de işi bitirdim."

A:"İyi".

Aşağıdaki örnekte, istemci/sunucu bağlantılarında sıklıkla olduğu gibi bağlantı sunucu tarafından kapatılmıştır. Bu durumda kullanıcı oturuma girdikten sonra telnet Oturumu kapat komutu, sunucunun bağlantıyı kapatmak için bir istek başlatmasına neden olur. Şekil 2'de gösterilen durumda. 10.11'de aşağıdaki eylemler gerçekleştirilir:

1. Sunucudaki uygulama TCP'ye bağlantıyı kapatmasını söyler.

2. TCP sunucusu, gönderilecek başka veri olmadığını bildiren son bir segment (Son Segment - FIN) gönderir.

3. İstemcinin TCP'si FIN segmentinde bir ACK gönderir.

4. İstemcinin TCP'si, uygulamasına sunucunun bağlantıyı kapatmak istediğini bildirir.

5. İstemci uygulaması TCP'sine bağlantıyı kapatmasını söyler.

6. TCP istemcisi bir FIN mesajı gönderir.

7. TCP sunucusu istemciden FIN'i alır ve bir ACK mesajıyla yanıt verir.

8. Sunucunun TCP'si, uygulamasına bağlantıyı kapatmasını söyler.


Pirinç. 10.11. Bağlantıyı kapatma

Her iki taraf da aynı anda kapanmaya başlayabilir. Bu durumda her eşin ACK mesajı göndermesiyle normal bağlantı kapatma işlemi tamamlanır.

10.6.1 Ani fesih

Taraflardan her biri bağlantının aniden sonlandırılmasını (ani kapatma) talep edebilir. Bir uygulama bir bağlantıyı sonlandırmak istediğinde veya TCP kendi araçlarıyla çözemeyeceği ciddi bir iletişim sorunu tespit ettiğinde bu kabul edilebilir. Ani sonlandırma, TCP başlığındaki belirli bir bayrakla gösterilen eşe bir veya daha fazla sıfırlama mesajı gönderilerek talep edilir.

10.7 Akış kontrolü

TCP alıcısı gelen veri akışıyla yüklenir ve ne kadar bilgi kabul edebileceğini belirler. Bu sınırlama TCP göndericisini etkiler. Bu mekanizmanın aşağıdaki açıklaması kavramsaldır ve geliştiriciler bunu ürünlerinde farklı şekillerde uygulayabilirler.

Bağlantı kurulumu sırasında her eş, bağlantının giriş arabelleği için yer ayırır ve karşı tarafı bu konuda bilgilendirir. Tipik olarak arabellek boyutu, maksimum segment boyutlarının tam sayısı olarak ifade edilir.

Veri akışı giriş arabelleğine girer ve uygulamaya (TCP bağlantı noktası tarafından tanımlanır) iletilmeden önce orada saklanır. İncirde. Şekil 10.12, 4 KB kabul edebilen bir giriş arabelleğini göstermektedir.


Pirinç. 10.12. Giriş Arabelleği Alma Penceresi

Veri geldikçe arabellek alanı doldurulur. Alıcı uygulama arabellekten veri aldığında, boş alan yeni gelen veriler için kullanılabilir hale gelir.

10.7.1 Alma penceresi

Alma penceresi(alma penceresi) - giriş arabelleğinde halihazırda veriler tarafından işgal edilmemiş herhangi bir alan. Veriler, hedef uygulama tarafından kullanılıncaya kadar giriş arabelleğinde kalır. Uygulama neden hemen veri toplamıyor?

Basit bir senaryo bu soruyu cevaplamaya yardımcı olacaktır. Bir istemcinin çok meşgul, çok kullanıcılı bir bilgisayarda çalışan bir FTP sunucusuna bir dosya gönderdiğini varsayalım. FTP programı daha sonra verileri arabellekten okumalı ve diske yazmalıdır. Sunucu disk G/Ç işlemlerini gerçekleştirirken program bu işlemlerin tamamlanmasını bekler. Bu sırada başka bir program başlayabilir (örneğin, bir programa göre) ve FTP programı yeniden başlatıldığında, bir sonraki veri zaten ara belleğe gelecektir.

Alma penceresi son onaylanan bayttan arabelleğin sonuna kadar uzanır. İncirde. 10.12'de ilk olarak arabelleğin tamamı kullanılabilir ve bu nedenle 4 KB'lık bir alma penceresi mevcuttur. İlk KB geldiğinde alma penceresi 3 KB'ye düşürülecektir (basitlik açısından her segmentin 1 KB boyutunda olduğunu varsayacağız, ancak pratikte bu değer uygulamanın ihtiyaçlarına göre değişiklik göstermektedir). Sonraki iki 1 KB'lık segmentin gelmesi, alma penceresini 1 KB'ye düşürecektir.

Alıcı tarafından gönderilen her ACK, kaynaktan gelen veri akışının düzenlenmesine bağlı olarak, alıcı pencerenin mevcut durumu hakkında bilgi içerir.

TCP standardı bu arabelleğin nasıl yönetileceğini belirtmese de, çoğunlukla giriş arabelleğinin boyutu bağlantı başlatıldığında ayarlanır. Göndericiye geri bildirim sağlanarak giriş arabelleği artırılabilir veya azaltılabilir.

Gelen segment alıcı pencereye yerleştirilebiliyorsa ancak bozuk bir şekilde ulaşırsa ne olur? Genel olarak tüm uygulamaların gelen verileri bir alma penceresinde sakladığı ve yalnızca birden fazla parçadan oluşan bitişik bloğun tamamı için bir onay (ACK) gönderdiği varsayılır. Bu doğru yoldur çünkü aksi takdirde hatalı gelen verilerin silinmesi performansı önemli ölçüde düşürecektir.

10.7.2 Gönderim penceresi

Verileri ileten sistemin iki özelliği takip etmesi gerekir: ne kadar verinin gönderildiği ve onaylandığı ve alıcının alma penceresinin mevcut boyutu. Aktif alan gönderme(gönderme alanı), ilk onaylanmayan sekizliden geçerli alma penceresinin sol kenarına kadar uzanır. Parça pencere, kullanılmış göndermek, ortağa ne kadar ek veri gönderilebileceğini gösterir.

İlk sıra numarası ve ilk alma penceresi boyutu, bağlantı kurulumu sırasında belirtilir. Pirinç. Şekil 10.13 veri aktarım mekanizmasının bazı özelliklerini göstermektedir.

1. Gönderen, 4 KB'lik bir gönderme penceresiyle başlar.

2. Gönderen 1 KB gönderir. Bu verilerin bir kopyası, yeniden iletilmesi gerekebileceğinden bir onay (ACK) alınana kadar saklanır.

3. İlk KB'ye ait ACK mesajı gelir ve sonraki 2 KB'lik veri gönderilir. Sonuç, Şekil 2'nin üst kısmından üçüncü bölümde gösterilmektedir. 10.13. 2 KB depolama devam ediyor.

4. Son olarak iletilen tüm veriler için bir ACK gelir (yani tümü alıcı tarafından alınır). ACK, gönderme penceresi boyutunu 4 KB'ye geri yükler.

Pirinç. 10.13. Pencereyi gönder

Dikkat çekmeye değer birkaç ilginç özellik var:

■ Gönderen, gönderdiği her veri bölümü için bir ACK beklemez. İletmeyle ilgili tek kısıtlama, alma penceresinin boyutudur (örneğin, gönderenin yalnızca 4K tek baytlık bölümleri iletmesi gerekir).

■ Gönderenin verileri birkaç çok kısa bölüm halinde (örneğin 80 bayt) gönderdiğini varsayalım. Bu durumda veriler daha verimli aktarım için yeniden formatlanabilir (örneğin tek bir segment halinde).

10.8 TCP başlığı

İncirde. Şekil 10.14 segment formatını göstermektedir (TCP başlığı ve verileri). Başlık, kaynak ve hedef bağlantı noktası kimlikleriyle başlar. Sonraki sonraki alan seri numarası(sıra numarası), giden veri akışında bu bölümün kapladığı konumu belirtir. Alan ACK(onay) giriş veri akışında görünmesi gereken beklenen sonraki bölüm hakkında bilgi içerir.


Pirinç. 10.14. TCP segmenti

Altı bayrak var:

Alan veri ofsetleri(Veri Dengesi), TCP başlığının boyutunu 32 bitlik sözcüklerle içerir. TCP başlığı 32 bitlik bir sınırda bitmelidir.

10.8.1 Maksimum segment boyutu seçeneği

Parametre "maksimum segment boyutu"(maksimum segment boyutu - MSS), sistem tarafından kabul edilebilecek ve işlenebilecek en büyük veri parçasını bildirmek için kullanılır. Ancak isim biraz hatalı. Genellikle TCP'de bölüm başlık artı veri olarak kabul edilir. Fakat maksimum segment boyutuşu şekilde tanımlanır:

Alınabilecek en büyük datagramın boyutu 40'tır

Başka bir deyişle, MSS en büyükleri yansıtıyor yük TCP ve IP başlıkları 20 bayt uzunluğunda olduğunda alıcıda. Ek parametreler varsa uzunlukları toplam boyuttan çıkarılmalıdır. Bu nedenle bir segmentte gönderilebilecek veri miktarı şu şekilde tanımlanır:

Belirtilen değer MSS + 40 – (TCP ve IP başlık uzunluklarının toplamı)

Eşler genellikle bir bağlantıyı açarken ilk SYN mesajlarında MSS değerlerini değiştirirler. Sistem maksimum segment boyutu değerini bildirmezse 536 baytlık varsayılan değer kullanılır.

Maksimum segment boyutu, 2 baytlık bir giriş ve ardından 2 baytlık bir değer olarak kodlanır; en büyük değer 2 16 -1 (65.535 bayt) olacaktır.

MSS, TCP'de gönderilen verilere ciddi bir sınırlama getirir: alıcı büyük değerleri işleyemez. Ancak gönderen segmentleri kullanıyor daha küçük beden,Çünkü bağlantı için güzergah boyunca MTU boyutu da belirlenmektedir.

10.8.2 Bağlantı isteğinde başlık alanlarını kullanma

Bir bağlantıyı açmak için gönderilen ilk segmentin SYN bayrağı 1 ve ACK bayrağı 0'dır. Başlangıç ​​SYN'si tek bir ACK alanı 0 değerinde olan bir segment. Güvenlik araçlarının bu özelliği bir TCP oturumuna yönelik giriş isteklerini tanımlamak için kullandığını unutmayın.

Alan seri numarası içerir başlangıç ​​sıra numarası(başlangıç ​​sıra numarası), alan pencere - başlangıç ​​boyutu alma penceresi.Şu anda tanımlanmış olan tek TCP parametresi, TCP'nin almayı beklediği maksimum segment boyutudur (belirtilmediğinde varsayılan değer olan 536 bayt kullanılır). Bu değer 32 bit kaplar ve genellikle sahadaki bağlantı talebinde bulunur. seçenekler(Seçenek). MSS değerini içeren TCP başlığı 24 bayt uzunluğundadır.

10.8.3 Bağlantı isteği yanıtında başlık alanlarını kullanma

Bir bağlantı isteğine verilen onay yanıtında, her iki bayrak (SYN ve ACK) 1'e eşittir. Yanıt veren sistem, uygun alanda başlangıç ​​sıra numarasını ve alanda alma penceresi boyutunu belirtir. Pencere. Alıcının kullanmak istediği maksimum segment boyutu genellikle bağlantı isteğine verilen yanıtta bulunur ( seçenekler). Bu değer, bağlantıyı talep eden tarafın değerinden farklı olabilir. iki farklı değer kullanılabilir.

Yanıtta 1 değerine sahip bir sıfırlama bayrağı (RST) belirtilerek bir bağlantı isteği reddedilebilir.

10.8.4 Başlangıç ​​sıra numarasının seçilmesi

TCP spesifikasyonu, bağlantı kurulumu sırasında her bir tarafın kendi seçimini yaptığını varsayar. başlangıç ​​sıra numarası(32 bit dahili zamanlayıcının mevcut değerine göre). Bu nasıl yapılıyor?

Sistem çökerse ne olacağını hayal edelim. Kullanıcının çökmeden hemen önce bir bağlantı açtığını ve az miktarda veri gönderdiğini varsayalım. Kurtarmanın ardından sistem, önceden başlatılan bağlantılar ve atanmış bağlantı noktası numaraları da dahil olmak üzere, çökmeden önce yapılan hiçbir şeyi artık hatırlamaz. Kullanıcı bağlantıyı yeniden kurar. Bağlantı noktası numaraları orijinal atamalarla eşleşmiyor ve bunlardan bazıları, çökmeden birkaç saniye önce kurulan diğer bağlantılar tarafından zaten kullanılıyor olabilir.

Bu nedenle bağlantının en sonundaki karşı taraf, ortağının çöktüğünü ve daha sonra yeniden kurulduğunu bilmeyebilir. Tüm bunlar, özellikle eski verilerin ağ üzerinden geçip yeni oluşturulan bağlantıdan gelen verilerle karışmasının uzun sürdüğü durumlarda ciddi aksamalara yol açacaktır. Güncellemeli (yeni başlangıç) bir başlatma zamanlayıcısının seçilmesi bu tür sorunları ortadan kaldırır. Eski veriler, yeni bağlantının sıra numarası aralığından farklı bir numaralandırmaya sahip olacaktır. Bilgisayar korsanları, güvenilir bir ana bilgisayarın kaynak IP adresini taklit ederken, mesajda öngörülebilir bir başlangıç ​​sıra numarası belirterek bilgisayarlara erişim sağlamaya çalışır. Dahili anahtarlara dayalı bir kriptografik karma işlevi, güvenli tohumların seçilmesi için en iyi yöntemi sağlar.

10.8.5 Alanların ortak kullanımları

TCP başlığını iletim için hazırlarken, iletilen verinin ilk sekizlisinin sıra numarası alanda belirtilir. seri numarası(Sıra numarası).

Bağlantı ortağından beklenen bir sonraki sekizlinin numarası alana girilir Onayla(Onay Numarası) ACK biti 1'e ayarlandığında. Alan pencere(Pencere), alıcı pencerenin geçerli boyutuna yöneliktir. Bu alan şunları içerir: Alınabilecek onay numarasından bayt sayısı. Bu değerin veri akışının hassas kontrolüne izin verdiğini unutmayın. Bu değeri kullanarak eş, değişim oturumu sırasında alma penceresinin gerçek durumunu gösterir.

Bir uygulama TCP'de bir itme işlemi belirtiyorsa, PUSH bayrağı 1'e ayarlanır. Alıcı TCP, gönderici iletmek istediği anda verileri uygulamaya hızlı bir şekilde teslim ederek bu bayrağa yanıt vermelidir ZORUNLU.

URGENT bayrağı, 1'e ayarlandığında, acil veri aktarımı anlamına gelir ve karşılık gelen işaretçi, acil verinin son sekizlisine başvurmalıdır. Acil verilerin tipik bir kullanımı, terminalden iptal veya iptal sinyalleri göndermektir.

Acil veriler genellikle denir bant dışı bilgi(bant dışı). Ancak bu terim kesin değildir. Acil veriler normal TCP akışında gönderilir, ancak bireysel uygulamalar uygulamaya acil verilerin geldiğini belirtmek için özel mekanizmalara sahip olabilir ve uygulamanın tüm mesaj baytları gelmeden önce acil verilerin içeriğini kontrol etmesi gerekir.

Bağlantının anormal şekilde sonlandırılması gerektiğinde RESET bayrağı 1'e ayarlanır. Geçerli TCP bağlantılarından herhangi biriyle ilişkili olmayan bir segment geldiğinde yanıtta aynı bayrak ayarlanır.

Bağlantı kapatma mesajları için FIN bayrağı 1'e ayarlanır.


10.8.6 Sağlama toplamı

IP sağlama toplamı yalnızca IP başlığı içindir, TCP sağlama toplamı ise tüm segment ve IP başlığından oluşturulan sözde başlık için hesaplanır. TCP sağlama toplamı hesaplaması sırasında karşılık gelen alan 0 değerine sahiptir. Şekil 10.15, UDP sağlama toplamında kullanılana çok benzeyen bir sözde başlığı göstermektedir.


Pirinç. 10.15. Sahte başlık alanı TCP sağlama toplamına dahil edilir

TCP uzunluğu, TCP başlığının uzunluğunun veri uzunluğuna eklenmesiyle hesaplanır. TCP sağlama toplamı zorunlu UDP gibi değil. Gelen bir bölümün sağlama toplamı ilk önce alıcı tarafından hesaplanır ve ardından TCP başlık sağlama toplamı alanının içeriğiyle karşılaştırılır. Değerler eşleşmezse segment atılır.

10.9 TCP Segmenti Örneği

Pirinç. 10.16, analizör çalışma protokolü Koklayıcı Ağ Genelinden, bir TCP segmentleri dizisidir. İlk üç bölüm istemci ile sunucu arasındaki bağlantıyı kurar Telnet. Son segment 12 bayt veri taşır.


Pirinç. 10.16. Sniffer analizörü tarafından TCP başlığının görüntülenmesi

Analizör Koklayıcıçoğu değeri ondalık biçime dönüştürür. Ancak bayrak değerleri onaltılık olarak çıkar. 12 değerine sahip bir bayrak 010010'u temsil eder. Sağlama toplamı da onaltılı olarak görüntülenir.

10.10 Oturum desteği

10.10.1 Pencere taraması

Hızlı bir gönderen ve yavaş bir alıcı, 0 bayt boyutunda bir alma penceresi oluşturabilir. Bu sonuca denir pencereyi kapatmak(pencereyi kapat). Alma penceresi boyutunu güncellemek için boş alan olduğunda ACK kullanılır. Ancak böyle bir mesajın kaybolması durumunda her iki tarafın da süresiz olarak beklemesi gerekecek.

Bu durumu önlemek için gönderen, kaydedilebilir zamanlayıcı(sürekli zamanlayıcı) geçici pencereyi kapatırken. Zamanlayıcı değeri yeniden iletim zaman aşımıdır. Zamanlayıcının tamamlanmasının ardından ortağa bir segment gönderilir pencere algılama(pencere araştırması; bazı uygulamalar verileri de içerir). Problama, eşin geçerli pencere durumunu bildiren bir ACK göndermesine neden olur.

Pencere hala sıfır boyutunda kalırsa, kaydedilen zamanlayıcının değeri iki katına çıkar. Bu işlem, zamanlayıcı maksimum 60 saniyeye ulaşana kadar tekrarlanır. TCP, pencere açılıncaya, kullanıcı işlemi sonlandırana veya uygulama zaman aşımına uğrayana kadar her 60 saniyede bir yoklama iletileri göndermeye devam edecektir.

10.11 Oturumun sonlandırılması

10.11.1 Mola

Hatalı bir ağ geçidi veya bağlantı nedeniyle bağlantı ortağı çökebilir veya tamamen kesilebilir. Verilerin TCP'de yeniden iletilmesini önlemek için çeşitli mekanizmalar vardır.

TCP ilk yeniden iletim eşiğine ulaştığında, IP'ye arızalı yönlendiriciyi kontrol etmesini söyler ve aynı anda uygulamaya bir sorun olduğunu bildirir. TCP, bağlantıyı kesmeden önce ikinci eşiğe ulaşılana kadar verileri iletmeye devam eder.

Elbette bu gerçekleşmeden önce, hedefin herhangi bir nedenle ulaşılamadığını belirten bir ICMP mesajı gelebilir. Bazı uygulamalarda, bundan sonra bile TCP, zaman aşımı aralığı sona erene kadar (sorun bu noktada çözülebilir) hedefe erişme girişiminde bulunmaya devam edecektir. Daha sonra uygulamaya hedef noktaya ulaşılamadığı bilgisi verilir.

Bir uygulama, veri dağıtımı için kendi zaman aşımını ayarlayabilir ve bu aralık sona erdiğinde kendi işlemlerini gerçekleştirebilir. Genellikle bağlantı sonlandırılır.

10.11.2 Bağlantıyı sürdürme

Tamamlanmamış bir bağlantının uzun süre iletilecek verileri olduğunda, bağlantı devre dışı kalır. Herhangi bir işlem yapılmadığı süre boyunca ağ çökebilir veya fiziksel iletişim hatları kesilebilir. Ağ tekrar çalışır hale gelir gelmez ortaklar, iletişim oturumunu kesintiye uğratmadan veri alışverişine devam edecek. Bu strateji Savunma Bakanlığı'nın gerekliliklerine uyuyordu.

Ancak, etkin veya etkin olmayan herhangi bir bağlantı bilgisayar belleğinin büyük bir kısmını kaplar. Bazı yöneticilerin kullanılmayan kaynakları sistemlere iade etmesi gerekir. Bu nedenle, birçok TCP uygulaması aşağıdakiler hakkında bir mesaj gönderme yeteneğine sahiptir: bağlantıyı sürdürmek(canlı tutma), etkin olmayan bağlantıları test eder. Bu tür mesajlar, ağdaki varlığını kontrol etmek için ortağa periyodik olarak gönderilir. Yanıt ACK mesajları olmalıdır. Canlı tutma mesajlarının kullanımı isteğe bağlıdır. Eğer sistem bu yeteneğe sahipse, uygulama kendi imkanlarını kullanarak bunu geçersiz kılabilir. Tahmini dönem varsayılan Bağlantı bakımı zaman aşımı tam iki saattir!

Bir uygulamanın kendi zamanlayıcısını ayarlayabildiğini ve buna göre bağlantıyı sonlandırıp sonlandırmayacağına kendi düzeyinde karar verebileceğini hatırlayalım.

10.12 Verim

TCP ne kadar verimlidir? Kaynak performansı birçok faktörden etkilenir; bunların başlıcaları bellek ve bant genişliğidir (bkz. Şekil 10.17).


Pirinç. 10.17. TCP Performans Faktörleri

Kullanılan fiziksel ağın bant genişliği ve gecikmesi, verimi önemli ölçüde sınırlar. Düşük veri iletme kalitesi, büyük miktarda veri biriminin atılmasına neden olur, bu da yeniden iletimlere neden olur ve sonuç olarak bant genişliği verimliliğini azaltır.

Alıcı uç, gönderenin verileri kesintisiz olarak aktarabilmesi için yeterli ara bellek alanı sağlamalıdır. Bu, özellikle veri gönderme ile ACK alma arasında (ve pencere boyutu üzerinde anlaşma yapılırken) uzun bir zaman aralığının olduğu yüksek gecikmeli ağlar için önemlidir. Kaynaktan sabit bir veri akışını sürdürmek için, alıcı uçta en azından bant genişliği ve gecikme çarpımının boyutunda bir pencere bulunmalıdır.

Örneğin kaynak 10.000 bayt/sn hızında veri gönderebiliyorsa ve ACK'nın geri dönmesi 2 saniye sürüyorsa karşı tarafın en az 20.000 bayt boyutunda bir alma penceresi sağlaması gerekir, aksi halde veri akışı gerçekleşmez. sürekli olun. 10.000 baytlık bir alma arabelleği, verimi yarı yarıya azaltacaktır.

Performans için bir diğer önemli faktör, ana bilgisayarın yüksek öncelikli olaylara yanıt verme ve hızlı bir şekilde yürütme yeteneğidir. bağlam değiştirme yani bazı işlemleri tamamlayın ve diğerlerine geçin. Ana bilgisayar, birden fazla yerel kullanıcıyı, toplu arka plan işlemlerini ve düzinelerce eşzamanlı iletişim bağlantısını etkileşimli olarak destekleyebilir. Bağlam değiştirme, sistemdeki yükü gizleyerek tüm bu işlemleri gerçekleştirmenize olanak tanır. TCP/IP'yi işletim sistemi çekirdeğiyle bütünleştiren uygulamalar, bağlam değiştirmeyi kullanmanın yükünü önemli ölçüde azaltabilir.

TCP başlık işleme işlemleri için bilgisayar CPU kaynakları gereklidir. İşlemci sağlama toplamlarını hızlı bir şekilde hesaplayamazsa, bu, ağ üzerinden veri aktarım hızının düşmesine neden olur.

Ayrıca geliştiriciler, ağ yöneticisinin bunları yerel gereksinimlerine uyacak şekilde yapılandırabilmesi için TCP ayarlarının yapılandırmasını basitleştirmeye çalışmalıdır. Örneğin arabellek boyutunu ağ bant genişliğine ve gecikmeye göre ayarlama yeteneği, performansı önemli ölçüde artıracaktır. Ne yazık ki birçok uygulama bu konuya yeterince dikkat etmiyor ve iletişim parametrelerini katı bir şekilde programlıyor.

Ağ ortamının mükemmel olduğunu varsayalım: yeterli kaynak var ve içerik değiştirme, tabancalarını fırlatan kovboylardan daha hızlı gerçekleştiriliyor. Mükemmel performans elde edilecek mi?

Her zaman değil. TCP yazılım geliştirmenin kalitesi de önemlidir. Yıllar boyunca çeşitli TCP uygulamalarında birçok performans sorunu teşhis edildi ve çözüldü. En iyi yazılımın, İnternet ana bilgisayarlarının iletişim katmanı gereksinimlerini tanımlayan RFC 1122'ye uygun yazılım olacağı düşünülebilir.

Aynı derecede önemli olan istisnadır ve Jacobson, Kern ve Partridge algoritmalarının kullanımı (bu ilginç algoritmalar aşağıda tartışılacaktır).

Yazılım geliştiricileri, küçük miktarlardaki verilerin gereksiz aktarımını ortadan kaldıran ve halihazırda kullanımda olmayan ağ kaynaklarını serbest bırakmak için yerleşik zamanlayıcılara sahip programlar oluşturarak önemli faydalar elde edebilirler.

10.13 Performansı iyileştirmeye yönelik algoritmalar

TCP'nin oldukça karmaşık kısmını tanımak için devam ederek, performansı artırmaya ve verimi azaltan sorunları çözmeye yönelik mekanizmalara bakacağız. Bu bölümde aşağıdaki sorunlar tartışılmaktadır:

Yavaş başla(yavaş başlatma), ağ trafiğinin büyük bir kısmının yeni bir oturum için kullanılmasını engeller, bu da israfa neden olabilir.

■ Tedavi "bilgisiz pencere" sendromu(aptal pencere sendromu), kötü tasarlanmış uygulamaların ağı mesajlarla aşırı yüklemesini önler.

Gecikmeli ACK(gecikmeli ACK), bağımsız veri iletme onay mesajlarının sayısını azaltarak tıkanıklığı azaltır.

Hesaplanan yeniden iletim zaman aşımı(yeniden iletim zaman aşımının hesaplanması), gerçek oturum süresinin görüşülmesine dayanır, gereksiz yeniden iletimlerin miktarını azaltır, ancak gerçekten gerekli veri alışverişleri için büyük gecikmelere neden olmaz.

■ TCP iletiminin engellenmesi aşırı yükler Bir ağda, yönlendiricilerin orijinal modlarına dönmelerine ve ağ kaynaklarını tüm oturumlarda paylaşmalarına olanak tanır.

■ Gönderim yinelenen ACK'ler(yinelenen ACK), sıra dışı bir segment alındığında eşlerin zaman aşımı oluşmadan önce yeniden iletim yapmasına olanak tanır.

10.13.1 Yavaş başlangıç

Evdeki tüm elektrikli aletleri aynı anda açarsanız elektrik şebekesi aşırı yüklenecektir. Bilgisayar ağlarında yavaş başlaŞebeke sigortalarının atmasını önler.

Zaten meşgul olan bir ağ üzerinden anında büyük miktarda veri göndermeye başlayan yeni bir bağlantı sorunlara yol açabilir. Yavaş başlatmanın amacı, gerçek ağ yüküne göre veri aktarım hızını yavaşça artırırken yeni bir bağlantının başarıyla başlatılmasını sağlamaktır. Gönderen, daha büyük alma penceresiyle değil, yükleme penceresinin boyutuyla sınırlıdır.

Yükleme penceresi(tıkanıklık penceresi) 1 segment boyutuyla başlar. Başarılı bir şekilde alınan ACK'ye sahip her bir segment için, yükleme penceresi boyutu, alma penceresinden daha küçük kalana kadar 1 segment artırılır. Ağda yoğunluk yoksa yükleme penceresi yavaş yavaş alma penceresinin boyutuna ulaşacaktır. Normal yönlendirme koşullarında bu pencerelerin boyutları aynı olacaktır.

Yavaş bir başlangıcın o kadar da yavaş olmadığını unutmayın. İlk ACK'dan sonra yükleme penceresi boyutu 2 segmenttir ve iki segment için ACK başarıyla alındıktan sonra boyut 8 segmente çıkabilir. Başka bir deyişle pencere boyutu katlanarak artar.

ACK almak yerine zaman aşımı durumu oluştuğunu varsayalım. Bu durumda yükleme penceresinin davranışı aşağıda tartışılmaktadır.

10.13.2 Bilgisiz pencere sendromu

İlk TCP/IP uygulamalarında geliştiriciler bu olayla karşılaştı "bilgisiz pencere" sendromu(Aptal Pencere Sendromu - SWS), oldukça sık ortaya çıktı. Meydana gelen olayları anlamak için, istenmeyen sonuçlara yol açan ancak oldukça mümkün olan aşağıdaki senaryoyu göz önünde bulundurun:

1. Gönderen uygulama verileri hızlı bir şekilde gönderir.

2. Alıcı uygulama, giriş arabelleğinden 1 baytlık veriyi okur (yani yavaşça).

3. Giriş arabelleği okuma sonrasında hızla dolar.

4. Alıcı uygulama 1 bayt okur ve TCP, "1 bayt veri için boş alanım var" anlamına gelen bir ACK gönderir.

5. Gönderen uygulama, ağ üzerinden 1 baytlık bir TCP paketi gönderir.

6. Alıcı TCP, "Teşekkür ederim. Paketi aldım ve boş alanım kalmadı" anlamına gelen bir ACK gönderir.

7. Alıcı uygulama tekrar 1 byte okur ve ACK gönderir ve tüm süreç tekrarlanır.

Yavaş alan bir uygulama, verilerin gelmesi için uzun süre bekler ve alınan bilgileri sürekli olarak pencerenin sol kenarına iterek, ağda ek trafik oluşturan tamamen yararsız bir işlem gerçekleştirir.

Gerçek durumlar elbette bu kadar aşırı değildir. Hızlı bir gönderici ve yavaş bir alıcı, küçük (maksimum segment boyutuna göre) veri parçalarını değiştirecek ve neredeyse tam bir alma penceresi arasında geçiş yapacaktır. İncirde. Şekil 10.18 "aptal pencere" sendromunun ortaya çıkmasına neden olan koşulları göstermektedir.


Pirinç. 10.18.Çok küçük boş alana sahip arabellek alma penceresi

Bu sorunu çözmek zor değil. Alma penceresi bu hedef boyutundan daha kısa bir uzunluğa küçültüldüğü anda TCP göndereni aldatmaya başlar. Bu durumda TCP göndericiye bunu belirtmemelidir. ek olarak Alıcı uygulama arabellekten verileri küçük parçalar halinde okuduğunda pencere alanı. Bunun yerine, serbest bırakılan kaynakları yeterli miktarda oluncaya kadar gönderenden gizli tutmanız gerekir. Giriş arabelleğinin tamamı tek bir segmenti saklamadığı sürece tek bir segment boyutu önerilir (ikinci durumda, yarım arabellek boyutu kullanılır). TCP'nin bildirmesi gereken hedef boyutu şu şekilde ifade edilebilir:

minimum(1/2 giriş arabelleği, Maksimum segment boyutu)

Pencere boyutu bu boyuttan küçük olduğunda TCP yalan söylemeye başlar ve pencere boyutu formülden elde edilen değerden küçük olmadığında doğruyu söyler. Alıcı uygulama zaten beklediği verilerin çoğunu işleyemeyeceği için gönderene herhangi bir zarar gelmeyeceğini unutmayın.

Önerilen çözüm, yukarıda tartışılan durumda, alınan baytların her biri için bir ACK çıkışı ile kolayca doğrulanabilir. Aynı yöntem, giriş arabelleğinin birkaç segmenti depolayabildiği durum için de uygundur (pratikte sıklıkla olduğu gibi). Hızlı gönderen, giriş arabelleğini dolduracaktır, ancak alıcı, bilgiyi barındıracak boş alanının olmadığını belirtecek ve boyutu tüm segmente ulaşana kadar bu kaynağı açmayacaktır.

10.13.3 Nagle'nin algoritması

Gönderen, alıcıdan bağımsız olarak, göndermeden önce veri biriktirerek çok kısa bölümler göndermekten kaçınmalıdır. Nagle'ın algoritması, ağ üzerinden gönderilen kısa datagramların sayısını azaltmanıza olanak tanıyan çok basit bir fikri hayata geçiriyor.

Algoritma, daha önce iletilen verilerden bir ACK beklerken veri iletmenin (ve iletmenin) geciktirilmesini önerir. Birikmiş veriler, daha önce gönderilen bir bilgi için ACK alındıktan sonra veya tam bir segment miktarında gönderilecek veri alındıktan sonra veya bir zaman aşımı tamamlandıktan sonra gönderilir. Bu algoritma, verileri olabildiğince hızlı göndermesi gereken gerçek zamanlı uygulamalar için kullanılmamalıdır.

10.13.4 Gecikmeli ACK

Performansı artırmaya yönelik diğer bir mekanizma ise ACK gecikme yöntemidir. ACK sayısını azaltmak, diğer trafiği iletmek için kullanılabilecek bant genişliğini azaltır. TCP eşi ACK'nin gönderilmesini biraz geciktirirse, o zaman:

■ Tek bir ACK ile birden fazla segment onaylanabilir.

■ Alıcı uygulama, zaman aşımı aralığı içinde bir miktar veri alabilir; ACK, çıkış başlığını içerebilir ve ayrı bir mesaj oluşturulmasını gerektirmez.

Tam uzunluktaki bölümlerden oluşan bir akış gönderilirken gecikmeleri önlemek için (örneğin, dosya alışverişi yaparken), en azından her iki tam bölümde bir ACK gönderilmelidir.

Birçok uygulama 200 ms'lik bir zaman aşımı kullanır. Ancak gecikmiş bir ACK döviz kurunu düşürmez. Kısa bir bölüm geldiğinde, giriş arabelleğinde yeni verileri almaya yetecek kadar boş alan vardır ve gönderen göndermeye devam edebilir (ayrıca yeniden gönderme genellikle çok daha yavaştır). Eğer bir segmentin tamamı gelirse aynı anda ACK mesajı ile yanıt vermeniz gerekmektedir.

10.13.5 Yeniden iletim zaman aşımı

Segmenti gönderdikten sonra TCP bir zamanlayıcı ayarlar ve ACK'nın gelişini izler. Zaman aşımı süresi içinde bir ACK alınmazsa, TCP segmenti (röleyi) yeniden iletir. Ancak zaman aşımı süresi ne kadar olmalıdır?

Çok kısaysa, gönderen, daha önce gönderilmiş olan bilgileri kopyalayan gereksiz bölümleri ileterek ağı dolduracaktır. Çok büyük bir zaman aşımı, iletim sırasında gerçekten yok edilen bölümlerin hızlı bir şekilde onarılmasını önleyecek ve bu da verimi azaltacaktır.

Doğru zaman aşımı süresi nasıl seçilir? Yüksek hızlı yerel ağ için uygun olan bir değer, çok isabetli uzak bağlantı için uygun olmayacaktır. Bu, “her koşul için tek değer” ilkesinin açıkça uygun olmadığı anlamına gelir. Üstelik mevcut belirli bir bağlantı için bile ağ koşulları değişebilir, gecikmeler artabilir veya azalabilir.

Jacobson, Kern ve Partridge algoritmaları (makalelerde açıklanmıştır) , Van Jacobson ve Güvenilir Taşıma Protokollerinde Gidiş-Dönüş Süresi Tahminlerinin İyileştirilmesi, Karn ve Partridge) TCP'nin değişen ağ koşullarına uyum sağlamasına olanak tanır. Bu algoritmaların yeni uygulamalarda kullanılması tavsiye edilir. Aşağıda kısaca bunlara bakacağız.

Sağduyu, belirli bir bağlantı için doğru zaman aşımı süresini tahmin etmenin en iyi temelinin, devir süresi(gidiş-dönüş süresi) verinin gönderilmesi ile alındığına dair onayın alınması arasındaki süre.

Zaman aşımı süresinin hesaplanmasına yardımcı olmak amacıyla temel istatistiklerden (bkz. Şekil 10.19) aşağıdaki miktarlar için iyi çözümler elde edilebilir. Ancak ortalamalara güvenmemelisiniz çünkü tahminlerin yarısından fazlası istatistiksel ortalamanın üzerinde olacaktır. Birkaç aykırı değeri dikkate alarak, normal dağılımı hesaba katan ve aşırı uzun yeniden iletim bekleme süresini azaltan daha iyi tahminler elde edebiliriz.


Pirinç. 10.19.Çevrim sürelerinin dağılımı

Sapmaların resmi matematiksel tahminlerini elde etmek için büyük miktarda hesaplamaya gerek yoktur. Son değer ile ortalama tahmin arasındaki farkın mutlak değerine dayalı olarak oldukça kaba tahminler kullanabilirsiniz:

Son sapma = | Son döngü - Ortalama |

Doğru zaman aşımı değerini hesaplamak için dikkate alınması gereken bir diğer faktör, mevcut ağ koşullarına bağlı olarak çevrim süresinin değişmesidir. İnternette son anda yaşananlar, bir saat önce yaşananlardan daha önemli.

Çok uzun bir seans için döngü ortalamasını hesapladığımızı varsayalım. İlk başta ağ hafif yüklensin ve 1000 küçük değer belirledik ancak daha sonra gecikmede ciddi bir artışla birlikte trafikte bir artış oldu.

Örneğin, 1000 değer 170 birimlik istatistiksel ortalama verdiyse, ancak daha sonra 50 değer ortalama 282 ile ölçülmüşse, o zaman mevcut ortalama şu şekilde olacaktır:

170×1000/1050 + 282×50/1050 = 175

Daha makul bir değer olurdu düzeltilmiş çevrim süresi(Düzleştirilmiş Gidiş-Dönüş Süresi - SRTT), daha sonraki değerlerin önceliğini dikkate alır:

Yeni SRTT = (1 – α)×(eski SRTT) + α×Son döngü değeri

α'nın değeri 0 ile 1 arasındadır. Artırmak geçerli döngü süresinin düzeltilmiş ortalama üzerinde daha büyük bir etkisi ile sonuçlanır. Bilgisayarlar ikili sayıları sağa kaydırarak 2'nin kuvvetlerine göre bölme işlemini hızlı bir şekilde gerçekleştirebildiğinden, α her zaman (1/2)n (genellikle 1/8) olarak seçilir, dolayısıyla:

Yeni SRTT = 7/8×Eski SRTT + 1/8×Son Döngü Süresi

Tablo 10.2, ağ koşullarındaki bir değişiklik döngü süresinin giderek artmasına neden olduğunda (zaman aşımı olmadığı varsayılarak) SRTT formülünün mevcut 230 birimlik SRTT değerine nasıl ayarlandığını gösterir. 3. sütundaki değerler tablonun bir sonraki satırı için (yani eski SRTT gibi) 1. sütundaki değerler olarak kullanılır.


Tablo 10.2 Düzleştirilmiş çevrim süresinin hesaplanması

Eski SRTT En son RTT (7/8)×(eski SRTT) + (1/8)×(RTT)
230.00 294 238.00
238.00 264 241.25
241.25 340 253.59
253.59 246 252.64
252.64 201 246.19
246.19 340 257.92
257.92 272 259.68
259.68 311 266.10
266.10 282 268.09
268.09 246 265.33
265.33 304 270.16
270.16 308 274.89
274.89 230 269.28
269.28 328 276.62
276.62 266 275.29
275.29 257 273.00
273.00 305 277.00

Şimdi yeniden iletim zaman aşımı için bir değer seçme sorusu geliyor. Döngü süresi değerlerinin analizi, bu değerlerin mevcut ortalama değerden önemli ölçüde saptığını gösterir. Sapmaların büyüklüğü için bir sınır belirlemek mantıklıdır. Yeniden iletim zaman aşımı için iyi bir değer (RFC standartlarında bu değere Yeniden İletim Zaman Aşımı - RTO denir), düzeltilmiş sapma (SDEV) kısıtlamasıyla aşağıdaki formülle verilir:

T = Yeniden İletim Zaman Aşımı = SRTT + 2×SDEV

T = SRTT + 4×SDEV

SDEV'yi hesaplamak için öncelikle mevcut sapmanın mutlak değerini belirleyin:

DEV = | Son döngü süresi - eski SRTT |

Daha sonra yumuşatma formülü ikinci değeri hesaba katmak için kullanılır:

Yeni SDEV = 3/4×eski SDEV + 1/4×DEV

Geriye bir soru kalıyor: Hangi başlangıç ​​değerleri alınmalı? Tavsiye edilen:

İlk zaman aşımı = 3s

Başlangıç ​​SRTT = 0

Başlangıç ​​SDEV = 1,5 sn

Van Jacobson, veri yeniden iletim zaman aşımını çok verimli bir şekilde hesaplayan hızlı bir algoritma tanımladı.

10.13.6 İstatistik örneği

Yukarıda hesaplanan zaman aşımı ne kadar başarılı olacak? Bu değer uygulandığında önemli performans iyileştirmeleri gözlemlendi. Bir örnek takım istatistikleri olabilir netstat, sisteme alınan kaplan- dünyanın her yerinden birçok ana bilgisayarın eriştiği bir İnternet sunucusu.


1510769 paket (314955304 bayt) sırayla alındı

Sistem kaplan TCP veri bölümlerinin %2,5'inden azı yeniden iletildi. Bir buçuk milyon gelen veri segmentinin (geri kalanı saf ACK mesajlarıdır) yalnızca %0,6'sı kopyalandı. Giriş verilerindeki kayıp seviyesinin yaklaşık olarak çıkış bölümlerinin seviyesine karşılık geldiği dikkate alınmalıdır. Dolayısıyla, israflı yeniden iletim trafiği toplam trafiğin yaklaşık %0,6'sını oluşturur.

10.13.7 Yeniden gönderme sonrasındaki hesaplamalar

Yukarıda sunulan formüller döngü süresini bir segmentin gönderilmesi ile alındığına dair onayın alınması arasındaki aralık olarak kullanır. Ancak zaman aşımı süresi içerisinde herhangi bir onay alınmadığını ve verilerin yeniden gönderilmesi gerektiğini varsayalım.

Kern'in algoritması bu durumda çevrim süresinin değiştirilmemesi gerektiğini varsayar. Geçerli düzeltilmiş çevrim süresi değeri ve düzeltilmiş sapma belirli bir segmenti yeniden göndermeden iletmek için onay alınana kadar değerlerini korur. Bu noktadan sonra kaydedilen değerlere ve yeni ölçümlere göre hesaplamalara devam edilir.

10.13.8 Yeniden iletimden sonraki eylemler

Peki onay alınmadan önce ne olur? Yeniden iletimden sonra TCP davranışı, esas olarak ağ tıkanıklığından kaynaklanan veri kaybı nedeniyle kökten değişir. Bu nedenle, verilerin yeniden gönderilmesine verilecek yanıt şöyle olacaktır:

■ Azaltılmış yeniden iletim oranı

■ Genel trafiği azaltarak ağ tıkanıklığıyla mücadele edin

10.13.9 Üstel frenleme

Yeniden iletimden sonra zaman aşımı aralığı iki katına çıkar. Ancak zamanlayıcı tekrar taşarsa ne olur? Veriler tekrar gönderilecek ve yeniden iletim süresi tekrar iki katına çıkacak. Bu süreç denir üstel frenleme(üstel geri çekilme).

Ağ hatası oluşmaya devam ederse, zaman aşımı süresi önceden ayarlanmış maksimum değere ulaşılıncaya kadar iki katına çıkar (genellikle 1 dakika). Bir zaman aşımından sonra yalnızca bir segment gönderilebilir. Bir ACK almadan veri aktarımlarının sayısı için önceden ayarlanmış değer aşıldığında da bir zaman aşımı meydana gelir.

10.13.10 Ağ üzerinden gönderilen verileri azaltarak tıkanıklığın azaltılması

Gönderilen veri miktarının azaltılması yukarıda tartışılan mekanizmalardan biraz daha karmaşıktır. Daha önce bahsettiğimiz yavaş başlatma gibi çalışmaya başlar. Ancak trafik düzeyine başlangıçta sorunlara yol açabilecek bir sınır belirlendiğinden, bir segment için yükleme penceresinin boyutunun artması nedeniyle değişim hızı aslında yavaşlayacaktır. Gönderim hızını gerçekten azaltmak için sınır değerlerini ayarlamanız gerekir. İlk olarak tehlike eşiği hesaplanır:

Sınır – minimum 1/2 (mevcut yükleme penceresi, ortak alma penceresi)

Ortaya çıkan değer ikiden fazla segment ise sınır olarak kullanılır. Aksi takdirde kenarlık boyutu iki parçaya ayarlanır. Tam kurtarma algoritması şunları gerektirir:

■ Yükleme penceresi boyutunu bir segmente ayarlayın.

■ Alınan her ACK için, sınıra ulaşılıncaya kadar yükleme penceresi boyutunu bir segment artırın (yavaş başlatma mekanizmasına benzer şekilde).

■ Daha sonra alınan her ACK ile döngü süresi için segment başına artış oranına göre seçilen yük penceresine daha küçük bir değer ekleyin (artış MSS/N olarak hesaplanır; burada N, yükleme penceresinin boyutudur) segmentlerde).

İdeal senaryo, kurtarma mekanizmasının nasıl çalıştığının basitleştirilmiş bir temsilini sağlayabilir. Zaman aşımı tespit edilmeden önce ortağın alma penceresinin (ve geçerli yükleme penceresinin) 8 bölüm boyutunda olduğunu ve sınırın 4 bölüm olarak tanımlandığını varsayalım. Alıcı uygulama, verileri anında arabellekten okursa, alma penceresi boyutu 8 segment olarak kalacaktır.

■ 1 segment gönderilir (yükleme penceresi = 1 segment).

■ ACK alındı ​​- 2 segment gönderildi.

■ 2 bölüm için ACK alındı ​​- 4 bölüm gönderildi (sınıra ulaşıldı).

■ 4 segment için ACK alındı. 5 segment gönderilir.

■ 5 segment için ACK alındı. 6 segment gönderilir.

■ 6 segment için ACK alındı. 7 segment gönderilir.

■ 7 segment için ACK alındı. 8 segment gönderilir (yükleme penceresinin boyutu yine alma penceresinin boyutuna eşittir).

Zaman aşımına uğrayan yeniden iletim, gönderilen tüm verilerin alındığının onaylanmasını gerektirdiğinden, yükleme penceresi alma penceresinin boyutuna ulaşana kadar işlem devam eder. Gerçekleşen olaylar şekil 1'de gösterilmektedir. 10.20. Pencere boyutu katlanarak artar, yavaş başlangıç ​​döneminde iki katına çıkar ve sınıra ulaşıldığında doğrusal olarak artar.


Pirinç. 10.20. Tıkanıklık sırasında iletim hızının sınırlandırılması

10.13.11 Yinelenen ACK'ler

Bazı uygulamalar adı verilen isteğe bağlı bir özelliği kullanır. hızlı tekrar gönder(hızlı yeniden iletim) - belirli koşullar altında verilerin yeniden gönderilmesini hızlandırmak için. Temel fikri, alıcının, alınan verilerdeki bir boşluğu belirten ek ACK'lar göndermesini içerir.

Sıra dışı bir segment alındığında, alıcı ilk baytı işaret eden bir ACK'yi geri gönderir. kayıp veriler (bkz. Şekil 10.21).


Pirinç. 10.21. Yinelenen ACK'ler

Gönderen, verileri hemen yeniden iletmez çünkü IP normalde verileri alıcıya bir gönderme sırası olmadan iletebilir. Ancak birden fazla ek veri ACK'si alındığında (örneğin üç adet), eksik segment, zaman aşımının tamamlanması beklenmeden gönderilecektir.

Her yinelenen ACK'nin bir veri bölümünün alındığını gösterdiğini unutmayın. Birkaç yedek ACK, ağın yeterli miktarda veri sağlama kapasitesine sahip olduğunu ve bu nedenle aşırı yüklenmediğini gösterir. Genel algoritmanın bir parçası olarak, ağ trafiğinde gerçek bir artış olduğunda yükleme penceresinin boyutunda küçük bir azalma gerçekleştirilir. Bu durumda işi geri yüklerken radikal yeniden boyutlandırma işlemi uygulanmaz.

Standarda göre Ana Bilgisayar Gereksinimleri(ana bilgisayar gereksinimleri) TCP, kaynağı söndürürken yukarıda açıklananla aynı yavaş başlatma işlemini gerçekleştirmelidir. Ancak bu mesaj hedefe yönelik veya etkili değildir çünkü mesajı alan bağlantı çok fazla trafik oluşturmuyor olabilir. Mevcut Şartname Yönlendirici Gereksinimleri(yönlendirici gereksinimleri), yönlendiricilerin yapmamalı kaynak bastırmayla ilgili mesajlar gönderin.

13/10/13 TCP İstatistikleri

Son olarak takımın istatistiksel mesajlarına bakalım netstat, yukarıda açıklanan mekanizmaların çoğunun iş başında olduğunu görmek için.

Segmentlere paket denir.
879137 veri paketi (226966295 bayt)
21815 veri paketi (8100927 bayt) yeniden iletildi
Gemiden gemiye aktarma.
132957 yalnızca onay paketi (104216 gecikmeli)
Büyük bir sayıya dikkat edelim

ACK'yi geciktirdi.

Pencere açıklığının araştırılması

sıfır boyut.

Bunlar SYN ve FIN mesajlarıdır.
762469 acks (226904227 bayt için)
Gelen paketlerle ilgili sinyal

sıra dışı.

1510769 paket (314955304 bayt)
9006 tamamen kopya paket (867042 bayt)
Gerçek zaman aşımı sonucu

veri teslimatı.

Bir miktar dup ile 74 paket. veri (12193 bayt kopyalandı)
Daha fazla verimlilik için

bazı veriler yeniden gönderildiğinde ek baytlar içerecek şekilde yeniden paketlendi.

13452 sıra dışı paket (2515087 bayt)
Pencereden sonra 530 paket (8551 bayt) veri
Belki de bu veriler

sesli mesajlarda yer alıyor.

Kapandıktan sonra 402 paket alındı
Bunlar sonraki tekrarlardır

gönderiyorum.

108 hatalı sağlama toplamları nedeniyle atıldı
Geçersiz TCP sağlama toplamı.
Kötü başlık ofset alanları nedeniyle 0 atıldı
7 paket çok kısa olduğu için atıldı
14677 bağlantı kuruldu (kabul edilenler dahil)
18929 bağlantı kapatıldı (643 bağlantı dahil)
4100 embriyonik bağlantı kesildi
572187 segment güncellendi rtt (587397 denemeden)
Başarısız Değişiklik Denemeleri

ACK zaman aşımı süresi dolmadan ulaşmadığından döngü süresi,

Yeniden xmit zaman aşımı nedeniyle 26 bağlantı kesildi
Daha sonraki başarısız girişimler

Bağlantının koptuğunu belirten yeniden gönder.

Tarama zaman aşımları

sıfır pencere.

Doğrulama zaman aşımları

kopmuş bağlantı.

Keepalive nedeniyle 472 bağlantı kesildi

10.14 Geliştirici gerekliliklerine uygunluk

Mevcut TCP standardı, uygulamaların bir bağlantıyı başlatırken yavaş başlatma prosedürüne sıkı sıkıya uymasını ve veri yeniden gönderme zaman aşımı ve yük kontrolünü tahmin etmek için Kern ve Jacobson algoritmalarını kullanmasını gerektirir. Testler, bu mekanizmaların önemli performans iyileştirmelerine yol açtığını göstermiştir.

Bu standartlara tam olarak uymayan bir sistem kurduğunuzda ne olur? Kendi kullanıcıları için yeterli performansı sağlamayacak ve ağdaki diğer sistemler için kötü bir komşu olacak, geçici aşırı yüklemeden kurtulmasını ve veri birimlerinin düşmesine neden olan aşırı trafik oluşturmasını önleyecektir.

10.15 Üretkenliğin önündeki engeller

TCP, saniyede yüzlerce veya milyonlarca bit aktarım hızına sahip ağlar üzerinde çalışarak esnekliğini kanıtlamıştır. Bu protokol, Ethernet, Token-Ring ve Fiber Dağıtılmış Veri Arayüzü (FDDI) topolojilerine sahip modern yerel alan ağlarının yanı sıra düşük hızlı iletişim bağlantıları veya uzun mesafeli bağlantılar (uydu bağlantılarına benzer) için iyi sonuçlar elde etmiştir.

TCP, ağ tıkanıklığı gibi aşırı koşullara yanıt verecek şekilde tasarlanmıştır. Ancak protokolün mevcut sürümü, yüzlerce veya binlerce megabayt bant genişliği sunan gelecek vaat eden teknolojilerde performansı sınırlayan özelliklere sahiptir. İlgili sorunları anlamak için basit (gerçekçi olmasa da) bir örneği düşünün.

Bir dosyayı iki sistem arasında taşırken mümkün olduğunca verimli bir şekilde sürekli bir değişim akışı gerçekleştirmek istediğinizi varsayalım. Diyelim ki:

■ Maksimum alıcı segmenti boyutu 1 KB'dir.

■ Alma penceresi - 4 KB.

Bant genişliği, 1 saniyede iki segment göndermenize olanak tanır.

■ Alıcı uygulama, verileri geldiği anda tüketir.

■ ACK mesajları 2 saniye sonra gelir.

Gönderici sürekli olarak veri gönderme yeteneğine sahiptir. Sonuçta, pencere için ayrılan hacim dolduğunda bir ACK gelir ve başka bir segmentin gönderilmesine izin verir:

2 saniye sonra:

SEGMENT 1'İN ONAYI ALIN, SEGMENT 5'İ GÖNDEREBİLİRSİNİZ.
SEGMENT 2'NİN ONAYI ALIN, SEGMENT 6'YI GÖNDEREBİLİRSİNİZ.
SEGMENT 3'ÜN ONAYI ALIN, SEGMENT 7'Yİ GÖNDEREBİLİRSİNİZ.
SEGMENT 4'ÜN ONAYI ALIN, SEGMENT 8'İ GÖNDEREBİLİRSİNİZ.

2 saniye daha sonra:

SEGMENT 5'İN ONAYI ALIN, SEGMENT 9'U GÖNDEREBİLİRSİNİZ.

Alma penceresi yalnızca 2 KB olsaydı, gönderen bir sonraki veriyi göndermeden önce her iki saniyeden birini beklemek zorunda kalacaktı. Aslında sürekli bir veri akışını sürdürmek için alma penceresinin en azından şu şekilde olması gerekir:

Pencere = Bant Genişliği × Döngü Süresi

Örnek biraz abartılı olsa da (daha basit sayılar sağlamak için), küçük bir pencere yüksek gecikmeli uydu bağlantılarında sorunlara neden olabilir.

Şimdi yüksek hızlı bağlantılarda neler olduğuna bakalım. Örneğin, bant genişliği ve iletim hızı saniyede 10 milyon bit olarak ölçülürse ancak döngü süresi 100 ms (saniyenin 1/10'u) ise, o zaman sürekli bir akış için alma penceresinin en az 1.000.000 bit depolaması gerekir; . 125.000 bayt. Ancak TCP alma penceresi için başlık alanına yazılabilecek en büyük sayı 65.536'dır.

Yüksek baud hızlarında başka bir sorun ortaya çıkar çünkü sıra numaraları çok çabuk tükenir. Bağlantı 4 GB/s hızında veri aktarabiliyorsa sıra numaralarının her saniye güncellenmesi gerekir. İnternette dolaşırken bir saniyeden fazla geciken eski yinelenen datagramları yeni verilerden ayırmanın hiçbir yolu olmayacak.

TCP/IP'yi geliştirmek ve yukarıda belirtilen engelleri ortadan kaldırmak için aktif olarak yeni araştırmalar yürütülmektedir.

10.16 TCP işlevleri

Bu bölümde TCP'nin birçok işlevi ele alınmaktadır. Başlıcaları aşağıda listelenmiştir:

■Bağlantı noktalarını bağlantılarla ilişkilendirme

■ Üç adımlı onayı kullanarak bağlantıları başlatın

■ Ağın aşırı yüklenmesini önlemek için yavaş başlatma gerçekleştirme

■ İletim sırasında verilerin segmentlere ayrılması

■ Veri numaralandırma

■ Gelen yinelenen segmentlerin işlenmesi

■ Sağlama toplamlarının hesaplanması

■ Alma penceresi ve gönderme penceresi aracılığıyla veri akışının kontrolü

■ Bağlantıyı belirlenen şekilde sonlandırın

■ Bağlantının sonlandırılması

■ Acil verilerin iletilmesi

■ Yeniden sevkiyatın olumlu onayı

■ Yeniden iletim zaman aşımını hesaplayın

■ Ağ tıkanıklığı sırasında dönüş trafiğinin azalması

■ Segmentlerin sıra dışı geldiğinin sinyalini verme

■ Alma penceresinin kapandığını algılama

10.17 TCP durumları

Bir TCP bağlantısı birkaç aşamadan geçer: mesaj alışverişi ile bağlantı kurulur, ardından veriler gönderilir ve ardından özel mesajların alışverişi ile bağlantı kapatılır. Bağlantı işlemindeki her adım belirli bir adıma karşılık gelir durum bu bağlantı. Bağlantının her iki ucundaki TCP yazılımı, bağlantının diğer tarafının mevcut durumunu sürekli olarak izler.

Aşağıda, bir sunucu ile bağlantının zıt uçlarında bulunan bir istemci arasındaki tipik durum geçişine kısaca bakacağız. Veri gönderirken olası tüm durumların kapsamlı bir tanımını sunmayı amaçlamıyoruz. RFC 793'te verilmiştir ve belge Ana Bilgisayar Gereksinimleri.

Bağlantının kurulması sırasında sunucu ve istemci benzer durum dizilerinden geçer. Sunucu durumları Tablo 10.3'te, istemci durumları ise Tablo 10.4'te gösterilmektedir.


Tablo 10.3 Sunucu durumu sırası

Sunucu durumu Etkinlik Tanım
KAPALI Bağlantı kurulumuna başlamadan önceki sahte durum.
Bir sunucu uygulaması tarafından pasif açılma.
DİNLE (izleme) Sunucu istemciden bağlantı bekliyor.
TCP sunucusu SYN'yi alır ve bir SYN/ACK gönderir. Sunucu SYN'yi aldı ve SYN/ACK'yi gönderdi. ACK'yi beklemeye gider.
SYN ALINDI TCP sunucusu bir ACK alır.
KURULDU (kurulu) ACK alındı, bağlantı açık.

Tablo 10.4 İstemci Durumu Sırası

Eğer ortaklar eşzamanlı olarak birbirleriyle bağlantı kurmaya çalışsaydı (ki bu son derece nadirdir), her biri KAPALI, SYN-GÖNDERİLDİ, SYN-ALINDI ve KURULDU durumlarından geçecekti.

Bağlantının son tarafları, taraflardan biri bağlantı başlatana kadar KURULU durumda kalır. kapatma FIN segmentini göndererek bağlantılar. Normal bir kapanış sırasında kapanışı başlatan taraf Tablo 10.5'te gösterilen durumlardan geçer. Partneri Tablo 10.6'da sunulan durumlardan geçiyor.


Tablo 10.5 Bağlantıyı kapatan tarafın durum sırası

Yan durumların kapatılması Etkinlik Tanım
KURULMUŞ Yerel bir uygulama bağlantının kapatılmasını talep ediyor.
TCP FIN/ACK'yi gönderir.
SON-BEKLEME-1 Kapanış partisi ortağın cevabını bekliyor. İş ortağından hâlâ yeni verilerin gelebileceğini hatırlatalım.
TCP bir ACK alır.
SON-BEKLE-2 Kapanış partisi akrandan bir ACK aldı ancak henüz bir FIN almadı. Kapanış tarafı gelen verileri kabul ederken FIN'i bekler.
TCP FIN/ACK'yi alır.
ACK'yi gönderir.
ZAMAN-BEKLEME Ağda hala mevcut olan yinelenen verilerin veya yinelenen FIN'lerin gelmesine veya atılmasına izin vermek için bağlantı belirsiz bir durumda tutulur. Bekleme süresi, maksimum segment ömrü tahmininin iki katıdır.
KAPALI

Tablo 10.6 Bir bağlantı kapatıldığında ortak durumların sırası

İş ortağı durumu Etkinlik Tanım
KURULMUŞ TCP FIN/ACK'yi alır.
YAKIN BEKLEYİŞ FİN geldi.
TCP bir ACK gönderir.
TCP, uygulamasının bağlantıyı kapatmasını bekler. Bu noktada uygulama oldukça büyük miktarda veri gönderiyor olabilir.
Yerel uygulama bağlantıyı kapatmayı başlatır.
TCP FIN/ACK'yi gönderir.
SON-ACK TCP son ACK'yi bekler.
TCP bir ACK alır.
KAPALI Tüm bağlantı bilgileri silindi.

10.17.1 TCP bağlantı durumlarını analiz etme

Takım netstat -an mevcut bağlantı durumunu kontrol etmenizi sağlar. Durumlardaki bağlantılar aşağıda gösterilmiştir dinle, başlatma, kurulma, kapanış Ve bekleme süresi.

Bağlantı bağlantı noktası numarasının her yerel ve harici adresin sonunda listelendiğini unutmayın. Hem giriş hem de çıkış kuyrukları için TCP trafiğinin olduğunu görebilirsiniz.

Pro Recv-Q Send-Q Yerel Adres Yabancı Adres (durum)
TCP 0 0 128.121.50.145.25 128.252.223.5.1526 SYN_RCVD
Tcp 0 0 128.121.50.145.25 148.79.160.65.3368 KURULDU
Tcp 0 0 127.0.0.1.1339 127.0.0.1.111 TIME_WAIT
Tcp 0 438 128.121.50.145.23 130.132.57.246.2219 KURULDU
Tcp 0 0 128.121.50.145.25 192.5.5.1.4022 TIME_WAIT
TCP 0 0 128.121.50.145.25 141.218.1.100.3968 TIME_WAIT
Tcp 0 848 128.121.50.145.23 192.67.236.10.1050 KURULDU
Tcp 0 0 128.121.50.145.1082 128.121.50.141.6000 KURULDU
Tcp 0 0 128.121.50.145.1022 128.121.50.141.1017 KURULDU
TCP 0 0 128.121.50.145.514 128.121.50.141.1020 CLOSE_WAIT
Tcp 0 1152 128.121.50.145.119 192.67.239.23.3572 KURULDU
TCP 0 0 128.121.50.145.1070 192.41.171.5.119 TIME_WAIT
Tcp 579 4096 128.121.50.145.119 204.143.19.30.1884 KURULDU
Tcp 0 0 128.121.50.145.119 192.67.243.13.3704 KURULDU
TCP 0 53 128.121.50.145.119 192.67.236.218.2018 FIN_WAIT_1
Tcp 0 0 128.121.50.145.119 192.67.239.14.1545 KURULDU

10.18 Uygulamalara ilişkin notlar

En başından beri, TCP protokolü farklı üreticilerin ağ ekipmanlarının birlikte çalışması için tasarlandı. TCP spesifikasyonu, dahili uygulama yapılarının tam olarak nasıl çalışması gerektiğini belirtmez. Bu sorular, her özel uygulama için en iyi mekanizmaları bulmakla görevli geliştiricilere bırakılmıştır.

RFC 1122 bile (belge Ana Bilgisayar Gereksinimleri - ana bilgisayarlar için gereksinimler) varyasyonlar için yeterli özgürlük bırakır. Uygulanan işlevlerin her biri belirli bir uyumluluk düzeyiyle işaretlenmiştir:

■ MAYIS (İzin verilir)

■ OLMAMALIDIR

Ne yazık ki bazen MUST gerekliliklerini uygulamayan ürünler olabiliyor. Bunun sonucunda kullanıcılar performansın düşmesi sıkıntısını yaşıyor.

Bazı iyi uygulama uygulamaları standartların kapsamına girmemektedir. Örneğin, yerel işletim sistemi bu yöntemi destekliyorsa, sistemdeki ayrıcalıklı işlemler tarafından iyi bilinen bağlantı noktalarının kullanımı kısıtlanarak güvenlik artırılabilir. Performansı artırmak için uygulamalar, gönderilen veya alınan verileri mümkün olduğunca az kopyalamalı ve taşımalıdır.

Standart Uygulama Programlama Arayüzü tanımsız(güvenlik politikasının yanı sıra), böylece farklı yazılım araçları setleriyle denemeler yapmak için boş alan olur. Ancak bu, her platformda farklı programlama arayüzlerinin kullanılmasına neden olabilir ve uygulama yazılımlarının platformlar arasında taşınmasına izin vermez.

Aslında geliştiriciler araç kitlerini Berkeley'den ödünç alınan Soket programlama arayüzüne dayandırıyor. WINSock'un (Windows Soketi) ortaya çıkışıyla yazılım arayüzünün önemi arttı; bu, TCP/IP yığınıyla uyumlu herhangi bir WINSock arayüzü üzerinde çalışabilen yeni masaüstü uygulamalarının çoğalmasına yol açtı.

10.19 Daha fazla okuma

Orijinal TCP standardı RFC 793'te tanımlanmıştır. Yükseltmeler, revizyonlar ve uyumluluk gereksinimleri RFC 1122'de ele alınmaktadır. Kern ve Partridge makaleyi yayınladı Güvenilir Taşıma Protokollerinde Gidiş-Dönüş Tahminlerinin İyileştirilmesi Dergide ACM SIGCOMM 1987 Tutanakları. Jacobson'un makalesi Tıkanıklığın Önlenmesi ve Kontrolü ortaya çıkan ACM SIGCOMM 1988 Çalıştayı Bildirileri. Jacobson ayrıca performans algoritmalarını revize eden birkaç RFC yayınladı.