TCP ve UDP protokolleri. Diğer sözlüklerde "UDP"nin ne olduğunu görün Protokol, udp protokolünü kullanarak çalışır

Boyama

UDP (Kullanıcı Datagram Protokolü), güvenilir olmayan veri dağıtımına sahip, bağlantısız bir aktarım protokolüdür. Onlar. paket teslimatının onayını sağlamaz, gelen paketlerin sırasını korumaz ve paketleri kaybedebilir veya çoğaltabilir. UDP, bağlantı noktası kavramının tanıtılması dışında IP'ye benzer şekilde çalışır. UDP, daha düşük ek yük nedeniyle genellikle TCP'den daha hızlıdır. Güvenilir teslimat gerektirmeyen veya bunları kendileri uygulayan uygulamalar tarafından kullanılır. Örneğin İsim Sunucuları, TFTP (Önemsiz Dosya Aktarım Protokolü) hizmeti, SNMP (Basit Ağ Yönetim Protokolü), kimlik doğrulama sistemleri. Alandaki UDP protokol tanımlayıcısı Protokol IP başlığı - sayı 17.

Taşıma katmanı hizmeti olarak UDP'yi kullanan herhangi bir uygulamanın, paketlerin gönderildikleri sırayla teslim edilmesini sağlamak için onay mekanizmaları ve sıralı bir numaralandırma sistemi sağlaması gerekir.

Hedef Bağlantı Noktası

Pirinç. UDP paket başlığı formatı

Udp paket alanlarının amacı:

Gönderici bağlantı noktası numarası –Kaynak Liman(16 bit) – ilgili olduğunda paketin gönderildiği port numarasını içerir (örneğin, gönderen bir yanıt bekliyor). Bu alan kullanılmadığı takdirde sıfırlarla doldurulur.

Hedef bağlantı noktası numarası –Varış noktası Liman(16 bit) – paketin teslim edileceği port numarasını içerir.

Uzunluk -Uzunluk(16 bit) – Başlık ve veriler de dahil olmak üzere bu veri biriminin uzunluğunu bayt cinsinden içerir.

Sağlama toplamı alanı –Sağlama toplamı(16 bit) – 16 bitlik sözcüklerin 16 bitlik toplamının bit düzeyinde tamamlayıcısını temsil eder. Miktarın hesaplanmasında yer alan miktar şunlardır: 16 bitlik sınır hizalama alanlarına (sıfır) sahip paket verileri, UDP paket başlığı, sözde başlık (IP protokolünden gelen bilgiler).

TCP protokolü

TCP (İletim Kontrol Protokolü), güvenilir veri dağıtımına sahip bağlantı odaklı bir aktarım protokolüdür. Bu nedenle iletilen verilerin bütünlüğünü sağlamak için tasarlanmış sıkı hata tespit algoritmalarına sahiptir.

Güvenilir teslimatı sağlamak için ardışık numaralandırma ve onay kullanılır. Sıralı numaralandırma kullanılarak paketlerdeki verilerin sırası belirlenir ve eksik paketler belirlenir. Onaylı ardışık numaralandırma, adı verilen güvenilir iletişimi düzenlemenizi sağlar. Tam dubleks(Tam dubleks). Bağlantının her iki tarafı da diğer taraf için kendi numaralandırmasını sağlar.

TCP bir bayt seri protokolüdür. Paket seri protokollerinden farklı olarak, her pakete tek tek değil, iletilen paketin her baytına bir seri numarası atar.

Hedef Bağlantı Noktası

Onay Numarası

Pirinç. TCP paket başlığı formatı

İyi günler sevgili okuyucular.
Yoğun talep üzerine bugün size bilgisayar ağı terimlerinin temellerini tanıtacak bir makale yayınlıyorum:

  • Ağ protokolleri - bu korkutucu isimler nelerdir ve ne için kullanılıyorlar?
  • UDP, TCP, ICMP - ne, neden ve fark nedir
  • Herkesin bir IP adresi vardır, ancak herkes bunun nedenini bilmiyor :-)
  • Adres maskesi (alt ağ)
  • Geçit
  • Yönlendirme tabloları hakkında birkaç kelime
  • Limanlar - gerçekte ne oldukları
  • Mac Adresi

Bunun gibi.

Makalenin, genç ve yaşlı herkes için faydalı olacağını düşünüyorum, çünkü çok fazla tuhaf, anlaşılmaz eylem veya kelime içermiyor, ancak erişilebilir bir dilde sunulan ve en azından size bilgi verecek bir bilgi bloğu içeriyor. her şeyin nasıl çalıştığını ve neden gerekli olduğunu anlıyorsunuz. Gitmek.

Ağ protokolleri TCP/IP, NWLink IPX/SPX, NetBEUI

Ağ protokolünün ne olduğu ve ne için kullanıldığıyla başlayalım.
Ağ protokolü bilgisayarlar arasındaki iletişim için yazılım tarafından uygulanan kurallar dizisidir. Bilgisayarların birbirleriyle konuştuğu ve bilgi aktardığı bir tür dil. Önceden, bilgisayarlar tabiri caizse çok dilliydi ve Windows'un eski sürümleri bir dizi protokol kullanıyordu - TCP/IP, NWLink IPX/SPX, NetBEUI. Artık genel bir anlaşmaya vardık ve standart, yalnızca TCP/IP protokolünün kullanılması haline geldi ve bu nedenle daha ayrıntılı olarak tartışılacaktır.

TCP/IP hakkında konuştuklarında, genellikle bu adla birçok farklı kuralı veya örneğin bu protokolü kullanarak (veya kullanmak için) belirlenen standartları kastederler. Örneğin, posta sunucuları arasında mesajların alınıp verilmesine ilişkin kurallar vardır ve son kullanıcının posta kutusuna mektup almasına ilişkin kurallar vardır. İnternet üzerinden video konferans yürütmenin kuralları ve "telefon" konuşmalarını düzenlemenin kuralları vardır. Aslında bunlar aslında kural bile değil... Daha çok bir tür gramer falan gibi. Biliyorsunuz, İngilizce'de diyalog kurmaya yönelik bir yapı var, Fransızca'da ise başka bir yapı... Yani TCP/IP'de de benzer bir şey, yani. Belirli bir dizi farklı gramer kuralı tam olarak bütünleşik TCP/IP protokolüdür veya daha doğrusu, TCP/IP protokol yığını.

Ağ protokolleri UDP, TCP, ICMP

TCP/IP protokolü içerisinde veri iletimi için kullanılan protokoller TCP ve UDP'dir. Birçok kişi muhtemelen hem TCP hem de UDP bağlantı noktalarının olduğunu duymuştur, ancak herkes farkın ne olduğunu ve bunun neyle ilgili olduğunu bilmiyor. Bu yüzden..

