Bu da ne? İki tür Internet soketi mi var? Evet. Şey, aslında hayır.
Yalan söyledim. Daha çok var ama sizi korkutmak istemedim. Size sadece iki
tür soketten bahsedeceğim. Sadece "Ham Soketler"in (Raw Sockets) çok güçlü
olduğunu belirttiğim bu cümle dışında yani, bir ara bunlara da göz atarsanız
iyi olur.
Pekala, gelelim şu iki tür sokete. Bir tanesi "Veri Akış Soketleri";
diğeri ise "Veri Paketi Soketleri" ve artık biz bunlara sırası ile
"
SOCK_STREAM" ve "
SOCK_DGRAM"
diyeceğiz. Veri paketi soketleri bazen "bağlantısız soketler" olarak da
isimlendirilir. (Her ne kadar eğer isterseniz bunlara
connect()
işlevi ile bağlanabilecek olsanız da. Detaylı bilgi için aşağıdaki
connect() maddesine bakın.)
Veri akış soketleri güvenilir iki yönlü iletişim kanallarıdır. Eğer bu
tür bir sokete sıra ile "1, 2" bilgilerini gönderirseniz, bunlar kanalın
diğer ucundan "1, 2" şeklinde çıkar. Aynı zamanda bu iletişim olası
hatalara karşı da korumalıdır. Karşılaşacağınız her türlü hatanın kaynağı
sizin karman çorman aklınız olacaktır ve burada bunları tartışmaya niyetim
yok.
Stream soketleri gerçek hayatta ne işimize yarar? Hmm, sanırım
telnet diye bir program duymuşsunuzdur, değil mi? İşte
bu program veri akış soketlerini kullanır. Yazdığınız tüm karakterler
sizin yazdığınız sırada iletilmelidir öyle değil mi? Aynı zamanda web
tarayıcılar da HTTP protokolü ile iletişim kurarken veri akış soketleri
aracılığı ile sayfa bilgilerini çekerler. Gerçekten de eğer bir web
sitesine telnet ile 80 numaralı port üzerinden
bağlanır ve "GET /" komutunu yollarsanız web sitesi
size HTML içeriğini yollayacaktır.
Veri akış soketleri bu kadar sorunsuz bir veri iletişimini nasıl
gerçekleştirir? Bunun için "Aktarım Denetim Protokolü" (Transmission
Control Protocol) isimli kurallar dizisinden yararlanırlar ki siz
bunu "TCP" olarak da duymuş olabilirsiniz (bkz.
RFC-793 bu belge TCP ile ilgili çok
ayrıntılı bilgi içerir.) TCP yollanan verinin sıralı ve düzgün gitmesini
sağlar. "TCP"yi daha önce "TCP/IP" kısaltmasının bir parçası olarak
duymuş olabilirsiniz ki "IP" de "Internet Protocol" sözünün kısaltmasıdır
(bkz.
RFC-791.) IP kurallar
dizisi temelde Internet yönlendirme ile ilgilidir, veri bütünlüğünün
korunması ile ilgili pek kural içermez.
Harika. Peki veri paketi soketleri? Neden bunlara bağlantısız deniyor?
Mesele nedir kısaca? Neden bunların "güvenilmez" olduğu söyleniyor?
Bakın, bilmeniz gereken bazı gerçekler var: eğer bir veri paketi
yollarsanız bu hedefine ulaşabilir de ulaşmayabilir de. Gönderdiğiniz
sırada ulaşması garanti edilemez. Ancak eğer hedefe ulaşırsa paketin
içerdiği bilgi hatasız olacaktır.
Veri paketi soketleri de yönlendirme için IP protokolünü kullanırlar ancak
TCP'den faydalanmazlar onun yerine "Kullanıcı Veri Paketi Protokokü" (User
Datagram Protocol) veya "UDP" isimli protokolü kullanırlar (bkz.
RFC-768.)
Neden bağlantısızdırlar? Aslında böyledirler çünkü veri akış soketlerinde
olduğu gibi bağlantıyı sürekli açık tutmanız gerekmemektedir. Sadece bir
paketi oluşturur, tepesine gideceği adresi söyleyen bir IP başlığı yapıştırır
ve onu yollarsınız. Herhangi bir bağlantı açmaya gerek yoktur. Bu tip
soketler genellikle paket paket iletilen veri için kullanılır. Bu tip
soketleri kullanan örnek uygulamalardan bazıları: tftp,
bootp, vs.
"Yeter artık!" diye bağırdığınızı duyar gibiyim. "Eğer veri paketlerinin
yolda kaybolma ihtimali varsa nasıl olur da yukarıda saydığın programlar
çalışır?!" Bak dünyalı dostum bu saydığım programların hepsi UDP protokolü
üzerine kendi protokollerini yerleştirirler. Mesela, tftp
protokolüne göre gönderilen her paket için karşı tarafın "aldım!"
(bir "ACK" paketi) paketini geri yollaması gerekir. Eğer orjinal paketin
göndericisi mesela 5 saniye içinde cevap alamazsa o zaman paketi yeniden
yollar, taa ki ACK cevabını alana kadar. İşte bu "aldım" prosedürü
SOCK_DGRAM uygulamalarında çok önemlidir.