Tcp ip istemci sunucu uygulaması. Ağ programlama - TCP. Giriş ve çıkış veri akışları

  • 15.03.2020

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

QNX Neutrino işletim sistemi, bir IETF otomatik yapılandırma komitesi projesi olan AutoIP adlı başka bir tak ve çalıştır protokolünü uygular. Bu protokol, yerel bağlantı olan ana bilgisayarlara IP adresleri atamak için küçük ağlarda kullanılır. AutoIP protokolü, diğer ana bilgisayarlarla bir anlaşma şeması kullanarak ve merkezi bir sunucuyla iletişim kurmadan, kanalın yerel IP adresini bağımsız olarak belirler.

PPPoE'yi kullanma

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

PPPoE, Ethernet kullanıcılarını kiralık hat, kablosuz cihaz veya kablolu modem gibi geniş bantlı bir bağlantı üzerinden İnternet'e bağlamak için bir özelliktir. PPPoE protokolünün ve bir geniş bant modemin kullanılması, yerel bilgisayar ağının kullanıcılarına yüksek hızlı veri ağlarına bireysel olarak doğrulanmış erişim sağlar.

PPPoE, her kullanıcı için uzak bir sunucuya verimli bir şekilde ayrı bir bağlantı oluşturmak için Ethernet ile PPP'yi birleştirir. Erişim denetimi, bağlantı hesabı ve hizmet sağlayıcı seçimi, ana bilgisayara özgü değil, kullanıcıya özgüdür. Bu yaklaşımın avantajı, ne telefon şirketinin ne de İnternet servis sağlayıcısının bunun için herhangi bir özel destek sağlamak zorunda olmamasıdır.

Çevirmeli bağlantıların aksine, DSL ve kablo modem bağlantıları her zaman etkindir. Uzak bir hizmet sağlayıcıyla olan fiziksel bağlantı birden çok kullanıcı tarafından paylaşıldığından, trafiğin göndericilerini ve hedeflerini kaydeden ve kullanıcıları ücretlendiren bir hesaplama yöntemine ihtiyaç vardır. PPPoE, bir iletişime katılan bir kullanıcının ve uzak bir ana bilgisayarın, adı verilen bir ilk değişim sırasında birbirlerinin ağ adreslerini öğrenmesine izin verir. tespit etme(keşif). Bireysel bir kullanıcı ile uzak bir site (İnternet Servis Sağlayıcısı gibi) arasında bir oturum oluşturulduktan sonra, oturum tahakkuklar için izlenebilir. Birçok evde, otelde ve şirkette İnternet erişimi, Ethernet ve PPPoE kullanılarak dijital abone hatları üzerinden paylaşılır.

Bir PPPoE bağlantısı, bir istemci ve bir sunucudan oluşur. İstemci ve sunucu, Ethernet özelliklerine yakın herhangi bir arabirimi kullanarak çalışır. Bu arabirim, istemcilere IP adresleri vermek, bu IP adreslerini yalnızca iş istasyonu kimlik doğrulaması yerine kullanıcılara ve isteğe bağlı olarak iş istasyonlarına bağlamak için kullanılır. PPPoE sunucusu, her istemci için noktadan noktaya bağlantı oluşturur.

PPPoE Oturumu Oluşturma

Bir 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- *ile birlikteuygun sürücü... Örnek:

TCP, istemci/sunucu ortamına doğal olarak entegre olur (bkz. Şekil 10.1). sunucu uygulaması dinler(dinle) gelen bağlantı istekleri. Örneğin, WWW, Dosya Aktarımı veya Terminal Erişimi hizmetleri, istemcilerden gelen istekleri dinler. TCP'de iletişim, sunucuya bağlantıyı başlatan uygun alt rutinler tarafından başlatılır (soket programlama arayüzünde 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 iletilerini iletmek için diğer posta sunucularına bağlanabilir.

10.2 TCP Kavramları

Uygulamalar TCP üzerinden hangi biçimde veri göndermelidir? TCP verileri IP'ye nasıl aktarır? Gönderen ve alan TCP protokolleri, uygulamalar ve onu uygulamak için gereken veri öğeleri arasındaki bağlantıyı nasıl tanımlar? Bu soruların tümü, temel TCP 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, uygulamanın eş uygulamaya bir veri akışı gönderdiğini varsayar. Aynı zamanda, bağlantı ortağından bir veri akışı alabilir. TCP sağlar Tam dubleks(tam çift yönlü) çalışma modu, aynı anda iki akış veriler (bkz. Şekil 10.2).


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

10.2.2 Segmentler

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

Uygulama, verileri TCP'de iletir ve bu protokol onu çıktı arabelleği(arabellek gönder). Ardından, TCP arabellekten veri parçalarını keser ve bir başlık ekleyerek bunları gönderir (bu durumda, segmentler- segment). İncirde. 10.3, verilerin nasıl çıktı arabelleği TCP, segmentler halinde paketlenir. TCP, segmenti ayrı bir datagram olarak teslim edilmek üzere IP'ye iletir. Verileri doğru uzunlukta parçalar halinde paketlemek, verilerin verimli bir şekilde gönderilmesini sağlar, bu nedenle TCP, bir segment oluşturmadan önce çıktı arabelleğinde karşılık gelen miktarda veri görünene kadar bekleyecektir.


Pirinç. 10.3 TCP segmenti oluşturma

10.2.3 Fırlatma

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 Dönüş).

Kullanıcının istemci programı, uzak ana bilgisayara veri göndermeyi bilmek ve bunu hemen yapmak için TCP'ye ihtiyaç duyar. Bu durumda, kullanın fırlatma(itmek).

Etkileşimli bir oturumdaki işlemlere bakarsanız, çok az veri içeren birçok segment bulabilirsiniz ve dahası, verilerin hemen hemen her segmentinde tümsekler bulunabilir. Ancak, dosya aktarımları sırasında (en son segment hariç) push uygulanmamalıdır ve TCP, verileri segmentlere en verimli şekilde paketleyebilecektir.

10.2.4 Acil veriler

Uygulama iletme modeli, hedefe giden sıralı bir bayt akışının uygulanmasını varsayar. Etkileşimli oturum örneğine tekrar atıfta bulunarak, kullanıcının tuşa bastığını varsayalım. dikkat(dikkat) veya kırmak(kesmek). Uzak uygulama, müdahale eden baytları atlayabilmeli ve mümkün olan en kısa sürede tuş vuruşuna yanıt verebilmelidir.

mekanizma acil veri(acil veriler) segmentteki özel bilgileri şu şekilde işaretler: acil. Bununla TCP, eşine segmentin acil veri içerdiğini bildirir ve nerede olduğunu gösterebilir. İş ortağı, bu bilgiyi mümkün olan en kısa sürede hedef uygulamaya iletmelidir.

10.2.5 Uygulama portları

Müşteri, erişmek istediği hizmeti tanımlamalıdır. Bu, ana bilgisayarın hizmet IP adresinin ve TCP bağlantı noktası numarasının belirtilmesi yoluyla yapılır. UDP'de olduğu gibi, TCP bağlantı noktası numaraları 0 ila 65535 arasındadır. 0 ila 1023 aralığındaki bağlantı noktaları iyi bilinir olarak adlandırılır ve standart hizmetlere erişmek için kullanılır.

İyi bilinen bağlantı noktalarının birkaç örneği ve bunlara karşılık gelen uygulamalar Tablo 10.1'de gösterilmektedir. Hizmetler atmak(port 9) ve şarjlı(port 19), UDP'den zaten bildiğimiz hizmetlerin TCP sürümleridir. TCP bağlantı noktası 9 trafiğinin UDP bağlantı noktası 9 trafiğinden tamamen yalıtıldığını unutmayın.


Tablo 10.1 Yaygın Olarak Bilinen TCP Bağlantı Noktaları ve Karşılık Gelen Uygulamaları

Liman Başvuru Açıklama
9 atmak Tüm gelen verileri iptal etme
19 şarj Sembol üreteci. Karakter akışı değişimi
20 FTP-Veri FTP veri yönlendirme bağlantı noktası
21 FTP FTP görüşmesi için bağlantı noktası
23 TELNET Uzak Telnet kaydı için bağlantı noktası
25 SMTP SMTP bağlantı noktası
110 POP3 Kişisel bilgisayarlar için posta hizmeti alma
119 NNTP Çevrimiçi haberlere erişim

İstemciler tarafından kullanılan 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 kullanılmayan ve ayrılmamış bir bağlantı noktası atamasını ister. Bağlantının sonunda, istemci bu bağlantı noktasını geri vermekle yükümlüdür, ardından 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ı sınırları göz ardı edilebilir.

10.2.6 soket adresleri

Bildiğimiz gibi, iletişim için IP adresi ve bağlantı noktasının birleşimine denir. priz. Bir TCP bağlantısı, o bağlantının her iki ucundaki soket adresiyle tam olarak tanımlanır. İncirde. 10.4, soketteki bir istemci (128.36.1.24, port = 3358) ile soketteki bir sunucu (130.42.88.22, port = 21) arasındaki bağlantıyı gösterir.

Pirinç. 10.4. Soket adresleri

Her datagram başlığı, kaynak ve hedef IP adreslerini içerir. Kaynak ve hedef port numaralarının TCP segment başlığında belirtildiği ileride görülecektir.

Tipik olarak, bir sunucu aynı anda birden fazla istemciyi yönetme yeteneğine sahiptir. Bir sunucunun benzersiz soket adresleri, tüm istemcilerine aynı anda atanır (bkz. Şekil 10.5).


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

Datagram, IP adresleri ve bağlantı noktaları tarafından tanımlanan bir TCP bağlantı kesimi içerdiğinden, bir sunucunun birden çok istemci bağlantısını izlemesi çok kolaydır.

10.3 TCP Güvenilirlik Mekanizması

Bu bölümde, iletme sırasını korurken ve kayıp veya tekrarı önlerken verileri güvenilir bir şekilde teslim etmek için kullanılan TCP mekanizmasına bakacağız.