TCP protokolü (İletim Kontrol Protokolü) aracılığıyla veri aktarımı, bilginin alındığının onaylanmasını gerektirir. “Peki, anladın mı diyorlar? - Anladın mı?” İleten tarafın belirlenen süre içerisinde gerekli onayı alamazsa veriler tekrar iletilecektir. Bu nedenle, TCP bağlantı tabanlı bir protokol olarak kabul edilirken UDP (Kullanıcı Datagram Protokolü) değildir. UDP, alım onayının gerekli olmadığı durumlarda kullanılır (örneğin, DNS istekleri veya IP telefonu (Skype'ın önde gelen temsilcisi olduğu)). Yani fark, alım onayının varlığında yatmaktadır. "Hepsi bu kadar!" gibi görünebilir, ancak pratikte önemli bir rol oynar.

Ağ parametreleriyle ilgili verileri iletmek için kullanılan ICMP protokolü (İnternet Kontrol Mesajı Protokolü) de vardır. Aşağıdaki gibi yardımcı paket türlerini içerir: ping, ulaşılamayan mesafe, TTL vesaire.

IP adresi nedir

Herkesin bir adresi var ama herkesin bunun nasıl bir adres olduğu ve onsuz yaşamanın neden imkansız olduğu konusunda bir fikri yok. Sana söylüyorum.

IP adresi, ağdaki bir bilgisayarı tanımlamak için kullanılan 32 bitlik bir sayıdır. Adresi, bu sayının her sekizlisinin ondalık değerlerinde, elde edilen değerleri noktalarla ayırarak yazmak gelenekseldir. Örneğin, 192.168.101.36

IP adresleri benzersizdir; bu, her bilgisayarın kendi sayı kombinasyonuna sahip olduğu ve ağda aynı adrese sahip iki bilgisayarın bulunamayacağı anlamına gelir. IP adresleri merkezi olarak dağıtılır, internet sağlayıcıları ihtiyaçları doğrultusunda ulusal merkezlere başvuru yapar. Sağlayıcılar tarafından alınan adres aralıkları müşteriler arasında daha da dağıtılır. İstemciler de sağlayıcı olarak hareket edebilir ve alınan IP adreslerini alt istemciler vb. arasında dağıtabilirler. IP adreslerini dağıtmanın bu yöntemiyle bilgisayar sistemi, benzersiz bir IP adresine sahip bir bilgisayarın "konumunu" tam olarak bilir; - verileri "sahip" ağına göndermesi yeterlidir ve sağlayıcı da hedefi analiz edecek ve adreslerin bu kısmının kime verildiğini bilerek bilgileri bir sonraki sahibine gönderecektir. Veri hedef bilgisayara ulaşana kadar IP adresi alt aralığı.

Yerel ağların inşası için özel adres aralıkları tahsis edilmiştir. Bunlar 10.x.x.x, 192.168.x.x, 10.x.x.x, 172.16.x.x ila 172.31.x.x, 169.254.x.x adresleridir; burada x, 0 ila 254 arasında herhangi bir sayı anlamına gelir. Belirtilen adreslerden iletilen paketler yönlendirilmez, başka bir deyişle İnternet üzerinden gönderilmez ve bu nedenle farklı yerel ağlardaki bilgisayarların belirtilen aralıklarda eşleşen adresleri olabilir. Yani LLC "Horns and Hooves" ve LLC "Vasya and Company" şirketi 192.168.0.244 adresli iki bilgisayara sahip olabilir, ancak İnternet sağlayıcısından alınan 85.144.213.122 adresli olduğunu söyleyemez, çünkü . İnternette iki aynı IP adresi olamaz. Bu tür bilgisayarlardan internete ve geriye bilgi göndermek için, İnternet ile çalışırken yerel adresleri gerçek adreslerle değiştiren özel programlar ve cihazlar kullanılır. Başka bir deyişle, veriler Ağa yerel bir IP adresinden değil, gerçek bir IP adresinden gönderilir. Bu işlem kullanıcı tarafından fark edilmeden gerçekleşir ve adres çevirisi olarak adlandırılır. Aynı ağda, örneğin Horns and Hooves LLC adlı bir şirkette, tek bir yerel IP adresine sahip iki bilgisayar olamayacağını da belirtmek isterim; yani yukarıdaki örnekte, adresi 192.168.0.244 olan bir bilgisayar kastedilmiştir. bir şirkette, ikincisi diğerinde aynı adrese sahip. Aynı şirkette 192.168.0.244 adresli iki bilgisayar anlaşamayacak.

Muhtemelen harici IP ve dahili IP, kalıcı (statik IP) ve değişken (dinamik) IP gibi terimleri duymuşsunuzdur. Kısaca onlar hakkında:

  • harici IP, sağlayıcınızın size verdiği IP'nin tamamen aynısıdır; Örneğin İnternet'teki benzersiz adresiniz 85.144.24.122'dir.
  • dahili IP yerel IP'dir, yani. Örneğin yerel ağdaki IP'niz 192.168.1.3'tür.
  • Statik IP, her bağlantıda değişmeyen bir IP'dir; sana kesin ve sonsuza kadar atanan
  • dinamik IP, her bağlantıda değişen değişken bir IP adresidir

IP'nizin türü (statik veya dinamik) sağlayıcınızın ayarlarına bağlıdır.

Adres maskesi nedir (alt ağ)

Bir kuruluşun IP adreslerinin bir kısmını, diğerinin bir kısmını vb. seçmenin mümkün olması için bir alt ağ kavramı tanıtıldı. Alt ağ, aynı yerel ağa ait olduğu düşünülen bir dizi IP adresidir. Yerel bir ağ üzerinde çalışırken bilgiler doğrudan alıcıya gönderilir. Veriler, yerel ağa ait olmayan bir IP adresine sahip bilgisayarlara yönelikse, bir ağdan diğerine iletme yolunu hesaplamak için ona özel kurallar uygulanır.

Maske, yazılıma belirli bir gruba (alt ağ) kaç bilgisayarın dahil edildiğini söyleyen bir parametredir. Adres maskesi, IP adresiyle aynı yapıya sahiptir: her biri 0 ile 255 arasında olabilen dört grup sayıdan oluşan bir kümedir. Bu durumda maske değeri ne kadar düşük olursa bu alt ağa o kadar çok bilgisayar bağlanır. Küçük şirket ağları için maske genellikle 255.255.255.x'tir (örneğin, 255.255.255.224). Ağ maskesi bilgisayara IP adresiyle birlikte atanır. Yani, örneğin, 255.255.255.0 maskesine sahip bir 192.168.0.0 ağı, 192.168.0.1 ila 192.168.254 arası adreslere sahip bilgisayarları içerebilir 192.168.0.0, 255.255.255.128 maskesine sahip, 192.168.0.1 ila 192 arası adreslere izin verir. 68.0 0,127. Bence anlamı açık. Kural olarak, IP adreslerini kaydetmek için sağlayıcılar tarafından mümkün olan az sayıda bilgisayara sahip ağlar kullanılır. Örneğin, bir müşteriye 255.255.255.252 maskeli bir adres atanabilir. Bu alt ağ yalnızca iki bilgisayar içerir.

Bilgisayar bir IP adresi aldıktan ve alt ağ maskesinin değerini öğrendikten sonra program bu yerel alt ağda çalışmaya başlayabilir. Ancak küresel ağdaki diğer bilgisayarlarla bilgi alışverişinde bulunabilmek için, harici ağ için bilgilerin nereye gönderileceğine ilişkin kuralları bilmeniz gerekir. Bu amaçla Ağ Geçidi adresi gibi bir özellik kullanılır.

Ağ Geçidi Nedir?

Ağ geçidi, farklı IP alt ağları arasında bilgi ileten bir cihazdır (bilgisayar veya yönlendirici). Program, hedef adresin yerel alt ağın bir parçası olmadığını belirlerse (IP ve maske ile), bu verileri ağ geçidi görevi gören cihaza gönderir. Protokol ayarlarında böyle bir cihazın IP adresini belirtin.

Yalnızca yerel ağda çalışmak için ağ geçidi belirtilmemiş olabilir.

İnternete bağlanan bireysel kullanıcılar veya tek bağlantı kanalına sahip küçük işletmeler için sistemin yalnızca bir ağ geçidi adresine sahip olması gerekir; bu, İnternet bağlantısı olan cihazın adresidir. Birden fazla rota varsa birden fazla ağ geçidi olacaktır. Bu durumda veri yolunu belirlemek için bir yönlendirme tablosu kullanılır.

Yönlendirme tabloları nelerdir

Ve böylece onlara sorunsuz bir şekilde ulaştık. Peki.. Bunlar ne tür masalar?

Bir kuruluş veya kullanıcı, İnternet'e birkaç bağlantı noktasına sahip olabilir (örneğin, ilk sağlayıcıda bir sorun olması durumunda yedek kanallar, ancak İnternet hala çok gerekli) veya yapısında birkaç IP ağı içerebilir. Bu durumda sistemin şu veya bu bilgiyi hangi yoldan (hangi ağ geçidi üzerinden) göndereceğini bilmesi için yönlendirme tabloları kullanılır. Her ağ geçidinin yönlendirme tabloları, bilgilerin kendileri aracılığıyla iletilmesi gereken İnternet alt ağlarını gösterir. Bu durumda, birkaç ağ geçidi için aynı aralıkları ayarlayabilirsiniz, ancak veri aktarımı için farklı maliyetlerle: örneğin, bilgi en düşük maliyetli kanal üzerinden gönderilecektir ve bir nedenden dolayı başarısız olursa bir sonraki kanal üzerinden gönderilecektir. mevcut çoğu otomatik olarak ucuz bağlantı kullanılacaktır.

Ağ bağlantı noktaları nelerdir

Veri iletirken, gönderenin ve alıcının IP adreslerine ek olarak bilgi paketi port numaralarını da içerir. Örnek: 192.168.1.1:80, - bu durumda 80 port numarasıdır. Bağlantı noktası, verileri işlemesi gereken işlemi (programı) tanımlamak için veri alırken ve iletirken kullanılan bir sayıdır. Dolayısıyla, paket 80 numaralı bağlantı noktasına gönderilirse bu, bilginin HTTP sunucusuna yönelik olduğunu gösterir.

1'den 1023'e kadar olan bağlantı noktası numaraları belirli programlara (iyi bilinen bağlantı noktaları olarak adlandırılır) atanır. Tescilli programlarda 1024 -65 535 numaralı portlar kullanılabilir. Bu durumda olası çakışmaların ücretsiz bir port seçilerek programların kendisi tarafından çözülmesi gerekir. Başka bir deyişle, bağlantı noktaları dinamik olarak dağıtılacaktır: elbette, ayarlar aracılığıyla bağlantı noktasını manuel olarak ayarlamadığınız sürece, programın bir sonraki başlatılışında farklı bir bağlantı noktası değeri seçmesi mümkündür.

MAC adresi nedir

Gerçek şu ki, ağ üzerinden gönderilen paketler bilgisayarlara adlarına veya IP adreslerine göre değil. Paket, MAC adresi adı verilen belirli bir adrese sahip bir cihaza yöneliktir.

MAC adresi, bir ağ cihazının kendisine ekipman üreticisi tarafından atanan benzersiz bir adresidir; Bu, ağ kartınızın bir tür damgalı numarasıdır. MAC adresinin ilk yarısı üreticinin tanımlayıcısıdır, ikincisi ise bu cihazın benzersiz numarasıdır.

Kural olarak, örneğin bir sağlayıcıyla (sağlayıcı oturum açma parolası yerine MAC adresiyle bağlama kullanıyorsa) veya bir yönlendirici kurarken kimlik tespiti için bir MAC adresi gerekir.

Tüm ağ ayarlarını nerede görebilirim?

Tüm bunları nereye bakıp değiştirebileceğiniz konusunda neredeyse birkaç kelime söylemeyi unutuyordum.

Kullanıcı Datagram Protokolü (UDP), TCP/IP protokol paketinde bulunan en basit Aktarım Katmanı iletişim protokolüdür. Bunun nedeni minimal iletişim mekanizmasıdır. UDP, güvenilmez bir aktarım protokolü olarak kabul edilir, ancak daha iyi bir dağıtım mekanizması sağlayan IP hizmetlerini kullanır.

UDP'de alıcı, alınan pakete ilişkin bir onay oluşturmaz ve dolayısıyla gönderen, gönderilen pakete ilişkin bir onay beklemez. Bu dezavantaj, bu protokolü güvenilmez hale getirir ve işlenmesini de kolaylaştırır.

UDP talebi

Şu soru ortaya çıkabilir: Verileri taşımak için neden güvenilmez bir protokole ihtiyacımız var? Onay paketlerinin gerçek verilerle birlikte önemli miktarda bant genişliğine sahip olduğu durumlarda UDP'yi dağıtırız. Örneğin video akışı durumunda kullanıcılarına binlerce paket gönderilir. Tüm paketleri tanımak zordur ve büyük miktarda bant genişliğinin boşa harcanmasına neden olabilir. Temel IP protokolünün en iyi dağıtım mekanizması, paketlerini iletmek için en iyi çabayı gösterir, ancak video akışındaki bazı paketler kaybolsa bile, bu felaket değildir ve kolayca göz ardı edilebilir. Video ve ses trafiğinde birden fazla paketin kaybı bazen fark edilmez.

Kullanıcı Datagram Protokolü Özellikleri

  • UDP, veri onayının önemli olmadığı durumlarda kullanılır.
  • UDP, verileri tek yönde iletmek için iyi bir protokoldür.
  • UDP basittir ve isteğe dayalı mesajlar için uygundur.
  • UDP bağlantı odaklı değildir.
  • UDP bir tıkanıklık kontrol mekanizması sağlamaz.
  • UDP, verilerin özelleştirilmiş teslimini garanti etmez.
  • UDP, VoIP, medya akışı gibi akış uygulamaları için uygun bir protokoldür.

UDP başlığı

UDP başlığı işlevi kadar basittir.

UDP başlığı dört ana parametre içerir:

  • Kaynak bağlantı noktası- Bu 16 bitlik bilgi paketin kaynak portunu tanımlamak için kullanılır.
  • Hedef Bağlantı Noktası- Bu 16 bitlik bilgi, hedef makinedeki uygulama düzeyindeki hizmeti tanımlamak için kullanılır.
  • Uzunluk— Uzunluk, UDP paketinin (başlık dahil) tüm uzunluğunu belirtir. Bu 16 bitlik bir alandır ve minimum değer, UDP başlığının boyutu olan 8 bayttır.
  • Sağlama toplamı. Bu alan, gönderenin göndermeden önce oluşturduğu sağlama toplamı değerini saklar. IPv4'te bu alan isteğe bağlı olarak bulunur, dolayısıyla sağlama toplamı alanı herhangi bir değer içermediğinde 0'a ayarlanır ve tüm bitleri sıfıra ayarlanır.

UDP nerede kullanılır?

Verileri aktarmak için UDP'yi kullanan birkaç uygulama şunlardır:

  • Alan adı hizmetleri
  • Basit Ağ Yönetimi Protokolü
  • Önemsiz dosya aktarım protokolü
  • Yönlendirme Bilgi Protokolü
  • Kerberos

UDP basit bir protokoldür ve belirli bir kapsamı vardır. Her şeyden önce bunlar istemci-sunucu etkileşimleri ve multimedyadır. Ancak çoğu İnternet uygulaması güvenilir ve tutarlı iletim gerektirir. UDP bu gereksinimleri karşılamadığından farklı bir protokol gereklidir. Bu protokole TCP denir ve İnternet'in beygir gücüdür.

TCP Temelleri

İletim Kontrol Protokolü (TCP), güvenilmez bir İnternet ağı üzerinden güvenilir bir uçtan uca bayt akışı sağlamak için özel olarak tasarlanmıştır. Birbirine bağlı bir ağ, farklı bölümlerinin çok farklı topolojilere, bant genişliklerine, gecikme değerlerine, paket boyutlarına ve diğer parametrelere sahip olabilmesi açısından bağımsız bir ağdan farklıdır. TCP'nin gelişimi, protokolün ağlar arası özelliklere uyum sağlama ve çeşitli sorunlar karşısında dirençli olma becerisine odaklandı.

TCP protokolü RFC 793'te açıklanmıştır. Zamanla çeşitli hatalar ve yanlışlıklar keşfedilmiş ve bazı açılardan gereksinimler değiştirilmiştir. Bu açıklama ve düzeltmelerin ayrıntılı açıklaması RFC 1122'de verilmiştir. Protokol uzantıları RFC 1323'te verilmiştir.

TCP protokolünü destekleyen her makinenin, bir kitaplık prosedürü, bir kullanıcı işlemi veya sistem çekirdeğinin bir parçası olan bir TCP aktarım varlığı vardır. Her iki durumda da aktarım varlığı, TCP akışlarını ve IP katmanına yönelik arayüzü yönetir. TCP varlığı, kullanıcı veri akışlarını yerel işlemlerden alır, bunları 64 KB'tan büyük olmayan parçalara böler (pratikte bu sayı genellikle 460 bayt veridir, bu da bunların IP ve TCP başlıkları ile tek bir Ethernet çerçevesine yerleştirilmesine olanak tanır), ve bunları ayrı IP datagramları olarak gönderir. TCP verilerini içeren IP datagramları makineye ulaştığında, orijinal bayt akışını yeniden oluşturan TCP varlığına aktarılır. Basitlik açısından, bazen TCP taşıma varlığına (bir yazılım parçası) veya TCP protokolüne (bir dizi kural) atıfta bulunmak için "TCP" kullanırız. Bağlamdan ne kastedildiği anlaşılacaktır. Örneğin, "Kullanıcı TCP verilerini iletiyor" ifadesinde aktarım varlığı TCP doğal olarak ima edilmektedir.

IP katmanı datagramların doğru teslimini garanti etmez, bu nedenle TCP'nin süresi dolmuş zaman aşımlarını izlemesi ve gerekirse paketleri yeniden iletmesi gerekir. Bazen datagramlar yanlış sırada gelir. TCP ayrıca bu tür datagramlardan mesajların kurtarılmasından da sorumludur. Bu nedenle TCP, birçok kullanıcının arzu ettiği ancak IP'nin sağlamadığı güvenilirliği sağlayacak şekilde tasarlanmıştır.

TCP Hizmet Modeli

TCP hizmeti, hem gönderen hem de alıcı tarafından oluşturulan soketlere (soketler veya uç noktalar) dayanmaktadır. Bunlar Berkeley Soketleri bölümünde tartışıldı. Her soketin, ana bilgisayarın IP adresinden ve ana bilgisayara yerel olarak port adı verilen 16 bitlik bir sayıdan oluşan bir numarası (adresi) vardır. TCP'deki bir bağlantı noktasına TSAP adresi denir. TCP hizmetine erişmek için, gönderen makinedeki bir yuva ile alıcı makinedeki bir yuva arasında açıkça bir bağlantı kurulmalıdır.

Bir soket aynı anda birden fazla bağlantı için kullanılabilir. Yani iki veya daha fazla bağlantı aynı soket üzerinde sonlanabilir. Bağlantılar her iki uçtaki soket kimlikleriyle (soket1, soket2) ayırt edilir. Sanal kanal numaraları veya diğer tanımlayıcılar kullanılmaz.

Popüler portlar olarak adlandırılan 1024'ün altındaki port numaraları standart servisler tarafından ayrılmıştır. Örneğin, FTP kullanarak bir dosyayı aktarmak için bir ana bilgisayara bağlanmak isteyen herhangi bir işlem, hedef ana bilgisayarın 21 numaralı bağlantı noktasıyla iletişim kurabilir ve dolayısıyla FTP arka plan programıyla iletişim kurabilir. Popüler bağlantı noktalarının bir listesi www.iana.org web sitesinde verilmektedir.

Elbette, FTP arka plan programını önyükleme sırasında 21 numaralı bağlantı noktasına, ardından telnet arka plan programını 23 numaralı bağlantı noktasına vb. bağlayabiliriz. , çoğu zaman boştadırlar. Bunun yerine, UNIX'te inetd adı verilen, birden çok bağlantı noktasıyla iletişim kuran ve ilk gelen bağlantıyı bekleyen tek bir arka plan programının kullanılması yaygındır. Bu meydana geldiğinde inetd yeni bir süreç yaratır ve isteği işlemek için uygun arka plan programını çağırır. Böylece sadece inetd sürekli aktif oluyor, diğerleri ise sadece kendilerine iş geldiğinde çağrılıyor. Inetd'nin port atamaları hakkında bilgi alabileceği özel bir konfigürasyon dosyası vardır. Bu, sistem yöneticisinin sistemi, kalıcı arka plan programlarının en yoğun bağlantı noktalarıyla (örneğin 80) ve inetd'nin geri kalanlarla ilişkilendirileceği şekilde yapılandırabileceği anlamına gelir.

Bazı ayrılmış bağlantı noktaları

Protokol

Kullanım

21

FTP'de

Dosyaları aktarma

23

Telnet

Uzaktan oturum açma

25

SMTP

E-posta

69

TFTP

En basit dosya aktarım protokolü

79

Parmak

Kullanıcı bilgilerini arama

80

HTTP

Dünya çapında Ağ

110

POP-3

Uzaktan e-posta erişimi

119

NNTP

Haber grupları

Tüm TCP bağlantıları tam çift yönlü ve noktadan noktayadır. Tam dubleks, trafiğin aynı anda zıt yönlerde akabileceği anlamına gelir. Noktadan noktaya bağlantı, iki uç noktaya sahip olduğu anlamına gelir. Yayın ve çoklu yayın TCP tarafından desteklenmez.

TCP bağlantısı bir mesaj akışı değil, bir bayt akışıdır. İletiler arasındaki kenarlıklar korunmaz. Örneğin, bir gönderme işlemi bir TCP akışına dört adet 512 baytlık veri yığını yazarsa, bu veriler, alıcı işleme dört adet 512 baytlık parça, iki adet 1024 baytlık parça, bir adet 2048 baytlık parça veya başka bir şey olarak teslim edilebilir. başka. Alıcının verilerin nasıl yazıldığını belirlemesinin bir yolu yoktur.

UNIX sistemindeki dosyalar da bu özelliğe sahiptir. Ray'ı okuyan program bu dosyanın nasıl yazıldığını belirleyemez: blok blok, bayt bayt veya tamamen aynı anda. UNIX sistem dosyalarında olduğu gibi, TCP programlarının da baytların anlamı hakkında hiçbir fikri yoktur veya bu konuyla ilgilenmez. Onlar için bir bayt sadece bir bayttır.

TCP bir uygulamadan veri aldığında, bunu bir kerede gönderebilir veya kendi seçimine göre daha büyük bir veri yığınını bir kerede göndermek için arabelleğe alabilir. Ancak bazen bir uygulamanın verilerin hemen gönderilmesine ihtiyaç duyulur. Örneğin bir kullanıcının uzaktaki bir makinede oturum açtığını varsayalım. Bir komut girip Enter tuşuna bastıktan sonra, girdiği satırın bir sonraki satır girilene kadar ara belleğe alınması yerine, hemen uzaktaki makineye iletilmesi önemlidir. Verilerin gecikmeden aktarılmasını sağlamak için bir uygulama PUSH bayrağını ayarlayabilir.

Bazı eski uygulamalar PUSH bayrağını mesaj sınırlayıcı olarak kullanıyordu. Bu numara bazen işe yarasa da, tüm TCP uygulamaları PUSH bayrağını alıcı uygulamaya iletmez. Ek olarak, TCP varlığı hatta ilk PUSH paketi gönderilmeden önce bu türden birkaç paket daha alırsa (yani çıkış hattı meşgulse), TCP varlığı tüm bu verileri tek bir datagram olarak gönderme hakkına sahip olacaktır. onları ayrı bölümlere ayırmamak.

TCP hizmetinin bahsetmeye değer son özelliği acil verilerdir. Bir programla etkileşimde bulunan bir kullanıcı, devam eden bir uzak işlemi iptal etmek için etkileşimli olarak Sil veya Ctrl-C tuşlarına bastığında, gönderen uygulama, kontrol bilgilerini çıkış veri akışına yerleştirir ve bunu ACİL bayrağıyla birlikte TCP hizmetine iletir. Bu bayrak, TCP varlığının veri toplamayı durdurmasına ve ağ bağlantısı için sahip olduğu her şeyi derhal serbest bırakmasına neden olur.

Acil veriler hedefine ulaştığında, alan uygulama kesintiye uğrar (yani UNIX terminolojisinde "sinyal verilir") ve ardından giriş akışındaki verileri okuyabilir ve bunlar arasında acil verileri arayabilir. Acil verilerin sonu, uygulamanın nerede bittiğini tanıyabilmesi için işaretlenir. Acil verilerin başlangıcı işaretlenmez. Uygulama bunu kendi başına çözmelidir. Bu devre, geri kalan her şeyi uygulamaya bırakarak kaba bir sinyalleşme mekanizması sağlar.

TCP protokolü

Bu bölümde TCP protokolü genel hatlarıyla ele alınacaktır. Bir sonraki bölümde protokol başlığını alan alan tartışacağız.

TCP'nin tüm protokol yapısını tanımlayan önemli bir özelliği, TCP bağlantısında her baytın kendi 32 bitlik sıra numarasına sahip olmasıdır. İnternetin ilk yıllarında kiralık hatlar üzerinden yönlendiriciler arasındaki temel veri aktarım hızı 56 Kbps idi. Verileri sürekli olarak en yüksek hızda dışarı pompalayan bir ana bilgisayar için sıra numaralarının tam bir döngüye ulaşması bir haftadan fazla zaman alır. Mevcut hızlarda sıra numaraları çok çabuk tükenebilir; bu konuya daha sonra değineceğiz. Onaylar ve kayan pencere mekanizması için ayrı 32 bitlik sıra numaraları kullanılır; bu konu daha sonra ele alınacaktır.

Gönderen ve alan TCP varlıkları, segmentler biçiminde veri alışverişinde bulunur. Bir segment, sabit 20 baytlık bir başlıktan (artı isteğe bağlı bir parça) oluşur ve bunu veri baytları takip edebilir. Segmentlerin boyutu TCP yazılımı tarafından belirlenir. Birkaç yazma işleminin sonucu olarak elde edilen verileri tek bir segmentte birleştirebilir veya tam tersine, bir yazmanın sonucunu birkaç segmente dağıtabilir. Segmentlerin boyutu iki sınırla sınırlıdır. İlk olarak, TCP başlığı da dahil olmak üzere her bir segment, IP paketinin 65.515 baytlık yük alanına sığmalıdır. İkinci olarak, her ağın bir Maksimum Aktarım Birimi (MTU) vardır ve her segmentin MTU'ya sığması gerekir. Uygulamada, maksimum iletim biriminin boyutu tipik olarak 1500 bayttır (bu, Ethernet veri yükü alanının boyutuna karşılık gelir) ve dolayısıyla segment boyutunun üst sınırını tanımlar.

TCP varlıkları tarafından kullanılan ana protokol kayan pencere protokolüdür. Bir segmenti iletirken gönderen bir zamanlayıcı başlatır. Segment hedefine ulaştığında, alıcı TCP varlığı, numarası olan bir segmenti (gönderilecek bir şey varsa veriyle birlikte veya verisiz) geri gönderir.

onay, bir sonraki beklenen bölümün sıra numarasına eşittir. Onay zaman aşımı süresi dolarsa gönderen segmenti yeniden gönderir.

Bu protokol basit gibi görünse de daha detaylı incelenmesi gereken birçok detay bulunmaktadır. Segmentler yanlış sırada gelebilir. Yani örneğin 3072'den 4095'e kadar baytların zaten gelmiş olması mümkündür, ancak 2048'den 3071'e kadar baytlar henüz alınmadığından bunlar için bir onay gönderilemiyor. Ayrıca, segmentler ağda o kadar uzun süre kalabilir ki, gönderici zaman aşımına uğrar ve bunları tekrar iletir. Yeniden iletilen bölüm farklı aralıktaki parçaları içerebilir, dolayısıyla zaten doğru şekilde alınmış olan bayt sayılarını belirlemek için çok dikkatli bir uygulama gerekli olacaktır. Bununla birlikte, akıştaki her bayt, uzaklığıyla benzersiz bir şekilde tanımlandığından, bu görev uygulanabilir.

TCP'nin bu sorunlarla başa çıkabilmesi ve bunları verimli bir şekilde çözebilmesi gerekir. TCP akışlarının performansını optimize etmek için çok çaba harcandı. Bir sonraki bölümde TCP protokolünün çeşitli uygulamalarında kullanılan çeşitli algoritmaları tartışacağız.

TCP segment başlığı

Her bölüm 20 baytlık sabit formatlı bir başlıkla başlar. Bunu ek alanlar takip edebilir. Ek alanlardan sonra en fazla 65.535 - 20 - 20 = 65.495 bayt veri bulunabilir; burada ilk 20 bayt IP başlığı ve ikincisi TCP başlığıdır. Segmentler veri içeremez. Bu tür bölümler genellikle onayları iletmek ve mesajları kontrol etmek için kullanılır.

TCP başlığına alan alan bakalım. Alıcı Bağlantı Noktası ve Kaynak Bağlantı Noktası alanları, yerel bağlantı uç noktalarının tanımlayıcılarıdır. Ana bilgisayar IP adresiyle birlikte bağlantı noktası numarası, benzersiz bir 48 bitlik uç nokta tanımlayıcısı oluşturur. Kaynak ve hedefle ilgili bu tür bir çift tanımlayıcı, bağlantıyı benzersiz bir şekilde tanımlar.

Sıra Numarası ve Onay Numarası alanları olağan işlevlerini yerine getirir. Onay Numarası alanının alınan son baytı değil, beklenen sonraki baytı ifade ettiğini unutmayın. Her ikisi de 32 bittir çünkü TCP akışındaki her veri baytı numaralandırılmıştır.

TCP Başlığı Uzunluğu alanı, TCP başlığının 32 bitlik sözcüklerle ifade edilen boyutunu içerir. Bu bilgi gereklidir çünkü İsteğe Bağlı Alanlar alanı ve onunla birlikte başlığın tamamı değişken uzunlukta olabilir. Temel olarak bu alan, 32 bitlik sözcüklerle ölçülen, segmentin başlangıcından veri alanına kadar olan uzaklığı belirtir. Bu başlık uzunluğuyla aynıdır.

Daha sonra kullanılmayan 6 bitlik bir alan geliyor. Bu alanın çeyrek asırdır hayatta kalması, TCP tasarımının ne kadar iyi düşünülmüş olduğunun bir kanıtıdır.

Bunu altı adet 1 bitlik bayrak takip eder. Geçerli bayt sıra numarasından acil verinin konumuna kadar olan bayt uzaklığını içeren Acil Veri İşaretçisi alanı kullanıldığında URG biti 1'e ayarlanır. TCP kesme mesajlarını bu şekilde uygular. Daha önce de belirtildiği gibi, TCP protokolü, kesintinin nedeni ile ilgilenmeden yalnızca kullanıcı sinyalinin alıcıya iletilmesini sağlar.

ACK biti 1'e ayarlanırsa Onay Numarası alanı anlamlı veriler içerir. Aksi takdirde, bu segment bir alındı ​​bildirimi içermez ve Onay Numarası alanı göz ardı edilir.

PSH biti aslında göndericiye, alıcıya, paket dolana kadar arabellekte saklamak yerine, paketi alır almaz verileri uygulamaya iletmesini söylemesini söyleyen bir PUSH bayrağıdır. (Alıcı daha fazla verimlilik için ara belleğe alabilir.)

RST biti, bir ana bilgisayar arızası veya başka bir nedenden ötürü kilitlenen bir bağlantının durumunu sıfırlamak için kullanılır. Ayrıca geçersiz bir segmenti veya bağlantı oluşturma girişimini reddetmek için de kullanılır. RST biti ayarlanmış bir segment alırsanız bir sorun var demektir.

SYN biti bağlantı kurmak için kullanılır. Bir bağlantı isteğinde SYN biti = 1 ve ACK biti = 0 bulunur; bu, onay alanının kullanılmadığı anlamına gelir. Bu isteğe verilen yanıt bir alındı ​​bildirimi içerdiğinden bu bitlerin değerleri şöyledir: SYN= 1, ACK- 1. Böylece SYN biti CONNECTION REQUEST ve CONNECTION ACCEPTED bölümlerini belirtmek için kullanılır ve ACK biti kullanılır onları birbirinden ayırt etmek.

FIN biti bağlantıyı sonlandırmak için kullanılır. Gönderenin iletecek başka verisi olmadığını gösterir. Ancak bağlantı kapatıldıktan sonra bile süreç süresiz olarak veri almaya devam edebilir. FIN ve SYN bitlerine sahip segmentler, doğru sırada yürütülmelerini sağlamak için sıra numaralarına sahiptir.

TCP protokolündeki akış kontrolü, değişken boyutlu bir kayan pencere kullanılarak gerçekleştirilir. Pencere Boyutu alanı, onay baytından sonra kaç bayt gönderilebileceğini belirtir. Pencere Boyutu alanının değeri sıfır olabilir, yani Alındı ​​Numarası-1'e kadar tüm baytların alındığı ancak alıcının şu anda bazı sorunlar yaşadığı ve kalan baytları henüz alamadığı anlamına gelir. Daha fazla aktarım için izin, aynı Onay Numarası alan değerine ve sıfır olmayan Pencere Boyutu alan değerine sahip bir segment gönderilerek elde edilebilir.

Bazı protokollerde çerçeve onayları, iletime devam etme izinleriyle ilişkilendirilir. Bu ilişki, bu protokollerdeki katı şekilde sabitlenmiş kayan pencere boyutunun bir sonucudur. TCP'de onaylar, veri aktarma izinlerinden ayrılır. Temel olarak alıcı şöyle diyebilir: "K-ro'ya kadar bayt aldım, ancak şu anda veri almaya devam etmek istemiyorum." Bu bölüm (değişken boyutlu kayan pencere olarak ifade edilir) protokole ek esneklik sağlar. Aşağıda bu konuyu daha ayrıntılı olarak ele alacağız.

Sağlama toplamı alanı güvenilirliği artırmak için kullanılır. Başlığın, verilerin ve sözde başlığın sağlama toplamını içerir. Hesaplamalar yapılırken Sağlama Toplamı alanı sıfıra ayarlanır ve uzunluğu tek sayı ise veri alanı sıfır baytla doldurulur. Sağlama toplamı algoritması basitçe tüm 16 bitlik sözcükleri ikinin tümleyenine ekler ve ardından tüm toplamın tümleyenini hesaplar. Sonuç olarak alıcı, Sağlama Toplamı alanı da dahil olmak üzere tüm segmenti kontrol ettiğinde sonuç 0 olmalıdır.

Sözde başlık, 32 bitlik kaynak ve hedef IP adreslerini, TCP protokol numarasını (6) ve TCP segmentinin bayt sayısını (başlık dahil) içerir. TCP sağlama toplamına bir sözde başlık eklemek, yanlış teslim edilen paketlerin tespit edilmesine yardımcı olur, ancak içindeki IP adresleri TCP katmanına değil, IP katmanına ait olduğundan protokol hiyerarşisini bozar. UDP, sağlama toplamı için aynı sözde başlığı kullanır.

İsteğe Bağlı Alanlar alanı, standart başlığın kapsamadığı ek yetenekler sağlar. Bu alanlardan birini kullanarak her ana bilgisayar, kabul edebileceği maksimum yük alanı boyutunu belirtebilir. Kullanılan segmentlerin boyutu ne kadar büyük olursa verimlilik de o kadar artar çünkü 20 baytlık başlıkların yükünü azaltır, ancak tüm ana bilgisayarlar çok büyük segmentleri kabul edemez. Ana bilgisayarlar, bağlantı kurulumu sırasında maksimum yük alanı boyutunda birbirleriyle iletişim kurabilir. Varsayılan olarak bu boyut 536 bayttır. Tüm ana bilgisayarların 536 + 20 = 556 bayt boyutunda TCP segmentlerini kabul etmesi gerekir. Her yönün kendi maksimum yük alanı boyutu olabilir.

Yüksek aktarım hızlarına ve/veya yüksek gecikmeye sahip hatlar için 64 KB'lık bir pencere çok küçüktür. Böylece bir TZ hattı için (44.736 Mbit/s), tam pencere sadece 12 ms'de hatta iletilebilmektedir. Gidiş dönüş süresi 50 ms ise (kıtalararası optik kablo için tipiktir), gönderenin onay için harcayacağı sürenin 3/4'ü. Uydu üzerinden iletişim kurulduğunda durum daha da kötü olacaktır. Daha büyük bir pencere boyutu verimliliği artırır ancak 16 bitlik Pencere Boyutu alanı buna izin vermez. RFC 1323, iki ana bilgisayarın bağlantı kurarken değeri üzerinde anlaşabileceği yeni bir Pencere Ölçeği parametresi önerdi. Bu sayı, Pencere Boyutu alanının 14 bit sola kaydırılmasına olanak tanıyarak pencere boyutunun 230 bayta (1 GB) kadar genişlemesine olanak tanır. Şu anda çoğu TCP protokolü uygulaması bu özelliği desteklemektedir.

RFC 1106'da önerilen ve artık yaygın olarak kullanılan diğer bir seçenek, geri izleme yerine seçici yeniden deneme protokolünün kullanılmasıdır. Hedef, çok sayıda iyi bölümün izlediği bir kötü bölüm alırsa, normal bir TCP protokolü eninde sonunda zaman aşımına uğrayacak ve kapanacaktır. Doğru şekilde alınanlar da dahil olmak üzere tüm onaylanmamış bölümleri yeniden iletin. RFC 1106, alıcının tek bir segment veya birden fazla segment talep etmesine izin vermek için negatif bildirimlerin (NAK'ler) kullanılmasını önerdi. Alıcı taraf, alındıktan sonra arabellekte saklanan tüm verileri onaylayabilir, böylece yeniden iletilen veri miktarı azalır.

Tüm makale dizisini gerçekten çok beğendim, ayrıca her zaman kendimi çevirmen olarak denemek istedim. Belki makale deneyimli geliştiriciler için çok açık görünebilir, ancak bana öyle geliyor ki her durumda faydalı olacak.

Merhaba, adım Glenn Fiedler ve sizi çevrimiçi kitabım Oyun Geliştiricileri için Ağ Programlama'nın ilk makalesine hoş geldiniz.

Bu makalede, ağ programlamanın en temel yönleriyle başlayacağız; ağ üzerinden veri alma ve iletme. Veri almak ve iletmek, ağ programcılarının gerçekleştirdiği tüm görevlerin ana ve en basit kısmıdır, ancak hangi yolun en iyi şekilde ilerleneceğini belirlemek genellikle zordur. Bu kısma yeterince dikkat edin; eğer bir yanlış anlamayla karşılaşırsanız, bu daha sonra çok oyunculu oyununuz için çok kötü sonuçlara yol açabilir!

Büyük olasılıkla soketler hakkında zaten bir şeyler duymuşsunuzdur ve bunların iki ana türde olduğunu biliyor olabilirsiniz: TCP ve UDP. Çok oyunculu bir oyun geliştirirken karar vermeniz gereken ilk şey, ne tür soketler kullanacağınızdır; TCP mi, UDP mi, yoksa her ikisi mi?

Soket tipi seçimi tamamen geliştirdiğiniz oyunun türüne bağlıdır. Bu yazı dizisinde Halo, Battlefield 1942, Quake, Unreal, CounterStrike, Team Fortress vb. gibi bir aksiyon oyunu yazdığınızı varsayacağım.

Şimdi her bir soket türünün özelliklerine daha yakından bakacağız (aksiyon tarzı bir oyun geliştirdiğimizi hesaba katarak) ve İnternet'in nasıl çalıştığının ayrıntılarına biraz daha derinlemesine ineceğiz. Detaylı bir incelemenin ardından doğru seçenek ortaya çıkacak!

TCP “iletim kontrol protokolü” anlamına gelir ve IP “internet protokolü” anlamına gelir. Hepsi birlikte, web'de gezinmekten IRC'ye ve e-posta iletişimlerine kadar çevrimiçi yaptığınız hemen hemen her şeyi desteklerler; hepsi TCP/IP üzerinde çalışır.

Daha önce TCP soketleri kullandıysanız, TCP'nin güvenilir bağlantı ilkesini kullanan bir protokol olduğunu bilmelisiniz. Bu, sanki bir bilgisayardaki bir dosyaya bilgi yazıp diğer bilgisayardaki aynı dosyadan okuyormuş gibi, iki bilgisayar arasında bağlantı kurduğunuz ve ardından bunlar arasında veri gönderdiğiniz anlamına gelir.

Bu durumda bağlantının güvenilir ve tutarlı olduğu kabul edilir; yani gönderdiğiniz tüm bilgilerin alıcıya gönderildiği sırayla ulaşması garanti edilir. Ayrıca, bir TCP bağlantısı sürekli bir veri akışı olarak düşünülebilir; protokolün kendisi, verileri paketlere ayırma ve bunları ağ üzerinden gönderme işini üstlenir.

Bir kez daha söylüyorum; her şey bir dosyaya yazmak veya dosyadan okumak kadar basit. İlköğretim Watson!

Ancak bu kullanım kolaylığı, "kaputun altında", daha düşük bir seviyede - IP protokolü düzeyinde - gerçekte olandan tamamen farklıdır.

Bu seviyede bağlantı kavramı yoktur; bunun yerine bireysel paketler bir bilgisayardan diğerine iletilir. Bu süreci, insanlarla dolu bir odada bir kişiden diğerine bir notun iletilmesi olarak düşünebilirsiniz: sonunda not doğru kişiye ulaşır, ancak aynı zamanda birçok elden geçer.

Ancak notun muhatabına ulaşacağının garantisi yoktur. Gönderen, ulaşması umuduyla bir not gönderir, ancak alıcı yanıt yazmaya karar verene kadar mesajın ulaşıp ulaşmadığını bile bilmez.
Doğal olarak, gerçekte her şey biraz daha karmaşıktır, çünkü gönderen bilgisayar, paketin mümkün olduğu kadar çabuk ulaşması için ağdaki hangi bilgisayarlardan iletilmesi gerektiğini tam olarak bilmez. Bazen IP aynı paketin birden fazla kopyasını iletir; bu kopyalar hedefe ulaşmak için farklı yollar kullanabilir ve muhtemelen farklı zamanlarda ulaşacaktır.

Peki ya bilgisayarlar arasında bilgileri dosya okuma/yazma tarzında değil, bireysel paketleri doğrudan gönderip alarak aktarmak istersek?

Bunu UDP kullanarak yapabiliriz. UDP, "kullanıcı datagram protokolü" anlamına gelir ve IP üzerinde (TCP gibi) çalışır, ancak bir ton işlevsellik eklemek yerine, IP'ye yalnızca küçük bir eklentidir.

UDP'yi kullanarak, belirli bir IP adresine (örneğin, 112.140.20.10) ve bağlantı noktasına (örneğin, 52423) bir paket gönderebiliriz ve bu paket, hedefine ulaşana kadar (veya yolda kaybolana kadar) bilgisayardan bilgisayara iletilecektir. yol).

Aynı zamanda alıcı tarafında oturup belirli bir portu (bizim durumumuzda 52423) dinleyerek bekliyoruz ve birinden bir paket geldiğinde (hiçbir bağlantının kullanılmadığını unutmayın), bununla ilgili bir bildirim alıyoruz. gönderen bilgisayarın adresi ve portunu, paket boyutunu ve ardından bu paketteki verileri okuyabiliriz.

UDP protokolü veri dağıtımını garanti etmez. Pratikte çoğu paket elbette ulaşır, ancak her zaman yaklaşık %1-5'lik bir kayıp olur ve bazen paketlerin hiç ulaşmadığı dönemler olur (gönderen ile alıcı arasında bazı anlaşmazlıkların olabileceğini unutmayın). binlerce bilgisayar olabilir ve bunlardan herhangi biri arızalanabilir veya bozulabilir).

Ayrıca UDP, paketlerin teslim edilme sırasını garanti etmez. Sırayla beş paket gönderebilirsiniz - 1, 2, 3, 4, 5 - ancak bunlar tamamen farklı bir sırayla gelebilirler - örneğin 3, 1, 2, 5, 4. Yine pratikte büyük ihtimalle gönderileceklerdir. çoğu zaman doğru sırayla ulaşırsınız ancak buna güvenemezsiniz!

Son olarak, UDP IP'ye pek bir şey katmasa da bir şeyi garanti eder. Bir paketi iletirseniz ya tamamen ulaşır ya da hiç gelmez. Yani, başka bir bilgisayara 256 baytlık bir paket gönderirseniz, paketten yalnızca ilk 100 baytı alamaz; 256 baytın tamamını alması gerekir. Bu gerçekten UDP protokolünün garanti ettiği tek şeydir - geri kalan her şey omuzlarınıza düşer.

Öyleyse karar vermemiz gerekiyor: TCP mi yoksa UDP soketlerini mi kullanmalıyız? Gelin bunların özelliklerine bir göz atalım:

  • Bağlantı prensibini kullanır
  • Teslimatı ve geri dönüşü garanti eder
  • Bilgileri otomatik olarak paketlere böler
  • Verilerin çok yoğun şekilde gönderilmemesini sağlar (veri akış kontrolü)
  • Kullanımı kolay - bir dosyadan yazmak/okumak gibi
UDP'si:
  • Bağlantı ilkesini kullanmaz; bunu manuel olarak uygulamanız gerekir
  • Paketlerin teslimatını ve teslimat sırasını garanti etmez - yanlış sırada, kopyalarla gelebilir veya hiç ulaşmayabilir!
  • Verileri manuel olarak paketlere bölüp göndermeniz gerekir.
  • Çok yoğun veri göndermemeye dikkat etmelisiniz
  • Bir paket kaybolursa, onu bir şekilde takip etmeniz ve gerekirse yeniden göndermeniz gerekir.
Böyle bir listeyle çözüm açık görünüyor - TCP ihtiyacımız olan tüm işlevleri uyguluyor ve kullanımı daha kolay, UDP kullanmak ise her şeyi manuel olarak sıfırdan yazarak hemoroid vaat ediyor. Yani TCP kullanıyoruz, değil mi?

Ama hayır.

Çok oyunculu bir oyun geliştirirken TCP kullanmak muhtemelen yapabileceğiniz en kötü hatadır. Nedenini anlamak için TCP'nin kullanımını bu kadar kolay hale getiren şeyin ne olduğuna bakalım!

TCP nasıl çalışır?
TCP ve UDP'nin her ikisi de IP üzerinde çalışır ancak gerçekte tamamen farklıdırlar. UDP, IP'ye çok benzer şekilde davranırken, TCP kullanıcıyı tüm paket sorunlarından uzaklaştırarak etkileşimi bir dosyaya okuma/yazmaya benzer hale getirir.

Peki bunu nasıl yapıyor?

İlk olarak, TCP bir veri akışı soyutlaması kullanır; bu akışa baytlarca veri yazabilirsiniz ve TCP, verinin hedefine ulaştığından emin olur. IP, verileri paketler halinde ilettiğinden ve TCP, IP'nin üzerinde çalıştığından, TCP, kullanıcının giriş akışını ayrı paketlere bölmelidir. Yani TCP'de bazı mantıklar verileri bir sıraya toplar ve yeterli veri olduğunda bir paket oluşturup hedefe gönderir.

Çok küçük paketleri aktarmamız gerekiyorsa, bu davranış çok oyunculu oyunumuz için bir sorun olabilir. TCP, belirli bir boyutta (örneğin yüz bayttan fazla) bir paket oluşturmaya yetecek kadar birikinceye kadar verilerimizi aktarmamaya karar verebilir. Ve bu büyük bir sorundur, çünkü verileri istemciden (oyuncunun tuş vuruşları) sunucuya mümkün olduğunca çabuk aktarmak gerekir ve protokol tarafından veri arabelleğe alma nedeniyle gecikmeler varsa, o zaman istemci tarafındaki oyuncu için Oyun pek keyifli bir şekilde olmayacak. Bu durumda, oyun nesnelerinin güncellenmesi gecikmeli olarak ve nadiren gerçekleşecektir; halbuki bizim nesneleri zamanında ve sık sık güncellememiz gerekir.

TCP'nin bunu düzeltmek için bir seçeneği vardır - “TCP_NODELAY”. Protokole, verinin gönderme kuyruğunda birikmesini beklememesini, hemen göndermesini söyler.

Ne yazık ki, bu seçenek yüklü olsa bile TCP'nin çevrimiçi oyunlarda kullanıldığında birçok sorunu vardır.

Tüm sorunların kökü, TCP'nin kayıp veya sıra dışı paketleri işleme biçiminde yatmakta ve bu da güvenilir ve tutarlı bir bağlantı yanılsaması yaratmaktadır.

TCP bağlantı güvenilirliğini nasıl sağlar?
İletim sırasında TCP, veri akışını ayrı paketlere böler, bunları güvenilir olmayan IP protokolünü kullanarak ağ üzerinden iletir ve ardından alıcı bilgisayarda alınan paketlerden orijinal akışı yeniden oluşturur.

Peki paketlerden biri gelmezse ne olur? Veya paketler düzensiz veya kopyalarla mı ulaşır?

TCP'nin nasıl çalıştığının ayrıntılarına çok fazla girmeden (ve bu gerçekten çok karmaşık bir konudur - bunu TCP/IP Illustrated'da okuyabilirsiniz), süreç şöyle görünür: TCP bir paket gönderir, paketin ulaşmadığını belirler ve aynı paketi alıcıya tekrar gönderir. Alıcı tarafında yinelenen paketler ortadan kaldırılır ve sıra dışı gelen paketler, her şeyin olması gerektiği gibi, güvenilir ve düzenli olması için yeniden sıralanır.

