Ağ programlamasında akışlar ve datagramlar arasındaki fark nedir?


131

Soketler (akış) ile soketler (datagramlar) arasındaki fark nedir? Neden biri diğerinin üzerinde kullanılıyor?

Yanıtlar:


304

Uzun zaman önce ikisi arasındaki farkı açıklamak için harika bir benzetme okudum. Nerede okuduğumu hatırlamıyorum, bu yüzden maalesef bu fikir için yazara itibar edemem, ancak yine de temel analojiye kendi bilgilerimin çoğunu ekledim. İşte burada:

Akış soketi bir telefon görüşmesi gibidir - bir taraf aramayı yerleştirir, diğer taraf cevaplar, birbirinize merhaba dersiniz (TCP'de SYN / ACK) ve sonra bilgi alışverişi yaparsınız. İşiniz bittiğinde, veda edersiniz (TCP'de FIN / ACK). Bir taraf bir veda duymazsa, bu beklenmedik bir olay olduğu için genellikle diğerini geri arayacaktır; genellikle istemci sunucuya yeniden bağlanır. Verilerin gönderdiğinizden farklı bir sırayla ulaşmayacağına dair bir garanti ve verilerin zarar görmeyeceğine dair makul bir garanti vardır.

Bir datagram soketi, sınıftaki bir notu iletmek gibidir. Notu ilettiğiniz kişinin hemen yanında olmadığınız durumu düşünün; not kişiden kişiye seyahat edecektir. Hedefine ulaşmayabilir ve oraya vardığında değiştirilebilir. Aynı kişiye iki not iletirseniz, istemediğiniz bir sırada gelebilir, çünkü notların sınıfta izlediği yol aynı olmayabilir, bir kişi bir notu bir başkası kadar hızlı geçmeyebilir, vb. .

Dolayısıyla, sırayla ve bozulmamış bilgiye sahip olduğunuzda bir akım soketi kullanırsınız. Dosya aktarım protokolleri burada iyi bir örnektir. İçeriği rastgele karıştırılmış ve hasar görmüş bazı dosyaları indirmek istemezsiniz!

Sipariş, zamanında teslimattan daha az önemli olduğunda (VoIP veya oyun protokollerini düşünün), bir akışın daha yüksek ek yükünü istemediğinizde (bu, DNS'nin öncelikle bir datagram protokolü olmasının nedeni budur, böylece sunucular Çok sayıda isteğe aynı anda çok hızlı yanıt verin) veya verilerin hedefine ulaşıp ulaşmadığını çok fazla önemsemediğinizde.

VoIP / oyun durumunu genişletmek için, bu tür protokoller kendi veri sıralama mekanizmalarını içerir. Ancak bir paket hasar görürse veya kaybolursa, yeniden gönderme isteği göndermek için akış protokolünde (genellikle TCP) beklemek istemezsiniz - hızlı bir şekilde kurtarmanız gerekir. TCP'nin kurtarılması birkaç dakika sürebilir ve oyun veya VoIP gibi gerçek zamanlı protokoller için üç saniye bile kabul edilemez olabilir! UDP gibi bir veri birimi protokolünün kullanılması, yazılımın bu tür bir olaydan son derece hızlı bir şekilde, kaybolan verileri görmezden gelerek veya TCP'den daha erken yeniden talep ederek kurtarmasını sağlar.

VoIP, kayıp verileri basitçe görmezden gelmek için iyi bir adaydır - bir taraf, zayıf bir sinyal aldığında cep telefonundan biriyle konuşurken olduğu gibi, sadece kısa bir boşluk duyacaktır. Oyun protokolleri genellikle biraz daha karmaşıktır, ancak alınan eylemler genellikle ya eksik verileri göz ardı etmek (daha sonra alınan veriler kaybolan verilerin yerini alıyorsa), eksik verileri yeniden talep etmek veya tam bir durum güncellemesi talep etmek olacaktır. istemcinin durumunun sunucunun durumuyla uyumlu olduğundan emin olun.


3
SYNACK ayrıntılarını dahil etmek için mükemmel.
LazerSharks

2
Bu örnek veya çok benzer bir örnek Linux Programlama Arayüzü'ndendir. 2010 baskısı 1155 ve 1159 sayfalarında bu örnekleri içerir.
Josh

30

Akış Soketi:

  • Sunucu ve istemci arasında özel ve uçtan uca kanal.
  • Veri aktarımı için TCP protokolünü kullanın.
  • Güvenilir ve Kayıpsız.
  • Benzer sırayla gönderilen / alınan veriler.
  • Kayıp / hatalı verileri kurtarmak için uzun süre

Datagram Soketi:

  • Sunucu ile istemci arasında özel ve uçtan uca kanal yok.
  • Veri iletimi için UDP kullanın.
  • % 100 güvenilir değildir ve veri kaybedebilir.
  • Gönderilen / alınan veriler aynı olmayabilir.
  • Kaybolan / hatalı verilerin kurtarılmasını umursamayın veya hızlıca kurtarmayın.

Veriler aynı sırada gönderilmiyor mu (yalnızca "benzer" değil)? yani. Bir dere prizine bir paket sipariş mekanizması oluşturmak için mantıklı olmaz
Matthew D. Scholefield

Bir akış iletişimindeki paketler, paketlerin kendilerinin sırayla alıcı ana bilgisayara teslim edilmeleri garanti edilmemesi anlamında "benzer" sırada gönderilir ve alınır, ancak TCP, paketleri ulaştıkça yeniden düzenleyerek ve herhangi bir şey talep ederek tutarsızlıkları çözer. bu yol boyunca kaybolmuş gibi görünüyor.
Alejandro Blasco

Mantıklı. Belki bunu bir fark olarak kaldırın ve altına koyun (çünkü doğru anlıyorsam, yalnızca paketlerin gönderildiği sıraya atıfta bulunurken, her iki durumda da verilerin gönderildiği / alındığı sıra olmayabilir aynısı).
Matthew D.Scholefield

@Rick Daha doğrusu, soketler uçtan uca noktalar olarak bilinir, çünkü taşıma protokolleri mesajları bir veya birden fazla ağ uç noktasına iletmekten sorumludur.
Alejandro Blasco

0

Ağ programlamasıysa soketlerden başlamak iyi bir başlangıç ​​olur.
soket = ip + bağlantı noktası
üç tür soket
akışı vardır (TCP, sipariş ve teslimat garantili, çoğaltma yok, veri için uzunluk veya karakter sınırı yok, bağlantı odaklı, güvenilir, eşzamanlılık)
datagram (UDP, paket tabanlı, bağlantısız, datagram boyut sınırı, veriler kaybolabilir veya çoğaltılabilir, sipariş garanti edilmez, güvenilir değil)
ham (alt katman protokollerine doğrudan erişim IP, ICMP)
Hangi soketin hangi taşıma protokolünü kullanması gerektiğine ilişkin taşıma protokolü türü için herhangi bir katı kural görmüyorum ve güvenilirlik yanılmamalıdır çünkü her iki ucun da aktif olması durumunda UDP güvenilirdir.
Güvenilirlik, UDP'de bulunmayan aktarım protokolü olarak TCP'yi kullanarak sıra numarası kontrolleri olduğundan daha benzer bir teslimat güvenilirliği anlamına gelir. Wireshark tcpdump vb. Gibi ağ protokolü analizörünü kullanmak, yazılımınızın tam olarak ne yaptığını görmek için daha iyidir; Çalışmanız çalışırken kağıt üzerinde bir tür doğrulama veya birleştirme teorisi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.