10.3.1 Numaralandırma ve doğrulama

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

Alıcının verilerin alındığını onaylaması gerekir. Zaman aşımı aralığı içinde ACK gelmezse, veriler yeniden iletilir. Bu yöntem denir röle ile olumlu onay(yeniden iletim ile olumlu alındı).

Alıcı TCP, verilerin tutarlı bir şekilde alındığından ve eksik parça olmadığından emin olmak için gelen sıra numaralarını yakından izler. ACK rastgele kaybolabileceğinden veya gecikebileceğinden, alıcıya yinelenen segmentler ulaşabilir. Sıra numaraları, daha sonra atılan yinelenen verileri tanımlamanıza olanak tanır.

İncirde. 10.6, TCP zaman aşımına ve yeniden iletime basitleştirilmiş bir bakış gösterir.


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ı

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


Pirinç. 10.7. TCP Başlık Alanlarında İlk Değerler

Küçük bir ayrıntıya dikkat edilmelidir. TCP'nin 1'den 50'ye veya daha fazla bayt gönderdiğini varsayalım, gönderilecek veri yok. Bir ortaktan veri alınırsa, TCP, kendisine bağlı hiçbir veri olmadan bir başlık göndereceği alındığını onaylamak zorundadır. Doğal olarak, bu başlık ACK değerini içerir. Sıra alanı 51 değerini içerir, yani. sonraki baytın numarası niyetinde TCP'yi gönderin. TCP bir sonraki veriyi gönderdiğinde, yeni TCP başlığı da sıra alanında 51 değerine sahip olacaktır.

10.4 Bağlantı kurma

İki uygulama nasıl bağlanır? İletişimden önce, her biri bu bağlantının TCP ve IP parametrelerini depolamak için kullanılacak bir bellek bloğu oluşturmak için bir alt rutin çağırır, örneğin soket adresleri, geçerli sıra numarası, yaşam süresinin ilk değeri vb.

Sunucu uygulaması, sunucuya erişmek isteyen bir istemcinin görünmesini bekler. birleştirmek(bağlan) sunucunun IP adresini ve portunu tanımlar.

Bir teknik özellik var. Her bir taraf, her baytın numaralandırılmasına bir ile değil, rastgele sıra numarası(aşağıda bunun neden yapıldığını öğreneceğiz). Orijinal spesifikasyon şunları tavsiye eder: Yaklaşık olarak her 4 μs'de bir artan 32 bitlik bir harici zamanlayıcıya dayalı bir başlangıç ​​sıra numarası oluşturun.

10.4.1 Bağlantı komut dosyası

Bağlantı prosedürü genellikle üç yönlü el sıkışma olarak adlandırılır, çünkü bağlantı kurmak için üç mesaj (SYN, SYN ve ACK) değiş tokuş edilir.

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

1. Veri almak için arabellek alanı miktarı

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

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

Her iki tarafın da 1 ve 2 numaralı işlemleri uyguladığını unutmayın. diğer tarafın faaliyet göstereceği sınırlar. Kişisel bir bilgisayarın küçük bir alma arabelleği olabilir ve bir süper bilgisayarın büyük bir arabelleği olabilir. Bir kişisel bilgisayarın bellek yapısı, gelen veri bölümlerini 1 KB ile sınırlayabilir ve süper bilgisayar büyük bölümlerle kontrol edilir.

Karşı tarafın veriyi nasıl gönderdiğini kontrol edebilme yeteneği, TCP/IP ölçeklenebilirliği için önemli bir özelliktir.

İncirde. 10.8, bir bağlantı komut dosyası örneğini gösterir. Çizimi bunaltmayacak şekilde çok basit başlangıç ​​sıra numaraları sunulmuştur. Bu şekilde, istemcinin sunucudan daha büyük segmentler alabildiğine dikkat edin.


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 etkin açık denir).

3. İstemci TCP, ilk sıra numarasını alır (bu örnekte - 1000) ve eşitleme segmenti(segmenti senkronize et - SYN). Bu segment sıra numarasını, alma penceresi boyutunu (4K) ve istemcinin kabul edebileceği en büyük segmenti (1460 bayt) taşır.

4. Bir SYN geldiğinde, sunucu TCP benim başlangıç ​​sıra numarası (3000). Bir başlangıç ​​sıra numarası (3000), ACK 1001 (bu, istemci tarafından gönderilen ilk baytın 1001 numaralı olduğu anlamına gelir), alma penceresi boyutu (4K) ve sunucunun alabileceği en büyük segmenti (1024 bayt) içeren bir SYN segmenti gönderir. ).

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

6. İstemci TCP, uygulamasına bir bağlantı açmasını söyler.

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

İstemci ve sunucu alınan veriler için kurallarını duyurur, sıra numaralarını senkronize eder ve veri alışverişine hazır hale gelir. TCP belirtimi, eş uygulamalar aynı anda aktif olarak birbirini açtığında başka bir (çok başarılı olmayan) senaryoya da izin verir.

10.4.2 IP Parametre Değerlerini Ayarlama

Uygulamanın bağlantı talebi, o bağlantı için verileri taşıyacak olan IP datagramları için parametreler de belirleyebilir. 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 istenen 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, devlet veya askeri kurumlar için güvenlik seçeneklerini kullandığında, bağlantı uç noktalarının her biri aynı güvenlik düzeylerini kullanmalıdır, aksi takdirde bağlantı kurulmaz.

10.5 Veri aktarımı

Veri aktarımı, bağlantı oluşturmanın üç aşamalı onayının tamamlanmasından sonra 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ırma kolaylığı için 1000 baytlık mesajlar kullanılır. Her TCP başlık segmenti, bağlantıdaki eşten alınması beklenen baytın sıra numarasını tanımlayan bir ACK alanına sahiptir..


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

İstemci tarafından gönderilen ilk segment, 1001'den 2000'e kadar baytlar içerir. ACK alanı, sunucudan alınması gereken baytın sıra numarasını gösteren 3001 değerini içermelidir.

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

İstemci daha sonra bu sırayla bayt 2001, 3001 ve 4001 ile başlayan segmentler gönderir. İstemcinin gönderilen segmentlerin her birinin ardından bir ACK beklemediğini unutmayın. Veriler, arabellek alanı dolana kadar ortağa gönderilir (alıcının kendisine gönderilen veri miktarını çok doğru bir şekilde belirtebileceğini aşağıda göreceğiz).

Sunucu, tüm kesimlerin başarılı bir şekilde iletilmesini belirtmek için tek bir ACK kullanarak bant genişliğini korur.

İncirde. 10.10, ilk segment kaybolduğunda veri aktarımını gösterir. Zaman aşımı süresi dolduğunda, segment yeniden iletilir. Kayıp segmenti aldıktan sonra alıcının her iki segmentin de gönderildiğini onaylayan bir ACK gönderdiğine dikkat edin.


Pirinç. 10.10. Veri kaybı ve yeniden iletim

10.6 Bağlantıyı kapatma

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

A:

B:"İyi".

V:"Ben de işi bitirdim."

A:"İyi".

Aşağıdaki senaryo da kabul edilebilir (nadiren kullanılmasına rağmen):

A:"Bitirdim. Gönderilecek başka veri yok."

V:"İyi. Ancak, bazı veriler var ..."

V:"Ben de işi bitirdim."

A:"İyi".

Aşağıdaki örnekte, genellikle istemci/sunucu iletişiminde olduğu gibi bağlantı sunucuyu kapatır. Bu durumda kullanıcı oturuma girdikten sonra telnet oturumu kapatma komutları, sunucunun bağlantıyı kapatmak için bir istek başlatmasını sağlar. Şekilde gösterilen durumda. 10.11, aşağıdaki eylemler gerçekleştirilir:

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

2. TCP sunucusu, eşine gönderilecek daha fazla veri olmadığını bildiren bir Son Segment (FIN) gönderir.

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

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

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

6. İstemcinin TCP'si bir FIN mesajı gönderir.

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

8. TCP sunucusu, uygulamasına bağlantıyı kapatması talimatını verir.


Pirinç. 10.11. Bir bağlantıyı kapatma

Her iki taraf da aynı anda kapanmaya başlayabilir. Bu durumda, her bir ortak bir ACK mesajı gönderdikten sonra normal bağlantı kapatma işlemi tamamlanır.

10.6.1 Ani sonlandırma

Taraflardan her biri bağlantının aniden kapatılmasını talep edebilir. Bu, bir uygulama bir bağlantıyı sonlandırmak istediğinde veya TCP kendi başına çözemeyeceği ciddi bir iletişim sorunuyla karşılaştığında kabul edilebilir. TCP başlığındaki belirli bir bayrakla belirtildiği gibi, eşe bir veya daha fazla sıfırlama mesajı göndererek ani sonlandırma istenir.

10.7 Akış kontrolü

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

Bağlantı kurulumu sırasında her bir ortak, bağlantının giriş arabelleği için yer ayırır ve bunu diğer tarafa bildirir. Tipik olarak, arabellek boyutu, maksimum segment boyutlarının tam sayısı olarak ifade edilir.

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


Pirinç. 10.12. Giriş arabelleğinin alma penceresi

Veri geldikçe arabellek alanı dolar. Alıcı uygulama arabellekten veri getirdiğinde, boşaltılan alan yeni gelen veriler için kullanılabilir hale gelir.

10.7.1 Alma penceresi

alma penceresi(alma penceresi) - giriş arabelleğinde henüz veri tarafından doldurulmamış herhangi bir boşluk. Veriler, hedef uygulama tarafından tüketilene kadar giriş arabelleğinde kalır. Uygulama neden verileri hemen almı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 yüklediğini varsayalım. FTP programı daha sonra arabellekten verileri 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şladığında, aşağıdaki veriler zaten arabelleğe gelir.