Sorun şu ki, TCP veri akışını bu şekilde "senkronize ettiğinde", eğer bir paket kaybolursa, kayıp paket yeniden gönderilene (ve hedef tarafından alınana) kadar iletim durur. Beklerken yeni veri gelirse kuyruğa alınır ve kayıp paket gelene kadar okuyamazsınız. Bir paketin tekrar gönderilmesi ne kadar sürer? Bu, en azından paketin gidiş-dönüş süresini (TCP hangi paketin yeniden gönderileceğini belirlediğinde) artı kayıp paketin yeniden teslim süresini alır. Yani, bilgisayarlar arasındaki ping 125 ms ise, paketin yeniden iletilmesi saniyenin beşte biri kadar, en kötü durumda ise yarım saniyeye kadar sürecektir (yeniden gönderilen paketin de aniden kaybolduğunu hayal edin). Veseluha!

Çok oyunculu oyunlar için neden asla TCP kullanmamalısınız?
Çevrimiçi oyunlarda TCP kullanmanın sorunu, tarayıcıların, e-postaların ve diğer uygulamaların aksine oyunların gerçek zamanlı etkileşime dayanmasıdır. Kullanıcının tuş vuruşları ve oyuncuların oyundaki konumu gibi oyunun birçok yönü için, bir saniye önce ne olduğu değil, yalnızca oyun dünyasının en güncel durumu önemlidir.

