Yanıtlar:
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.
Akış Soketi:
Datagram Soketi:
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.