Alma penceresi, son onaylanan bayttan arabelleğin sonuna kadar genişler. İncirde. 10.12 ilk olarak, tüm arabellek mevcuttur ve bu nedenle 4KB'lik bir alma penceresi mevcuttur. İlk KB geldiğinde, alma penceresi 3 KB'ye düşürülecektir (basitlik için, her segmentin boyutunun 1 KB olduğunu varsayacağız, ancak pratikte bu değer uygulamanın ihtiyaçlarına göre değişir). Sonraki iki 1 KB'lik bölümün gelmesi, alma penceresini 1 KB'ye indirecektir.

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

TCP standardı bu arabelleğin nasıl işleneceğini belirtmese de, çoğunlukla, giriş arabelleğinin boyutu bağlantı başlangıç ​​zamanında ayarlanır. Giriş arabelleği, gönderene geri bildirim sağlamak için büyüyebilir veya küçülebilir.

Gelen bir segment alma penceresine yerleştirilebiliyorsa ancak sırayla gelmediyse ne olur? Genel olarak, tüm uygulamaların alınan verileri alma penceresinde depoladığı ve yalnızca birkaç segmentten oluşan bir bütün bitişik blok için bir alındı ​​(ACK) gönderdiği varsayılır. Bu doğru yöntemdir, çünkü aksi halde sıra dışı verileri atmak performansı önemli ölçüde düşürür.

10.7.2 Gönder penceresi

Verileri ileten sistem iki özelliği takip etmelidir: halihazırda ne kadar veri gönderildiği ve onaylandığı ve alıcının alma penceresinin mevcut boyutu. Aktif sevk alanı(gönderme alanı) geçerli alıcı penceresinin solundaki ilk onaylanmayan sekizliden genişler. Bölüm pencere tarafından kullanılan göndermek, ortağa ne kadar ek veri gönderilebileceğini gösterir.

Alma penceresinin ilk sıra numarası ve ilk boyutu, bağlantı kurulumu sırasında ayarlanır. Pirinç. 10.13, veri aktarım mekanizmasının bazı özelliklerini gösterir.

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

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

3. İlk KB için ACK mesajı gelir ve sonraki 2 KB veri gönderilir. Sonuç, Şekil 3'ün üst kısmından üçüncü kısımda gösterilmektedir. 10.13. 2 KB'lık depolama devam ediyor.

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

Pirinç. 10.13. pencere gönder

Birkaç ilginç özelliğe dikkat edilmelidir:

S Gönderici, gönderdiği veri segmentlerinin her biri için bir ACK beklemez. İletimle ilgili tek sınırlama, alma penceresinin boyutudur (örneğin, gönderen yalnızca 4K tek baytlık segmentleri iletmelidir).

S Göndericinin birkaç çok kısa segmentte (örneğin, 80 bayt) veri gönderdiğini varsayalım. Bu durumda, daha verimli aktarım için veriler yeniden biçimlendirilebilir (örneğin, tek bir segmente).

10.8 TCP Başlığı

İncirde. 10.14, segment biçimini gösterir (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ı), bu segmentin kapladığı giden veri akışındaki konumu belirtir. Alan ACK(onay), giriş veri akışında görünmesi beklenen bir sonraki segment hakkında bilgi içerir.


Pirinç. 10.14. TCP segmenti

Altı bayrak vardır:

Alan veri yanlılığı(Veri Ofseti), TCP başlığının boyutunu 32 bit 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 alınabilecek ve işlenebilecek en büyük veri yığınının reklamını yapmak için kullanılır. Ancak, başlık biraz yanlış. Genellikle TCP'de segment başlık artı veri olarak kabul edilir. ancak maksimum segment boyutuşu şekilde tanımlanır:

Kabul edebileceğiniz en büyük datagram 40'tır.

Başka bir deyişle, MSS en büyük olanı yansıtır. yük 20 baytlık bir TCP ve IP başlıklarına sahip 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:

MSS beyan edilen değer + 40 - (TCP ve IP başlık uzunluklarının toplamı)

Tipik olarak, bir bağlantı açıldığında eşler ilk SYN mesajlarında MSS değerlerini değiştirir. Sistem bir maksimum segment boyutu değeri bildirmezse, 536 baytlık varsayılan değer kullanılır.

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

MSS, TCP'ye gönderilen verilere katı bir sınır koyar: alıcı büyük değerleri işleyemez. Ancak, gönderen segmentleri kullanıyor daha küçükçünkü yol boyunca MTU da bağlantı için belirlenir.

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

Bir bağlantı açmak için gönderilen ilk segmentin SYN bayrağı 1 ve ACK bayrağı 0'dır. İlk SYN tek bir ACK alanı 0 olan bir segment. Güvenliğin, bir TCP oturumu için gelen istekleri algılamak için bu özelliği kullandığını unutmayın.

Alan seri numarası içerir başlangıç ​​sıra numarası(ilk 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 536 bayttır). Bu değer 32 bit uzunluğundadır ve genellikle sahadaki bağlantı isteğinde bulunur. seçenekler(Seçenek). MSS değerini içeren TCP başlığı 24 bayt uzunluğundadır.

10.8.3 Bağlantı yanıtında başlık alanlarının kullanılması

Bir bağlantı talebine verilen yanıtta, her iki bayrak (SYN ve ACK) 1'e eşittir. Yanıt veren sistem, ilgili alandaki ilk sıra numarasını ve alandaki alma penceresinin boyutunu gösterir. 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, yani. iki farklı değer kullanılabilir.

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

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

TCP belirtimi, bağlantı kurulması sırasında her bir tarafın başlangıç ​​sıra numarası(32 bit dahili zamanlayıcının mevcut değerinde). Bu nasıl yapılır?

Sistem çöktüğünde ne olacağını hayal edin. Kullanıcının çökmeden hemen önce bir bağlantı açtığını ve az miktarda veri gönderdiğini varsayalım. Kurtarma işleminden sonra sistem, halihazırda çalışan bağlantılar ve atanan bağlantı noktası numaraları 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 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 ucundaki diğer taraf, ortağının bir çöküş yaşadığını ve işinin geri yüklendiğini bilmiyor olabilir. Tüm bunlar, özellikle eski verilerin ağ üzerinden dolaşıp yeni oluşturulan bağlantıdan gelen verilerle karışması uzun zaman aldığında, işte ciddi aksamalara yol açacaktır. Yeni başlatmanın zamanlayıcı seçimi 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 için kaynak IP adresini tahrif ederken, mesajda tahmin edilebilir bir başlangıç ​​sıra numarası belirterek bilgisayarlara erişmeye çalışırlar. Dahili anahtarlara dayalı bir şifreleme karma işlevi, güvenli çekirdek numaralarını seçmenin en iyi yoludur.

10.8.5 Alanların ortak kullanımı

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

Bağlantı ortağından beklenen bir sonraki sekizli sayı alana girilir Onayla(Onay Numarası) ACK biti 1 olarak ayarlandığında. pencere(Pencere) alıcı pencerenin geçerli boyutu içindir. Bu alan şunları içerir: onay numarasından kabul edilebilecek bayt sayısı... Bu değerin veri akışının hassas kontrolüne izin verdiğini unutmayın. Bu değeri kullanarak ortak, değişim oturumu sırasında alma penceresinin gerçek durumunu belirtir.

Uygulama bir TCP push işlemine işaret ediyorsa, PUSH bayrağı 1'e ayarlanır. Alıcı TCP, gönderen göndermek istediği anda uygulamaya hızlı bir şekilde veri ileterek bu bayrağa yanıt vermek ZORUNDADIR.

ACİL bayrağı, 1 olarak ayarlanırsa, verilerin acil olarak gönderildiğini ve karşılık gelen işaretçinin acil verilerin son sekizlisine başvurması ZORUNLUDUR. Acil veriler için tipik bir kullanım, terminalden iptal veya kesinti sinyalleri göndermektir.

Acil veriler genellikle denir bant dışı bilgi(bant dışı). Ancak bu terim yanlıştır. Hızlandırılmış veriler normal bir TCP akışında gönderilir, ancak bazı uygulamaların uygulamaya acil verileri almasını söyleyen özel mekanizmaları olabilir ve uygulamanın, mesajın tüm baytları ulaşmadan önce acil verilerin içeriğini kontrol etmesi gerekir.

Bağlantıyı iptal etmek için RESET bayrağı 1 olarak ayarlanır. Aynı bayrak, mevcut TCP bağlantılarından herhangi biriyle ilişkili olmayan bir segment geldiğinde yanıtta 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 ve TCP sağlama toplamı, IP başlığından oluşturulan sözde başlık kadar tüm segment için hesaplanır. TCP sağlama toplamının hesaplanması sırasında ilgili alan 0'a ayarlanır. Şek. 10.15, UDP sağlama toplamında kullanılana çok benzer bir sözde başlık gösterir.


Pirinç. 10.15. Sözde başlık alanı, TCP sağlama toplamına dahil edilmiştir

TCP uzunluğu, veri uzunluğu ile TCP başlık uzunluğunun eklenmesiyle hesaplanır. TCP sağlama toplamı zorunlu, UDP gibi değil. Alınan segmentin sağlama toplamı önce alıcı tarafından hesaplanır ve ardından TCP başlığının sağlama toplamı alanının içeriği ile 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 protokolü koklayıcı Network General tarafından, bir TCP segmentleri dizisidir. İlk üç bölüm, istemci ve sunucu arasında bir bağlantı kurar. telnet... Son segment 12 bayt veri taşır.


Pirinç. 10.16. Sniffer Analyzer ile TCP Başlığını Görüntüleme

analizör koklayıcıçoğu değeri ondalık basamağa çevirir. Ancak bayrak değerleri onaltılık olarak çıktılanır. 12 değerli bayrak 010010'dur. Sağlama toplamı da onaltılık biçimde görüntülenir.

10.10 Oturum desteği

10.10.1 Pencere problama

Hızlı bir gönderici ve yavaş bir alıcı, 0 baytlık 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 kaybolursa her iki taraf da süresiz olarak beklemek zorunda kalacaktır.