3D nişancı oyunu gibi çok oyunculu bir oyunun basit bir örneğine bakalım. Oyunun ağ kısmı çok basit bir şekilde oluşturulmuştur: oyun döngüsünün her yinelemesinde, istemci sunucuya oyuncunun tüm eylemlerinin bir açıklamasını gönderir (basılan tuşlar, fare konumu vb.) ve her yinelemede sunucu bu verileri işler. , oyun dünyasının modelini günceller ve mevcut olanları dünya nesnelerinin istemci konumlarına geri göndererek oyuncu için yeni bir çerçeve çizer.

Yani oyunumuzda ağ üzerinden iletilen bir paket kaybolursa oyun durur ve paket yeniden teslim edilene kadar bekler. İstemci tarafında oyun nesneleri donuyor ve sunucuda da sunucu yeni paketleri kabul edemediğinden oyuncular hareket edemiyor veya ateş edemiyor. Kayıp paket nihayet ulaştığında artık geçerliliğini yitirmiş güncel bilgiler içerir. Ayrıca bundan sonra bekleme süresi boyunca kuyrukta biriken tüm paketler de gelir ve hepsinin döngünün bir yinelemesinde işlenmesi gerekir. Tam bir kafa karışıklığı!

Maalesef TCP'nin bu davranışını değiştirmenin bir yolu yoktur ve buna da gerek yoktur, çünkü TCP'nin anlamı budur. İnternet üzerinden veri aktarımının güvenilir ve tutarlı bir veri akışı haline getirilmesi için bu bir zorunluluktur.
Ancak güvenilir ve tutarlı bir veri akışına ihtiyacımız yok.

Verilerin istemciden sunucuya mümkün olduğunca çabuk ulaşması gerekiyor ve verilerin yeniden gönderilmesini beklemek istemiyoruz.
Bu nedenle çok oyunculu oyunlar için asla TCP kullanmamalısınız.

Fakat bekle! Neden hem UDP hem de TCP'yi birlikte kullanamıyorum?

Kullanıcı tıklamaları ve oyun dünyasının durumu gibi gerçek zamanlı oyun verileri için yalnızca en güncel veriler önemlidir; ancak bir bilgisayardan diğerine gönderilen komut kümeleri gibi diğer veri türleri için kanalın güvenilirliği ve tutarlılığı önemlidir. çok önemli olabilir.

Elbette, kullanıcı girişi ve dünya durumu verileri için UDP'yi ve teslim edilmesinin garanti edilmesi gereken veriler için TCP'yi kullanmak cazip gelebilir. Hatta birden fazla komut "iş parçacığı" oluşturabileceğinizi bile düşünüyor olabilirsiniz - örneğin, biri yükleme seviyeleri için, diğeri AI komutları için. "Bir seviyeyi yükleyecek veri paketi kaybolursa yapay zeka ekiplerinin sırada beklemesine ihtiyacım yok, çünkü bunlar tamamen ilgisiz!" diye düşünüyorsunuz. Bu durumda haklısınız ve her komut akışı için bir TCP soketi oluşturmaya karar verebilirsiniz.