Bu durumdan kaçınmak için gönderen ayarlar saklanan zamanlayıcı(kalıcı zamanlayıcı) pencere kapatıldığında. Zamanlayıcı değeri, yeniden iletim zaman aşımıdır. Zamanlayıcının sonunda ortağa bir segment gönderilir. sondaj penceresi(pencere araştırması; bazı uygulamalar veri de içerir). Sondalama, eşin pencerenin mevcut durumunu bildiren bir ACK göndermesine neden olur.

Pencere hala sıfır boyuttaysa, saklanan 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çılana, kullanıcı işlemi sonlandırana veya uygulama zaman aşımına uğrayana kadar her 60 saniyede bir yoklama mesajları göndermeye devam edecektir.

10.11 Oturumu kapatma

10.11.1 Zaman Aşımı

Bağlantı ortağı, bir ağ geçidi veya iletişim hatası nedeniyle çökebilir veya tamamen kesintiye uğrayabilir. TCP'nin verileri yeniden göndermesini önlemek için çeşitli mekanizmalar mevcuttur.

Yeniden iletim (röle) için ilk eşiğe ulaştıktan sonra, TCP, IP'ye arızalı yönlendiriciyi kontrol etmesini söyler ve aynı zamanda sorunu uygulamaya bildirir. TCP, ikinci sınır değerine ulaşılana kadar veri göndermeye devam eder ve ancak bundan sonra bağlantıyı sonlandırır.

Tabii ki, bu gerçekleşmeden önce, bir nedenden dolayı hedefe ulaşılamadığını belirten bir ICMP mesajı gelebilir. Bazı uygulamalarda, o zaman bile TCP, zaman aşımı aralığı sona erene kadar hedefe erişmeye çalışmaya devam edecektir (bundan sonra sorun çözülebilir). Ardından, uygulamaya hedefin ulaşılamaz olduğu bildirilir.

Uygulama kendi veri teslim zaman aşımını ayarlayabilir ve bu aralığın sonunda kendi işlemlerini gerçekleştirebilir. Bağlantı genellikle kesilir.

10.11.2 Bağlantının sürdürülmesi

Eksik bir bağlantıda uzun süre aktarılacak veriler olduğunda, etkin değil durumuna geçer. Aktif olmayan bir süre boyunca, bir ağ çökmesi veya fiziksel bağlantıların kaybı meydana gelebilir. Ağ tekrar çalışır hale gelir gelmez, ortaklar iletişim oturumunu kesintiye uğratmadan veri alışverişi yapmaya devam edeceklerdir. Bu strateji, Savunma Bakanlığı'nın gereksinimleriyle uyumluydu.

Ancak, herhangi bir bağlantı - etkin veya etkin değil - çok fazla bilgisayar belleği kaplar. Bazı yöneticilerin kullanılmayan kaynakları sistemlere iade etmesi gerekir. Bu nedenle, birçok TCP uygulaması hakkında bir mesaj gönderebilir. bağlantıyı sürdürmek(canlı tutma), etkin olmayan bağlantıları test etme. Bu tür mesajlar, ağdaki varlığını doğrulamak için ortağa periyodik olarak gönderilir. ACK mesajları yanıt olarak alınmalıdır. Canlı tutma mesajlarının kullanımı isteğe bağlıdır. Sistemin bu özelliği varsa uygulama kendi imkanları ile iptal edebilir. Tahmini dönem varsayılan bir bağlantıyı sürdürmek için zaman aşımı tam iki saattir!

Uygulamanın kendi zamanlayıcısını ayarlayabileceğini ve buna göre kendi düzeyinde bağlantıyı sonlandırmaya karar vereceğini hatırlayın.

10.12 Verim

TCP ne kadar verimli? Bellek ve bant genişliği başta olmak üzere birçok faktör kaynak performansını etkiler (bkz. Şekil 10.17).


Pirinç. 10.17. TCP performans faktörleri

Kullanılan fiziksel ağdaki bant genişliği ve gecikme, bant genişliğini ciddi şekilde sınırlayacaktır. Kötü veri aktarımı, yeniden iletime neden olan ve sonuç olarak bant genişliği verimliliğini azaltan büyük miktarda veri biriminin düşmesine neden olur.

Alıcı taraf, göndericinin veriyi kesintisiz olarak aktarabilmesi için yeterli arabellek alanı sağlamalıdır. Bu, özellikle veri gönderme ve ACK alma (ve ayrıca pencere boyutu üzerinde anlaşma yaparken) arasında uzun bir zaman aralığının olduğu yüksek gecikme süresine sahip ağlar için önemlidir. Kaynaktan istikrarlı bir veri akışı sağlamak için, alıcı taraf, en azından gecikme çarpımının bant genişliğinin bir penceresine sahip olmalıdır.

Örneğin, kaynak 10.000 bayt/s hızında veri gönderebiliyorsa ve bir ACK döndürmesi 2 saniye sürüyorsa, diğer tarafta en az 20.000 baytlık bir alıcı penceresi sağlamanız gerekir, aksi takdirde veri akışı sürekli olmayacaktır. 10.000 baytlık bir alma arabelleği, verimi yarıya indirecektir.

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, birçok 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ü gizlerken tüm bu işlemlere hizmet verilmesini sağlar. TCP / IP'yi işletim sistemi çekirdeğiyle bütünleştiren uygulamalar, bağlam değiştirmeyi kullanma ek yükünü önemli ölçüde azaltabilir.

Bilgisayarın CPU'sunun kaynakları, TCP başlıklarının işlenmesi için gereklidir. İşlemci sağlama toplamlarını hızlı bir şekilde hesaplayamazsa, ağ üzerinden veri aktarım hızını yavaşlatır.

Ayrıca geliştiriciler, ağ yöneticisinin bunları yerel gereksinimlerine uyacak şekilde özelleştirebilmesi için TCP ayarlarını yapılandırmayı kolaylaştırmayı düşünmelidir. Örneğin, bant genişliği ve ağ gecikmesi için arabellek boyutunu 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 sabit kodluyor.

Ağ ortamının mükemmel olduğunu varsayalım: Yeterli kaynak var ve bağlam değiştirme, tabancalarını çeken kovboylardan daha hızlı. Mükemmel performans elde edecek misiniz?

Her zaman değil. TCP yazılım geliştirmenin kalitesi de önemlidir. Çeşitli TCP uygulamalarında yıllar içinde birçok performans sorunu teşhis edildi ve çözüldü. En iyi yazılım, İnternet ana bilgisayarları için iletişim katmanı gereksinimlerini tanımlayan RFC 1122'dir.

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

Yazılım geliştiriciler, küçük miktarlardaki verilerin gereksiz aktarımını ortadan kaldıran ve şu anda kullanılmayan ağ kaynaklarına yönelik yerleşik zamanlayıcılara sahip programlar oluşturarak önemli avantajlar elde edebilir.

10.13 Performansı iyileştirmek için algoritmalar

TCP'nin oldukça karmaşık kısmına geçerek, performansı artırmaya ve bant genişliği darboğazlarını çözmeye yönelik mekanizmalara bakacağız. Bu bölümde aşağıdaki konular tartışılmaktadır:

Yavaş başla(yavaş başlangıç), ağ trafiğinin büyük bir bölümünün yeni bir oturum için kullanılmasını engeller ve bu da ek yüke neden olabilir.

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

Gecikmeli ACK(gecikmeli ACK), bağımsız ileri alındı ​​bildirim mesajlarının sayısını azaltarak tıkanıklığı azaltır.

Hesaplanmış yeniden iletim zaman aşımı(hesaplama yeniden iletim zaman aşımı), gerçek zamanlı oturum zamanı anlaşmasını temel alır, gereksiz yeniden iletimleri azaltır, ancak gerçekten ihtiyaç duyulan veri alışverişi için büyük gecikmelere neden olmaz.

■ Şu durumlarda TCP iletmeyi yavaşlatın: aşırı yükler ağda, yönlendiricilerin orijinal modlarına dönmesine ve tüm oturumlar için ağ kaynaklarını paylaşmasına olanak tanır.

■ Gönderme yinelenen ACK'ler(yinelenen ACK) sıra dışı bir segment alırken, eşlerin zaman aşımı oluşmadan önce yeniden göndermesine izin verir.

10.13.1 Yavaş başlangıç

Evde tüm elektrikli ev aletleri aynı anda açılırsa, elektrik şebekesinde aşırı yüklenme meydana gelir. bilgisayar ağlarında yavaş başlaşebeke sigortalarının atmasını önler.

Halihazırda yüklü bir ağda büyük miktarda veri aktarımını anında tetikleyen yeni bir bağlantı sorunlara yol açabilir. Yavaş başlatmanın ardındaki fikir, gerçek ağ yüküne göre veri aktarım hızını yavaşça artırırken yeni bağlantının başarılı bir şekilde başlamasını sağlamaktır. Gönderici, 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 segment için, yükleme penceresi, alma penceresinden daha küçük kaldığı sürece 1 segment artar. Ağ aşırı yüklenmemişse, yükleme penceresi yavaş yavaş alıcı pencerenin boyutuna ulaşacaktır. Normal iletme koşulları altında, bu pencereler aynı boyutta olacaktır.

Yavaş başlatmanın o kadar yavaş olmadığını unutmayın. İlk ACK'den sonra, yükleme penceresinin boyutu 2 segmente eşittir ve iki segment için bir ACK başarıyla alındıktan sonra boyut 8 segmente çıkabilir. Başka bir deyişle, pencere boyutu katlanarak büyür.

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

10.13.2 Clueless Pencere Sendromu

TCP / IP'nin ilk uygulamalarında geliştiriciler bu fenomenle karşı karşıya kaldılar. aptal pencere sendromu(Silly Window Syndrome - SWS) oldukça sık ortaya çıktı. Meydana gelen olayları anlamak için, istenmeyen sonuçlara yol açan aşağıdaki senaryoyu düşünün, ancak bu oldukça mümkündür:

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

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

3. Giriş arabelleği okumadan sonra 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ürler. Bir paket aldım ve artık boş alanım yok" anlamına gelen bir ACK gönderir.

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

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

Gerçek hayattaki durumlar elbette çok aşırı değil. Hızlı bir gönderici ve yavaş bir alıcı, küçük (maksimum segment boyutuna göre) veri parçalarını değiş tokuş edecek ve neredeyse tam bir alma penceresi arasında geçiş yapacaktır. İncirde. 10.18, "aptal pencere" sendromunun ortaya çıkması için koşulları gösterir.


Pirinç. 10.18.Çok küçük boş alana sahip pencere arabelleği alın

Bu sorunu çözmek zor değil. Alma penceresi verilen hedef boyutun altına düştüğünde, TCP göndereni kandırmaya başlar. Bu durumda, TCP göndereni işaret etmemelidir. ek olarak alan uygulama arabellekten küçük parçalar halinde veri okuduğunda penceredeki boşluk. Bunun yerine, serbest bırakılan kaynaklar, yeterli miktarda bulunana kadar gönderenden gizli tutulmalıdır. Tüm giriş arabelleği tek bir bölüm içermedikçe (ikinci durumda, arabelleğin yarısına eşit bir boyut kullanılır) önerilen boyut bir bölümdür. TCP tarafından raporlanacak hedef boyut şu şekilde ifade edilebilir:

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

TCP, pencere boyutu bu boyuttan küçük olduğunda hile yapmaya başlar ve pencere boyutu formülle elde edilen değerden küçük olmadığında doğruyu söyler. Alıcı uygulama beklediği verilerin çoğunu yine de işleyemeyeceğinden gönderene bir zararı olmadığını unutmayın.

Önerilen çözüm, alınan baytların her biri için bir ACK çıkışı ile yukarıdaki durumda kolayca doğrulanabilir. Aynı yöntem, giriş arabelleğinin birkaç segmenti depolayabildiği (pratikte çoğu zaman olduğu gibi) durum için de uygundur. Hızlı gönderici giriş arabelleğini dolduracak, ancak alıcı bilgi depolamak için boş alanı olmadığını belirtecek ve boyutu tüm segmente ulaşana kadar bu kaynağı açmayacaktır.

10.13.3 Nagle Algoritması

Gönderici, alıcıdan bağımsız olarak, göndermeden önce veri biriktiren çok kısa bölümlerin iletimini hariç tutmalıdır. Nagle algoritması, ağ üzerinden gönderilen kısa datagramların sayısını azaltmak için çok basit bir fikir uygular.

Algoritma, daha önce iletilen verilerden ACK bekleyerek veri aktarımının geciktirilmesini (ve itilmesini) önerir. Toplanan veriler, önceden gönderilen bir bilgi parçasına bir ACK alındıktan sonra veya tam bir segment boyutunda gönderilmek üzere veri alındıktan sonra veya zaman aşımı süresi dolduktan sonra gönderilir. Bu algoritma, mümkün olduğunca hızlı veri göndermesi gereken gerçek zamanlı uygulamalar için kullanılmamalıdır.

10.13.4 Gecikmeli ACK

Diğer bir performans geliştirme mekanizması, ACK gecikme yöntemidir. ACK sayısını azaltmak, diğer trafiği iletmek için kullanılabilecek bant genişliği miktarını azaltır. TCP eşi ACK'yı göndermeyi biraz geciktirirse, o zaman:

■ Bir ACK ile birden fazla segmentin alındığını onaylayabilirsiniz.

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

Tam boyutlu bir segment akışı gönderirken gecikmeleri önlemek için (örneğin, dosya alışverişi yaparken), en azından her ikinci tam segment için bir ACK gönderilmelidir.

Birçok uygulama 200ms zaman aşımı kullanır. Ancak gecikmeli ACK, döviz kurunu yavaşlatmaz. Kısa bir segment geldiğinde, giriş arabelleğinde yeni verileri almak için hala yeterli boş alan vardır ve gönderen göndermeye devam edebilir (ayrıca, yeniden iletim genellikle çok daha yavaştır). Bir segmentin tamamı gelirse, aynı anda bir ACK mesajı ile yanıt vermeniz gerekir.

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 ACK alınmazsa, TCP segmenti (röle) yeniden iletir. Ancak, zaman aşımı süresi ne kadar olmalıdır?

Çok kısaysa, gönderici ağı, önceden gönderilen bilgileri kopyalayan gereksiz bölümler ileterek dolduracaktır. Çok uzun bir zaman aşımı, aktarım sırasında gerçekten kötü olan segmentleri hızlı bir şekilde düzeltmenizi engelleyecek ve bu da verimi azaltacaktır.

Doğru zaman aşımı aralığı nasıl seçilir? Yüksek hızlı LAN için uygun bir değer, çoklu vuruşlu uzak bağlantı için uygun değildir. Bu, "tüm koşullar için tek değer" ilkesinin açıkça uygun olmadığı anlamına gelir. Ayrıca, mevcut belirli bir bağlantı için bile ağ koşulları değişebilir ve 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 Tahminlerini İyileştirme, Karn ve Partridge), TCP'nin değişen ağ koşullarına uyum sağlamasına izin verir. Bu algoritmaların yeni uygulamalarda kullanılması önerilir. Bunları aşağıda kısaca ele alacağız.

Sağduyu, belirli bir bağlantı için doğru zaman aşımı süresini tahmin etmek için en iyi temelin şu şekilde olabileceğini belirtir: devir süresi(gidiş-dönüş süresi) veri gönderme ve alındı ​​onayı alma arasındaki aralık olarak.

Aşağıdaki miktarlar için iyi kararlar, zaman aşımı süresini hesaplamanıza yardımcı olabilecek temel istatistiklerden (bkz. Şekil 10.19) alınabilir. Ancak, tahminlerin yarısından fazlası ortalamadan daha büyük olacağından ortalamalara güvenmeyin. Birkaç sapmaya bakarak, normal dağılımı hesaba katan ve yeniden iletim için çok uzun bekleme süresini azaltan daha iyi tahminler elde edebilirsiniz.


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 kaba tahminler kullanılabilir:

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

Doğru zaman aşımı değerini hesaplamada dikkate alınması gereken bir diğer faktör, mevcut ağ koşullarına bağlı olarak çevrim süresindeki değişikliktir. Web'de son dakikada olanlar, bir saat önce olanlardan daha önemlidir.

Çok uzun bir oturum için bir döngü ortalaması hesapladığınızı varsayalım. Ağ başlangıçta hafif yüklü olmasına ve 1000 küçük değer belirlememize rağmen, gecikmede önemli bir artışla trafikte bir artış oldu.

Örneğin, 1000 değer ortalama 170 birim verdiyse, ancak daha sonra ortalama 282 ile 50 değer ölçüldüyse, mevcut ortalama şöyle olacaktır:

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

Daha makul değer olurdu düzleştirilmiş çevrim süresi(Düzeltilmiş Gidiş-Dönüş Süresi - SRTT), sonraki değerlerin önceliğini hesaba katar:

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

α değeri 0 ile 1 arasındadır. artırmak düzleştirilmiş ortalama üzerinde mevcut çevrim süresinin daha büyük bir etkisi ile sonuçlanır. Bilgisayarlar, ikili sayıları sağa kaydırarak hızla 2'nin kuvvetlerine bölünebildiğinden, α her zaman (1/2) n (genellikle 1/8) olarak seçilir, bu nedenle:

Yeni SRTT = 7/8 × eski SRTT + 1/8 × Son çevrim süresi

Tablo 10.2, ağ koşulundaki bir değişiklik döngü süresinde aşamalı bir artışla sonuçlandığında (zaman aşımı olmadığı varsayılarak) SRTT formülünün 230 olan mevcut SRTT değerine nasıl ayarlandığını gösterir. 3. sütundaki değerler, tablodaki bir sonraki satır için 1. sütundaki değerler olarak kullanılır (yani, eski SRTT gibi).


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çmeyle ilgili bir soru var. Döngü sürelerinin analizi, bu değerlerin mevcut ortalamadan önemli ölçüde saptığını gösterir. Sapmaların (sapmaların) büyüklüğü için bir sınır belirlemek mantıklıdır. Yeniden iletim zaman aşımı (RFC standartlarında Yeniden İletim Zaman Aşımı - RTO olarak adlandırılır) için iyi değerler, düzgünleştirilmiş sapma kısıtlaması (SDEV) ile aşağıdaki formülle verilir:

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

T = SRTT + 4 × SDEV

SDEV'yi hesaplamak için önce mevcut sapmanın mutlak değeri belirlenir:

DEV = | Son Döngü Süresi - Eski SRTT |

Düzleştirme formülü daha sonra son değeri hesaba katmak için kullanılır:

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

Geriye bir soru kalıyor - başlangıç ​​değerleri nelerdir? Tavsiye edilen:

İlk zaman aşımı = 3 s

İlk SRTT = 0

İlk SDEV = 1,5 sn

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

10.13.6 Örnek istatistikler

Yukarıda hesaplanan zaman aşımı ne kadar işe yarayacak? Bu değer gerçekleştiğinde önemli performans iyileştirmeleri gözlemlendi. Bir örnek takım istatistikleri olabilir netstat sistemde alınan kaplan- dünyanın her yerinden birçok ana bilgisayar tarafından erişilen 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 segmenti için (geri kalanlar saf ACK mesajlarıdır), yalnızca %0,6'sı kopyalandı. Girdi verilerindeki kayıp seviyesinin yaklaşık olarak çıktı bölümlerinin seviyesine karşılık geldiği akılda tutulmalıdır. Böylece, işe yaramaz yeniden iletim trafiği toplam trafiğin yaklaşık %0,6'sını oluşturur.

10.13.7 Yeniden gönderimden sonraki hesaplamalar