İlk bakışta bu harika bir fikir. Ancak sorun şu ki, TCP ve UDP'nin her ikisi de IP üzerinde çalıştığından, her iki protokolün paketleri de zaten IP düzeyinde birbirini etkileyecektir. Bu etkinin tam olarak nasıl ortaya çıkacağı çok karmaşık bir sorudur ve TCP'deki güvenilirlik mekanizmalarıyla ilgilidir. Ancak her durumda, TCP kullanmanın genellikle UDP paket kaybının artmasına yol açtığını unutmayın. Bu konuda daha fazla bilgi edinmek istiyorsanız bu makaleyi okuyabilirsiniz.

Çözüm
Yalnızca UDP'yi kullanmanızı değil, yalnızca UDP'yi kullanmanızı ve başka hiçbir şey kullanmamanızı öneririm. TCP ve UDP'yi birlikte kullanmayın; bunun yerine, ihtiyacınız olan TCP özelliklerini UDP'ye dayalı olarak nasıl uygulayacağınızı öğrenin.

Aşağıdaki makalelerde size bunu nasıl yapacağınızı anlatacağım - UDP tabanlı bağlantıları kullanarak kendi protokolünüzü uygulamaktan iletim güvenilirliği ve veri akışı kontrolünü uygulamaya kadar.