Yukarıdaki formüller, bir segment gönderme ve bir alındı ​​alma arasındaki aralık olarak döngü süresi değerini kullanır. Ancak, zaman aşımı süresi boyunca hiç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. Döngü süresinin mevcut düzleştirilmiş değeri ve düzleştirilmiş sapma belirli bir segmenti tekrar göndermeden göndermek için bir alındı ​​alınana kadar değerlerini saklayın. Bu noktada, saklanan değerlere ve yeni ölçümlere göre hesaplamalara devam edilir.

10.13.8 Yeniden iletimden sonraki eylemler

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

■ Yeniden sevkiyat hızının düşürülmesi

■ Genel trafiği azaltarak ağ tıkanıklığını azaltın

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 ikiye katlanacaktır. Bu süreç denir üstel yavaşlama(üstel geri çekilme).

Şebeke kesintisi devam ederse, önceden ayarlanmış maksimum değere (tipik olarak 1 dakika) ulaşılana kadar zaman aşımı süresi iki katına çıkar. Zaman aşımından sonra yalnızca bir segment gönderilebilir. Zaman aşımı ayrıca, bir ACK alınmadan veri aktarımı sayısı için önceden belirlenmiş değer aşıldığında da meydana gelir.

10.13.10 Ağ üzerinden gönderilen veri miktarını azaltarak tıkanıklığı azaltmak

Gönderilen veri miktarını azaltmak, yukarıda tartışılan mekanizmalardan biraz daha karmaşıktır. Daha önce bahsedilen yavaş başlangıç ​​gibi çalışmaya başlar. Ancak, trafik seviyesi için başlangıçta sorunlara yol açabilecek bir sınır belirlendiğinden, bir segment için yükleme penceresinin boyutundaki artış nedeniyle döviz kuru aslında yavaşlayacaktır. Yükleme hızını gerçekten azaltmak için sınır değerleri ayarlamanız gerekiyor. İlk olarak, tehlike eşiği hesaplanır:

Sınır - minimum 1/2 (mevcut yükleme aralığı, ortak alma aralığı)

Elde edilen değer iki segmentten fazla ise sınır olarak kullanılır. Aksi takdirde, kenarlık iki parçaya ayarlanır. Tam bir kurtarma algoritması şunları gerektirir:

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

■ Alınan her ACK için, sınıra ulaşılana kadar yükleme penceresinin boyutunu bir segment artırın (yavaş başlatma mekanizması gibi).

S Ardından, alınan her ACK ile, döngü süresi için bir segmentteki 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ükün boyutudur bölümler halinde pencere).

İdeal bir senaryo, kurtarma mekanizmasının çalışmasını basitleştirebilir. İş ortağının alma penceresinin (ve mevcut yükleme penceresinin) zaman aşımı algılanmadan önce 8 segment olduğunu ve sınırın 4 segment olarak tanımlandığını varsayalım. Alıcı uygulama arabellekten anında veri okursa, alma penceresi 8 segmentte kalacaktır.

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

■ ACK Alındı ​​— 2 segment gönderilir.

■ Alınan 2 segment için ACK — 4 segment gönderilir (sınıra ulaşıldı).

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

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

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

■ 7 segment için ACK alındı. 8 segment gönderilir (yükleme penceresi yine alma penceresine eşit boyuttadır).

Yeniden iletim zaman aşımı sırasında gönderilen tüm verilerin onaylanması gerektiğinden, yükleme penceresi alma penceresinin boyutuna ulaşana kadar işlem devam eder. Meydana gelen olaylar Şekil 2 de gösterilmiştir. 10.20. Pencerenin boyutu üstel olarak artar, yavaş başlama periyodunda iki katına çıkar ve sınıra ulaşıldığında lineer olarak artar.


Pirinç. 10.20. Tıkanıklık sırasında aktarım hızını sınırlama

10.13.11 Yinelenen ACK'ler

Bazı uygulamalarda isteğe bağlı bir özellik kullanılır - sözde hızlı yeniden sevkiyat(hızlı yeniden iletim) - belirli koşullar altında verilerin yeniden iletimini hızlandırmak için. Ana fikri, alınan verilerde bir boşluk olduğunu gösteren alıcı tarafından ek ACK'lerin gönderilmesi ile ilgilidir.

Sıra dışı bir segment alan alıcı, ilk bayta işaret eden bir ACK gönderir. kayıp veriler (bkz. Şekil 10.21).


Pirinç. 10.21. Yinelenen ACK'ler

Gönderici, verileri anında yeniden iletmez, çünkü IP normalde alıcıya bir gönderme sırası olmadan veri iletebilir. Ancak, yinelenen veriler için birkaç ek ACK alındığında (örneğin, üç), zaman aşımının sona ermesi beklenmeden eksik segment gönderilir.

Her yinelenen ACK'nin bir veri segmentinin alındığını gösterdiğine dikkat edin. Birkaç yinelenen ACK, ağın yeterli veri sağlayabildiğini ve bu nedenle aşırı yüklenmediğini bilmenizi sağlar. Genel algoritmanın bir parçası olarak, ağ trafiğinde gerçek bir artış ile yük 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 (kaynak söndürürken) yukarıda açıklananla aynı yavaş başlatmayı yapmalıdır. Ancak, bu mesajı alan bağlantı çok fazla trafik oluşturmayabileceğinden, bunun bildirilmesi hedefli veya etkili değildir. Mevcut özellikler Yönlendirici Gereksinimleri(yönlendirici gereksinimleri) yönlendiricilerin yapmamalı kaynağın bastırılması hakkında mesajlar gönderin.

10.13.13 TCP İstatistikleri

Son olarak komutun istatistiksel mesajlarına bir göz atalım. netstat, yukarıda açıklanan mekanizmaların birçoğunu iş başında görmek için.

Segmentler paketler olarak adlandırılır.
879137 veri paketleri (226966295 bayt)
21815 veri paketi (8100927 bayt) yeniden iletildi
Gemiden gemiye aktarma.
132957 yalnızca kabul edilen paketler (104216 gecikmeli)
Çok sayıda not alıyoruz

gecikmeli ACK.

Sondalama penceresi açıklığı

sıfır boyut.

Bunlar SYN ve FIN mesajlarıdır.
762469 acks (226904227 bayt için)
Gelen paketler için uyarı

sıra dışı.

1510769 paket (314955304 bayt)
9006 tamamen kopya paketler (867042 bayt)
Gerçek olduğunda zaman aşımının sonucu

veri teslimi.

Biraz 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

algılama mesajlarına dahildir.

Kapatıldıktan sonra alınan 402 paket
Bunlar takip tekrarları

gönderiyor.

108, hatalı sağlama toplamları nedeniyle atıldı
Geçersiz TCP sağlama toplamı.
0, hatalı başlık ofset alanları için 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ı düştü
572187 segment güncellendi rtt (587397 denemeden)
Başarısız değişiklik denemeleri

ACK'nın zaman aşımı süresi dolmadan önce varmak için zamanı olmadığı için döngü süresi,

Rexmit zaman aşımı nedeniyle 26 bağlantı kesildi
Sonraki başarısız girişimler

bağlantının koptuğunu gösteren yeniden gönderme.

Sondalama zaman aşımları

sıfır pencere.

Ödeme zaman aşımları

bozuk bağlantı.

Keepalive tarafından 472 bağlantı kesildi

10.14 Geliştirici gereksinimlerine uygunluk

Mevcut TCP standardı, bir bağlantı başlatılırken uygulamaların yavaş başlatma prosedürüne uymasını ve yeniden iletim zaman aşımını tahmin etmek ve yükü yönetmek 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 uymayan bir sistem kurarsanız ne olur? Kendi kullanıcıları için yeterli performansı sağlayamayacak ve ağdaki diğer sistemler için zayıf bir komşu olacak ve geçici tıkanıklıktan sonra normal çalışmanın geri yüklenmesini önleyecek ve verikatarlarının düşmesine neden olan aşırı trafik yaratacaktır.

10.15 Performansın önündeki engeller

TCP, saniyede yüzlerce veya milyonlarca bitlik değişim oranlarına sahip ağlar üzerinden ç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ında ve ayrıca düşük hızlı iletişim hatları veya uzun mesafeli bağlantılar (uydu bağlantıları gibi) için iyi sonuçlar elde etmeyi mümkün kılmıştır. .

TCP, ağ tıkanıklığı gibi aşırı koşullara yanıt verecek şekilde tasarlanmıştır. Bununla birlikte, protokolün mevcut sürümü, yüzlerce ve binlerce megabaytlık bant genişliği sunan gelecek vaat eden teknolojilerdeki performansı sınırlayan özelliklere sahiptir. Ortaya çıkan sorunları anlamak için basit (gerçekçi olmasa da) bir örnek düşünün.

Bir dosyayı iki sistem arasında taşırken, mümkün olduğunca verimli bir sürekli akış alışverişi yapmak istediğinizi varsayalım. Diyelim ki:

■ Maksimum hedef segment boyutu 1 KB'dir.

■ Alma penceresi - 4 KB.

Bant genişliği, iki segmentin 1 saniyede gönderilmesine izin verir.

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

S ACK mesajları 2 saniye içinde ulaşır.

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

2 sn sonra:

SEGMENT 1'İN ALINMASI, SEGMENT 5'İN GÖNDERİLMESİ.
2. SEGMENT ALINIR, SEGMENT 6 GÖNDERİLİR.
3. SEGMENT ALINIR, SEGMENT 7 GÖNDERİLİR.
4. SEGMENT ALINIR, SEGMENT 8 GÖNDERİLİR.

2 sn daha sonra:

SEGMENT 5'İN ALINMASI, SEGMENT 9'UN GÖNDERİLMESİ.

Alma penceresi sadece 2 KB ise, göndericinin bir sonraki veriyi göndermeden önce her iki saniyede bir beklemesi gerekirdi. Aslında, sürekli bir veri akışı sağlamak için alma penceresi en azından şu şekilde olmalıdır:

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 pencere, yüksek gecikmeli uydu bağlantılarında sorunlara yol açabilir.

Şimdi yüksek hızlı bağlantılara ne olduğuna bir göz atalım. Örneğin, bant genişliği ve aktarım hızı saniyede 10 milyon bit olarak ölçülüyorsa, ancak döngü süresi 100 ms (saniyenin 1 / 10'u) ise, bu durumda sürekli bir akış için alma penceresi en az 1.000.000 bit depolamalıdır, yani... 125.000 bayt. Ancak bir TCP alma penceresi için başlık alanına yazılabilecek en büyük sayı 65.536'dır.

Sıra numaraları çok çabuk tükeneceğinden, yüksek baud hızlarında başka bir sorun ortaya çıkar. Bağlantı 4 GB / s hızında veri aktarabiliyorsa, sıra numaraları her saniye güncellenmelidir. İnternette dolaşırken bir saniyeden fazla geciken eski yinelenen verikatarlarını yeni yeni verilerden ayırt etmek mümkün olmayacaktır.

TCP / IP'yi iyileştirmek ve yukarıdaki engelleri kaldırmak için yeni araştırmalar devam etmektedir.

10.16 TCP işlevleri

Bu bölüm, TCP'nin birçok özelliğine odaklanmaktadır. Başlıcaları aşağıda listelenmiştir:

■ Bağlantı noktalarını bağlantılara bağlama

■ 3 adımlı onay ile bağlantıların başlatılması

■ Ağ tıkanıklığını önlemek için yavaş bir başlangıç ​​gerçekleştirir

■ Aktarılan verilerin segmentasyonu

■ Veri numaralandırma

■ Gelen yinelenen segmentleri işleme

■ Sağlama toplamlarının hesaplanması

■ Alıcı pencere ve gönderme penceresinden veri akışının düzenlenmesi

■ Bağlantının kurulan şekilde sonlandırılması

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

■ Acil verilerin iletilmesi

■ Yeniden sevkiyatın olumlu onayı

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

■ Ağ tıkanıklığı sırasında azaltılmış dönüş trafiği

■ Sıra dışı segment varış alarmı

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

10.17 TCP durumları

Bir TCP bağlantısı birkaç aşamadan geçer: mesaj alışverişi yoluyla bağlantı kurulur, ardından veriler gönderilir ve ardından özel mesaj alışverişi kullanılarak bağlantı kapatılır. Bağlantı çalışmasındaki her adım, belirli bir şart 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, bağlantının farklı uçlarında bulunan sunucu ve istemcinin tipik bir durum geçişine kısaca bakacağız. Verileri aktarırken tüm olası durumların kapsamlı bir tanımını vermeyi düşünmüyoruz. RFC 793 ve belgede bulunur Ana Bilgisayar Gereksinimleri.

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


Tablo 10.3 Sunucu durumu dizisi

sunucu durumu Etkinlik Açıklama
KAPALI (kapalı) Bir bağlantı başlatmadan önceki hayali bir durum.
Sunucu uygulaması ile pasif açma.
DİNLE (izleme) Sunucu bir istemci bağlantısı bekliyor.
TCP sunucusu bir SYN alır ve bir SYN / ACK gönderir. Sunucu bir SYN aldı ve bir SYN / ACK gönderdi. ACK için beklemeye gider.
SYN-ALINDI TCP sunucusu ACK'yi alır.
KURULDU (kurulu) ACK alındı, bağlantı açıldı.

Tablo 10.4 İstemci durumu dizisi

Ortaklar aynı anda birbirlerine bağlanmaya çalışırlarsa (ki bu son derece nadirdir), her biri KAPALI, EŞZ-GÖNDER, EŞZ-ALDI ve KURULDU durumlarından geçer.

Bağlantının uç tarafları, taraflardan biri başlatılıncaya kadar KURULDU durumunda kalır. kapanış FIN segmenti göndererek bağlantılar. Normal bir kapanış sırasında, bu kapanışı başlatan taraf Tablo 10.5'te gösterilen durumlardan geçer. Ortağı, tablo 10.6'da gösterilen durumlardan geçer.


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

Kapanış yan durumları Etkinlik Açıklama
KURULMUŞ Yerel uygulama, bağlantıyı kapatmak için istekte bulunur.
TCP, FIN / ACK gönderir.
SON-BEKLE-1 Koruma partisi, ortağın yanıtını bekliyor. İş ortağından hala yeni verilerin geliyor olabileceğini hatırlayın.
TCP, ACK'yi alır.
SON-BEKLE-2 Kapanan taraf, ortaktan bir ACK aldı, ancak FIN henüz ulaşmadı. Kapanan taraf, gelen verileri kabul ederek bir FIN bekler.
TCP, FIN / ACK alır.
ACK gönderir.
ZAMAN-BEKLE Bağlantı, ağda hala var olan yinelenen verilerin veya yinelenen FIN'lerin ulaşmasına veya düşmesine izin vermek için belirsiz bir durumda tutulur. Bekleme süresi, maksimum segment ömrü tahmininin iki katıdır.
KAPALI

Tablo 10.6 Bir bağlantıyı kapatmak için ortak durumların sırası

İş ortağı durumu Etkinlik Açıklama
KURULMUŞ TCP, FIN / ACK alır.
YAKIN BEKLEYİŞ FIN geldi.
TCP ACK gönderir.
TCP, uygulamasının bağlantıyı kapatmasını bekler. Bu noktada, uygulama oldukça büyük miktarda veri gönderebilir.
Yerel uygulama bağlantıyı kapatmaya başlar.
TCP, FIN / ACK gönderir.
SON-ACK TCP, son ACK'yı bekliyor.
TCP, ACK'yi alır.
KAPALI Tüm bağlantı bilgileri kaldırıldı.

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

Emretmek netstat -an bağlantının mevcut durumunu kontrol etmenizi sağlar. Durumlardaki bağlantılar aşağıda gösterilmiştir dinle, başlangıç, kurulan, kapanış ve bekleme süresi.

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ği olduğunu görebilirsiniz.

Pro Recv-Q Gönder-Q Yerel Adres Yabancı Adres (eyalet)
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 ZAMAN_BEKLE
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 ZAMAN_BEKLE
Tcp 0 0 128.121.50.145.25 141.218.1.100.3968 ZAMAN_BEKLE
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 ZAMAN_BEKLE
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 Uygulama Notları

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

Hatta RFC 1122 (belge Ana Bilgisayar Gereksinimleri - ana bilgisayar gereksinimleri) varyasyon için yeterli alan bırakır. Uygulanan işlevlerin her biri belirli bir uyumluluk düzeyiyle işaretlenmiştir:

■ MAYIS (İzin verilir)

■ YAPMAMALIDIR

Ne yazık ki, bazen MUST gereksinimlerini karşılamayan ürünler vardır. Sonuç olarak, kullanıcılar performans düşüşü rahatsızlıkları yaşarlar.

Bazı iyi uygulama uygulamaları standartlarda dikkate alınmamaktadır. Örneğin, bu yöntem yerel işletim sisteminde destekleniyorsa, iyi bilinen bağlantı noktalarının ayrıcalıklı sistem işlemleriyle kullanımını sınırlayarak güvenliği artırmak mümkündür. Performansı en üst düzeye çıkarmak için, uygulamalarda gönderilen veya alınan verilerin mümkün olduğunca az kopyalanması ve taşınması gerekir.

Standart API tanımsız(güvenlik politikasının yanı sıra) böylece farklı yazılım araçları setlerini denemek için boş bir alan olur. Ancak bu, her platformda farklı API'lerin kullanılmasına neden olabilir ve uygulama yazılımının platformlar arasında taşınmasını önleyecektir.

Aslında, geliştiriciler araç takımlarını Berkeley'den ödünç alınan bir Socket API'ye dayandırırlar. Programlama arabiriminin önemi, TCP / IP yığınıyla uyumlu herhangi bir WINSock arabiriminin üzerinde çalışabilen yeni masaüstü uygulamalarının çoğalmasına yol açan WINSock'un (Windows Socket) ortaya çıkmasıyla arttı.

10.19 Daha fazla okuma

Orijinal TCP standardı RFC 793'te tanımlanmıştır. Güncellemeler, düzeltmeler ve uyumluluk gereksinimleri RFC 1122'de ele alınmıştır. Kern and Partridge bir makale yayınladı Güvenilir Taşıma Protokollerinde Gidiş-Dönüş Tahminlerini İyileştirme dergide ACM SIGCOMM 1987 Bildirileri. Jacobson'ın makalesi Tıkanıklıktan Kaçınma ve Kontrol ortaya çıkan ACM SIGCOMM 1988 Çalıştayının Tutanakları. Jacobson ayrıca performans iyileştirme algoritmalarını revize eden birkaç RFC yayınladı.

TCP akış soketinde istemci-sunucu uygulaması

Aşağıdaki örnekte, sıralı, güvenilir iki yönlü bayt akışları sağlamak için TCP kullanıyoruz. Bir istemci ve bir sunucu içeren eksiksiz bir uygulama oluşturalım. Önce TCP akış soketlerinde bir sunucunun nasıl oluşturulacağını ve ardından sunucumuzu test etmek için bir istemci uygulamasının nasıl yapıldığını gösteriyoruz.

Aşağıdaki program, istemcilerden bağlantı isteklerini alan bir sunucu oluşturur. Sunucu eşzamanlı olarak oluşturulur, 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 işlevsel şemada gösterilmiştir:

SocketServer.cs programının tam kodu:

// System kullanarak SocketServer.cs; System.Text'i kullanarak; System.Net'i kullanarak; System.Net.Sockets kullanarak; namespace SocketServer (sınıf Program (static void Main (string args)) (// IPHostEntry soketi için yerel bitiş noktasını ayarlayın ipHost = Dns.GetHostEntry ("localhost"); IPAddress ipAddr = ipHost.AddressList; IPEndPoint ipEndPoint = yeni IPEndPoint (ipAddr, 11 ); // Bir Tcp / Ip Soketi Oluştur sListener = new Socket (ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Soketi yerel uç noktaya atayın ve gelen soketleri dinleyin try (sListener.Bind (ipEndPoint) ); sListener Dinle (10); // (true) iken bağlantıları dinlemeye başla (Console.WriteLine ("Port (0)'da bağlantı bekleniyor", ipEndPoint); // Program duraklar, gelen bir bağlantıyı bekler Socket işleyici = sListener.Accept (); string data = null; // Bizimle bağlantı kurmaya çalışan bir istemci bekledik byte bytes = new byte; int bytesRec = handler.Receive (bytes); data + = Encoding.UTF8.GetString (bytes, 0, bytesRec); // Verileri konsolda göster Console.Write ("Alındı" metin: "+ veri +" \ n \ n "); // İstemciye bir yanıt gönder \ string answer = "İstek için teşekkürler" + data.Length.ToString () + "karakterler"; bayt msg = Encoding.UTF8.GetBytes (yanıt); işleyici.Gönder (mesaj); if (data.IndexOf (" ")> -1) (Console.WriteLine ("Sunucu, istemciyle olan bağlantıyı sonlandırdı. "); Break;) handler.Shutdown (SocketShutdown.Both); handler.Close ();)) catch (ex istisna) (Console.WriteLine (ex.ToString ());) nihayet (Console.ReadLine ();))))

Şimdi bu programın yapısına bir göz atalım.

İlk adım, soket için yerel bir uç nokta oluşturmaktı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 IP adresi ile hizmet uç noktasını oluşturan hizmet bağlantı noktası numarasının birleşimiyle belirlenir.

Dns sınıfı, yerel ağdaki bir aygıt tarafından desteklenen ağ adresleri hakkında bilgi döndüren yöntemler sağlar. Bir LAN cihazının birden fazla ağ adresi varsa, Dns sınıfı tüm ağ adresleri hakkında bilgi verir ve uygulama hizmet vermek için diziden uygun bir adres seçmelidir.

Dns.Resolve () yöntemindeki ilk ana bilgisayar IP adresini bağlantı noktası numarasıyla birleştirerek sunucu için bir IPEndPoint oluşturun:

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

Burada IPEndPoint sınıfı, 11000 numaralı bağlantı noktasındaki localhost'u temsil eder. Ardından, Socket sınıfının yeni bir örneğiyle bir akış soketi oluşturun. Bağlantıları dinlemek üzere ayarlanmış bir yerel uç nokta ile bir soket oluşturulabilir:

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

numaralandırma AdresAile Socket sınıfının bir örneğinin bir adresi çözümlemek için kullanabileceği adresleme şemalarını belirtir.

parametrede Soket Tipi TCP ve UDP soketleri vardır. İçinde, diğer şeylerin yanı sıra aşağıdaki değerleri tanımlayabilirsiniz:

Dgram

Datagramları destekler. Dgram değeri, protokol türü için Udp'yi ve adres ailesi parametresinde InterNetwork'ü belirtmenizi 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, soket için gereken protokol tipini tanımlar. parametrede Protokol Türü aşağıdaki en önemli değerleri belirtebilirsiniz - Tcp, Udp, Ip, Raw.

Bir sonraki adım, yöntemi kullanarak soketi atamak olmalıdır. bağla ()... Yapıcı tarafından bir soket açıldığında, ona hiçbir ad atanmaz, yalnızca bir tanımlayıcı ayrılır. Sunucu soketine bir ad atamak için Bind() yöntemi çağrılır. İstemci soketinin TCP akış soketini tanımlayabilmesi için, sunucu programı soketini adlandırmalıdır:

SListener.Bind (ipEndPoint);

Bind() yöntemi, soketi yerel uç noktaya bağlar. Dinle () ve Kabul Et () yöntemlerini çağırma girişimlerinden önce Bind () yöntemini çağırmalısınız.

Şimdi, bir soket oluşturup onunla bir isim ilişkilendirdikten sonra, yöntemi kullanarak gelen mesajları dinleyebilirsiniz. Dinlemek ()... Dinleme durumunda, soket gelen bağlantı denemelerini bekleyecektir:

SListener.Dinle (10);

parametre tanımlar iş yığını kuyruktaki maksimum bekleyen bağlantı sayısını belirtir. Yukarıdaki kodda, parametre değeri en fazla on bağlantının sıraya alınmasına izin verir.

Dinleme durumunda, yöntemin kullanıldığı müşteri ile bağlantıya rıza göstermeye hazır olunmalıdır. Kabul etmek ()... Bu yöntem bir istemci bağlantısı elde eder ve istemci/sunucu adı ilişkilendirmesini tamamlar. Kabul () yöntemi, bir bağlantı gelene kadar arayanın iş parçacığını engeller.

Kabul () yöntemi, bekleyen istek kuyruğundan ilk bağlantı isteğini alır ve onu işlemek için yeni bir yuva oluşturur. Yeni bir soket oluşturulmasına rağmen, orijinal soket dinlemeye devam eder ve istemcilerden birden çok bağlantı isteği almak için çok iş parçacıklı olabilir. Hiçbir sunucu uygulaması dinleme soketini kapatmamalıdır. Gelen istemci isteklerini işlemek için Kabul yöntemi tarafından oluşturulan yuvalarla birlikte çalışmaya devam etmelidir.

while (true) (Console.WriteLine ("Port (0)'da bağlantı bekleniyor", ipEndPoint); // Program duraklar, gelen bir bağlantı bekler Socket işleyici = sListener.Accept ();

İstemci ve sunucu kendi aralarında bir bağlantı kurduktan sonra, yöntemleri kullanarak mesaj gönderip alabilirsiniz. Göndermek () ve Almak () Soket sınıfı.

Send() yöntemi, giden verileri bağlantının kurulduğu sokete yazar. Receive () yöntemi, gelen verileri bir akış soketine okur. TCP tabanlı bir sistemde Send() ve Receive() yöntemleri çalıştırılmadan önce soketler arasında bağlantı kurulmalıdır. Etkileşen iki varlık arasındaki kesin protokol, istemci ve sunucu uygulamalarının, verilerini ilk kimin göndereceğini bilmeden birbirlerini engellememesi için önceden belirlenmelidir.

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

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

SocketShutdown, durdurulacak üç değeri içeren bir numaralandırmadır: Her ikisi de- soket tarafından veri göndermeyi ve almayı durdurur, Almak- soketten veri almayı durdurur ve Göndermek- soketten veri göndermeyi durdurur.

Kapat () yöntemi çağrıldığında soket kapatılır ve bu da soketin Connected özelliğini false olarak ayarlar.

TCP üzerinde istemci

İstemci 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, her ikisi de taşıma katmanı protokolleridir. UDP, güvenli olmayan paket teslimi olan bağlantısız bir protokoldür. TCP (İletim Kontrol Protokolü), garantili paket teslimi olan bağlantı yönelimli bir protokoldür. Önce bir el sıkışma var (Merhaba. | Merhaba. | Sohbet edelim? | Hadi.), Ardından bağlantı kurulmuş sayılır. Ayrıca, paketler bu bağlantı üzerinden ileri geri gönderilir (bir konuşma vardır) ve paketin alıcıya ulaşıp ulaşmadığı kontrol edilir. Paket kaybolursa veya geldiyse, ancak biraz sağlama toplamı ile tekrar gönderilir ("tekrar, duymadım"). Bu nedenle, TCP daha güvenilirdir, ancak uygulama açısından daha karmaşıktır ve buna bağlı olarak, mikrodenetleyiciler için en az önemli olmayan daha fazla saat / bellek gerektirir. TCP kullanan uygulama protokollerine örnek olarak FTP, HTTP, SMTP ve diğerleri dahildir.

TL; DR

HTTP (Köprü Metni Aktarım Protokolü), sunucunun sayfaları tarayıcımıza gönderdiği bir uygulama protokolüdür. HTTP, web sitelerinden bilgi almak için artık World Wide Web'de her yerde bulunur. Resim, renklerin tarayıcı aracılığıyla ayarlandığı, yerleşik bir işletim sistemine sahip bir mikro denetleyicide bir ışık gösterir.

HTTP protokolü metinseldir ve oldukça basittir. Aslında, netcat yardımcı programı tarafından sunucunun yerel IPv6 adresine ışıklarla gönderilen GET yöntemi şöyle görünür:

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

HTTP Yöntemi genellikle kısa, büyük harfle yazılmış İngilizce bir 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öntemlerine ek olarak, POST, PUT ve DELETE yöntemleri sıklıkla kullanılır. GET yöntemi, belirtilen kaynağın içeriğini istemek için kullanılır, bizim durumumuzda burada GET / b HTTP / 1.0, burada / b, renkten (mavi) sorumludur. Sunucu cevabı:

HTTP / 1.0 200 OK Sunucu: Contiki / 2.4 http://www.sics.se/contiki/ Bağlantı: Kapat Önbellek Kontrolü: önbellek yok, mağaza yok, yeniden doğrulama gerekir Pragma: önbellek yok Süre Sonu: 0 İçerik- tür: metin / html Contiki RGB

Kırmızı KAPALI

Yeşil KAPALI

Mavi AÇIK

Durum kodu (200'e sahibiz), sunucu yanıtının ilk satırının bir parçasıdır. Üç basamaklı bir tamsayıdır. İlk hane, koşulun sınıfını gösterir. Yanıt kodunu genellikle, kişiye bu özel yanıtın nedenini açıklayan, bir boşlukla ayrılmış İngilizce açıklayıcı bir ifade izler. Bizim durumumuzda sunucu hatasız çalıştı, her şey toplandı (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 ile ayrılır). Başlıklar boş bir satırla biter, bundan sonra veriler gidebilir.

Tarayıcım yerel IPv6 adresini açmayı reddediyor, bu nedenle mikrodenetleyici donanım yazılımına ek bir adres yazılır ve aynı önek simülatörün sanal ağ arayüzüne de atanmalıdır:

~ $ sudo ip addr abcd ekle :: 1/64 dev mazko # linux ~ $ netsh interface ipv6 adresi ayarla mazko abcd :: 1 # windows ~ $ curl http: //