Konak Adresleri
Önceki İnternet İsim Alanı Sonraki
Konak Adresleri
İnternetteki her bilgisayarın, o bilgisayarı internetteki diğer bilgisayarlardan ayıran ve tanımlayan numaralardan oluşan bir veya daha fazla internet adresi vardır. Kullanıcılar genellikle IPv4 numaralı konak adreslerini, 128.52.46.32 gibi noktalarla ayrılmış dört numaralı bir dizi olarak yazarlar. IPv6 numaralı konak adreslerini ise 5f03:1200:836f:c100::1 gibi iki nokta üst üste ile ayrılmış en fazla sekiz bölümden oluşan onaltılık numaralarla yazarlar.
Her bilgisayarın ayrıca, noktalarla ayrılmış kelimelerden oluşan mescaline.gnu.org gibi bir veya birden fazla konak ismi vardır.
Kullanıcıların konak adreslerini belirtmelerine olanak sağlayan yazılımlar genellikle hem numaralı adresi hem de konak ismini kabul eder. Bir bağlantı açmak için yazılım numaralı bir adrese ihtiyaç duyar ve bu nedenle konak ismini karşılık gelen numaralı adrese çevirmek zorundadır.
Kısaca Konak Adresleri
IPv4 İnternet konak adresi dört baytlık veri tutan bir numaradır. Tarihsel olarak bakıldığında bunlar iki kısma ayrılır, bir ağ numarası ve o ağ içerisindeki bir yerel ağ adresi. 1990'ların ortasında ortaya çıkan sınıfsız adresler bu yaklaşımı değiştirdi. Bazı işlevler içlerinde eski tanımları aradıkları için, biz öncelikle sınıf tabanlı ağları, sonra da sınıfsız adresleri anlatacağız. IPv6 sadece sınıfsız adresleri kullanır, bu nedenle aşağıdaki paragraflar IPv6 adreslerine uygulanmaz.
Sınıf tabanlı IPv4 ağ numaraları ilk bir, iki veya üç bayttan oluşur; geriye kalan baytlar yerel adreslerdir.
IPv4 ağ numaraları Ağ Bilgi Merkezi (NIC - Network Information Center) denilen merkeze kayıtlıdır ve A, B, C adında üç sınıfa bölünmüşlerdir. Yerel ağdaki makinelerin yerel ağ adres numaraları o bu merkezce değil, ağın yöneticisi tarafından kaydedilir.
A sınıfı ağların 0 ile 127 arasında değişen tek baytlık bir ağ numarası vardır. Az sayıda A sınıfı ağ vardır, fakat herbiri devasa boyutlarda konak sayısına sahiptir. Orta ölçekli B sınıfı ağların ilk baytı 128'den 191'e kadar olan iki baytlık ağ numaraları vardır. C sınıfı ağlar en küçükleridir; ilk baytı 192 ile 255 arasında olan üç baytlık ağ numaraları vardır. Bu nedenle İnternet adresinin ilk bir, iki veya üç baytı ağı belirtir. İnternet adresinin kalan baytları da o ağ içerisindeki adresini belirtir.
A sınıfı ağdaki 0 bütün ağlara yayın için ayrılmıştır. Ek olarak, her ağdaki 0 numaralı konak adresi ağ içerisindeki bütün konaklara yayın için ayrılmıştır. Bu kullanımlar günümüzde kullanılmamaktadır fakat uyumluluk nedeniyle 0 numaralı ağı ve 0 numaralı konak numarasını kullanmamalısınız.
A sınıfı ağdaki 127 geridönüş (loopback) arabirimi için ayrılmıştır; 127.0.0.1 adresini konak makine için kullanabilirsiniz.
Bir makine birden fazla ağın üyesi olabileceği için birden fazla ağ konak adresine sahip olabilir. Fakat, bir adres hiç bir zaman birden fazla makineyi belirtemez.
İnternet adresleri için standart noktalı gösterimde dört numaralama biçimi vardır:
a.b.c.d
Bu adresin dört baytlık kısmının tamamını tanımlar ve genelde kullanılan gösterim şeklidir.
a.b.c
Adresin son kısmı, c, 2 baytlık bir büyüklük olarak yorumlanır. Bu a.b ağ adres numaralı B sınıfı bir ağdaki konak adreslerinin belirtilmesi için kullanışlıdır.
a.b
Adresin son kısmı, b, 3 baytlık bir büyüklük olarak yorumlanır. Bu a ağ adres numaralı A sınıfı bir ağdaki konak adreslerinin belirtilmesi için kullanışlıdır.
a
Eğer sadece tek parça verilirse, bu doğrudan konak adres numarasına karşılıktır.
Adresin her kısmında, tabanı tanımlamak için alışıldık C kabulleri uygulanır. Diğer bir deyişle, sayının, başında 0x veya 0X varsa onaltılık tabanda, 0 varsa sekizlik tabanda; diğer durumlarda onluk tabanda olduğu kabul edilir.
Sınıfsız Adresler
IPv4 adreslerini (ve IPv6 adreslerini) şimdi sınıfsız olarak düşünürsek; A, B ve C sınıfları arasındaki farkları görmezden gelebiliriz. Bir IPv4 konak adresi 32 bitlik adres ve 32 bitlik maskeden oluşmaktadır. Maske ağ kısmı için birler ve konak kısmı için sıfırlar içerir. Ağ kısmı soldan itibaren birlerle, kalanı da konağı gösteren sıfırlardan oluşur. Sonuç olarak, ağ maskesi (netmask) sadece bir bitleriyle belirtilebilir. A, B ve C sınıfları bu kuralın sadece özel durumlarıdır. Örneğin, A sınıfı adreslerinin ağ maskesi 255.0.0.0'dır veya 8 uzunluğunda önekleri vardır.
Sınıfsız IPv4 ağ adresleri, noktalı gösterimin sonuna bir bölü ayracıyla eklenmiş önek uzunluğu biçiminde yazılır. Örneğin 10 numaralı A sınıfı ağı 10.0.0.0/8 olarak yazılır.
IPv6 Adresleri
IPv6 adresleri 128 bitlik veri içerir (IPv4 32 bit içerir). Bir konak adresi genelde iki nokta üst üste (:) ile ayrılmış sekiz adet 16 bitlik onaltılık sayı olarak yazılır. Ardarda gelen sıfırları kısaltmak için iki adet iki nokta üst üste (:) yan yana konulur. Örneğin, IPv6 geridönüş adresi 0:0:0:0:0:0:0:1, sadece ::1 şeklinde yazılabilir.
Konak Adresinin Veri Türü
IPv4 İnternet konak adresleri bazı yaklaşımlarda (uint32_t türünde) tamsayı değerler olarak gösterilir. Diğer yaklaşımlarda tamsayı struct in_addr türünde bir yapı içerisine paketlenir. Kullanımın tutarlı olması daha iyi olurdu ancak tamsayı değerini yapıdan çıkarmak veya yapı içerisine sokmak zordur.
IPv4 İnternet konak adresleri için uint32_t veya struct in_addr kullanmak yerine unsigned long int kullanan eski kodlar bulabilirsiniz. Eskiden unsigned long int 32 bitlik numaraydı fakat 64 bitlik makinelerle birlikte bu değişti. unsigned long int türünün 32 bit olmadığı makinelerde bu veri türü kodun çalışmamasına neden olabilir. uint32_t türü Unix98 tarafından tanımlanmış ve 32 bit olması garanti edilmiştir.
IPv6 İnternet konak adresleri 128 bittir ve struct in6_addr yapısı içerisinde paketlenmişlerdir.
Aşağıdaki İnternet adreslerinin temel tanımları netinet/in.h başlık dosyasında tanımlanmıştır:
struct in_addr
veri türü
Bu veri türü, IPv4 İnternet konak adresini tutmak için kullanılmaktadır. Konak adres numarasını uint32_t olarak kaydeden s_addr adında sadece bir alana sahiptir.
uint32_t INADDR_LOOPBACK
makro
Makinenin gerçek adresini bulmak yerine bu sabiti "makinenin adresi" olarak kullanabilirsiniz. Bu genellikle localhost olarak çağrılır ve IPv4 İnternet adresi 127.0.0.1'dir. Bu özel sabit kendi makinenizin adresini bulma çilesinden sizi kurtarır. Ayrıca, özellikle, makinenin kendisiyle konuşması durumunda herhangi bir ağ trafiğinden kaçınmak için sistem INADDR_LOOPBACK'i kullanır.
uint32_t INADDR_ANY
makro
Bu sabiti adres verilmesi sırasında "gelen herhangi bir adres" yerine kullanabilirsiniz. Bkz. Adreslerin Atanması. Bu, İnternet bağlantılarını kabul etmek istediğinizde struct sockaddr_in yapısının sin_addr üyesine vereceğiniz adres olarak kullanışlıdır.
uint32_t INADDR_BROADCAST
makro
Bu sabit bir yayın iletisi göndermek için kullanacağınız adrestir.
uint32_t INADDR_NONE
makro
Bu sabit bazı işlevler tarafından hata olarak döndürülür.
struct in6_addr
veri türü
Bu veri türü bir IPv6 adresi tutmak için kullanılır. Çeşitli yollarla (bir birleşik yapı üzerinden) erişilebilir 128 bitlik veri tutar.
struct in6_addr in6addr_loopback
sabit
Bu sabit IPv6 ::1 geridönüş adresidir. Bunun ne anlama geldiğini öğrenmek için yukarıya bakınız. IN6ADDR_LOOPBACK_INIT makrosu kendi değişkenlerinize bu değeri verebilmeniz için sağlanmıştır.
struct in6_addrin6addr_any
sabit
Bu sabit IPv6 :: belirtilmemiş adresidir. Bunun ne anlama geldiğini öğrenmek için yukarıya bakınız. IN6ADDR_ANY_INIT makrosu kendi değişkenlerinize bu değeri verebilmeniz için sağlanmıştır.
Konak Adresi İşlevleri
İnternet adreslerini işlemek için kullanılan bu ek işlevler arpa/inet.h başlık dosyasında tanımlıdır. Bunlar İnternet adreslerini ağ bayt sırasında, ağ numaraları ve ağ içi yerel adres numaralarını da konak bayt sırasında göstermektedir. Ağ ve konak bayt sırası ile ilgili açıklamayı Bayt Sırası Dönüşümü bölümünde bulabilirsiniz.
int inet_aton
(const char     *isim,
 struct in_addr *adres)
işlev
Bu işlev isim IPv4 İnternet konak adresini standart noktalı gösterimden ikilik veriye dönüştürür ve adres'in gösterdiği struct in_addr içinde saklar. Eğer adres geçerli ise inet_aton sıfırdan farklı bir değer, aksi takdirde sıfır döndürür.
uint32_t inet_addr
(const char *isim)
işlev
Bu işlev isim isimli IPv4 İnternet konak adresini standart noktalı gösterim şeklinden ikilik veriye dönüştürür. Eğer girdi geçerli değilse, inet_addr işlevi INADDR_NONE döndürür. Bu yukarıda anlatıldığı gibi inet_aton için atıl bir arayüzdür. Atıl olmasının nedeni INADDR_NONE adresinin (255.255.255.255) geçerli bir adres olmasıdır ve inet_aton işlevinin hata döndürmek için daha temiz bir yol sunmasıdır.
uint32_t inet_network
(const char *isim)
işlev
Bu işlev, standart noktalı gösterim şeklinde verilen isim adresinden ağ numarasını elde eder. Döndürülen adres konak bayt sırasındadır. Eğer girdi geçerli değilse, inet_network işlevi -1 değerini döndürür.
İşlev sadece geleneksel IPv4 A, B ve C sınıfı ağ türleri ile çalışır. Sınıfsız adreslerle çalışmaz ve bu şekilde kullanılmamalıdır.
char *inet_ntoa
(struct in_addr adres)
işlev
Bu işlev adres IPv4 İnternet konak adresini standart noktalı gösterim şeklinde bir dizgeye dönüştürür. Dönüş değeri durağan olarak ayrılmış tampona bir göstericidir. İşlevin sonraki çağrılarında aynı tampon üzerine yazılacağından, yazılan değer kaydedileceğinden değerin kopyalanması gerekir.
Çok evreli (multi-threaded) yazılımlarda her evrenin kendi durağan olarak ayrılmış tamponu vardır. Fakat hala inet_ntoa'nın sonraki çağrılarında aynı evre son çağrıdaki sonucun üzerine yazar.
inet_ntoa yerine yeni bir işlev olan inet_ntop kullanılmalıdır, çünkü bu hem IPv4 hem de IPv6 adreslerini desteklemektedir.
struct in_addr inet_makeaddr
(uint32_t ,
 uint32_t yerel)
işlev
Bu işlev ağ numarası ile ağ içindeki yerel yerel adres numarası değerlerini birleştirerek bir IPv4 İnternet konak adresi yapar.
uint32_t inet_lnaof
(struct in_addr adres)
işlev
Bu işlev adres İnternet konak adresinin ağ içindeki yerel adres kısmını döndür.
İşlev sadece geleneksel IPv4 A, B ve C sınıfı ağ türleri ile çalışır. Sınıfsız adreslerle çalışmaz ve bu şekilde kullanılmamalıdır.
uint32_t inet_netof
(struct in_addr adres)
işlev
Bu işlev adres İnternet konak adresinin ağ numarası kısmını döndürür.
İşlev sadece geleneksel IPv4 A, B ve C sınıfı ağ türleri ile çalışır. Sınıfsız adreslerle çalışmaz ve bu şekilde kullanılmamalıdır.
int inet_pton
(int         biçim,
 const char *adres,
 void       *tampon)
işlev
Bu işlev bir İnternet adresini metin gösteriminden ağ biçimine (ikilik) dönüştürür. biçim dönüştürüleceği adres türünü belirtmek üzere AF_INET veya AF_INET6 olmalıdır. adres girilen dizgeye bir göstericidir ve tampon sonuç için kullanılan tampona göstericidir. Tamponun yeterli büyüklükte olmasını işlevi çağıran sağlamalıdır.
const char *inet_ntop
(int         biçim,
 const void *adres,
 char       *tampon,
 size_t      uzunluk)
işlev
Bu işlev bir İnternet adresini ağ biçiminden (ikilik), metin gösterimine dönüştürür. biçim dönüştürülecek adres türünü belirtmek üzere AF_INET veya AF_INET6 olmalıdır. adres çevrilecek adrese bir göstericidir. tampon sonuç için kullanılan tampona göstericidir ve uzunluk bu tamponun uzunluğudur. İşlevden dönecek değer tamponun adresi olacaktır.
Konak İsimleri
İnternet adresleri için standart noktalı gösterime ek olarak bir konağa ulaşmak için sembolik isim de kullanılabilir. Sembolik ismin yararı akılda kalmasının kolay oluşudur. Örneğin, İnternet adresi 158.121.106.19 olan bir makine alpha.gnu.org şeklinde de bilinir; ve gnu.org etki alanındaki diğer makineler ona sadece alpha ile erişebilir.
Arka planda, sistem, konak isimlerini konak numaralarına eşleyerek bunların kayıtlarını tutabileceği bir veritabanı kullanır. Bu veritabanı genellikle /etc/hosts dosyası veya bir isim sunucusunun sunduğu eşdeğeridir. Veritabanına erişim için kullanılan işlev ve sembol tanımları netdb.h içerisindedir. netdb.h dosya olarak içerilirse, BSD'nin özellikleri de tümüyle gelir.
struct hostent
veri türü
Bu veri türü konak veritabanındaki bir girdinin gösterimi için kullanılmıştır. Aşağıdaki üyelere sahiptir:
char *h_name
Bu konağın "resmi" adıdır.
char **h_aliases
Bunlar konağın diğer adlarıdır, boş karakter sonlandırmalı dizgeler dizisi olarak gösterilmişlerdir.
int h_addrtype
Bu konak adres tiürüdür; pratikte, değeri her zaman AF_INET veya IPv6 konakları için kullanıldıklarında AF_INET6'dır. Prensipte diğer türde adresler veritabanında İnternet adresleri olarak gösterilebilirler; eğer bu yapılırsa, bu alanda AF_INET veya AF_INET6'dan farklı bir değer görebilirsiniz. Bkz. Soket Adresleri.
int h_length
Bu her adresin bayt olarak uzunluğudur.
char **h_addr_list
Bu konak adres dizgeleri dizisidir. (Hatırlatma: bir konak birden fazla ağa bağlı olabilir ve her biri için farklı adrese sahip olabilir.) Dizi bir boş gösterici ile sonlandırılır.
char *h_addr
Bu h_addr_list[0] ile aynıdır; diğer bir deyişle, ilk konak adresidir.
Konak veritabanı düşünülüğünde, her adres sadece h_length bayt uzunluğunda bir bellek bloğundan ibarettir. Fakat diğer yaklaşımlarda IPv4 adreslerin bir struct in_addr veya bir uint32_t şekline dönüştürülebileceği şeklinde bir iç varsayım vardır. struct hostent yapısındaki konak adresleri her zaman ağ bayt sırasında verilmiştir; bilgi için Bayt Sırası Dönüşümü bölümüne bakınız.
Konak veritabanında arama yaparak belirli bir konak hakkında bilgi almak için gethostbyname, gethostbyname2 veya gethostbyaddr işlevlerini kullanabilirsiniz. Bilgi durağan olarak ayrılmış bir yapı içinde döndürülür; çağrılar arasında kaydetmek için bilgiyi kopyalamanız gerekir. Ayrıca, getaddrinfo ve getnameinfo işlevlerini de bu bilgiye ulaşmak için kullanabilirsiniz.
struct hostent *gethostbyname
(const char *isim)
işlev
gethostbyname işlevi isim ile isimlendirilmiş konak hakkında bilgi döndürür. Eğer bulamazsa, bir boş gösterici döndürür.
struct hostent *gethostbyname2
(const char *isim,
 int         biçim)
işlev
gethostbyname2 işlevi gethostbyname gibidir, fakat çağırıcıya sonuç için istediği adres ailesini (örneğin AF_INET veya AF_INET6) belirtme imkanı sunar.
struct hostent *gethostbyaddr
(const char *adres,
 size_t      uzunluk,
 int         biçim)
işlev
gethostbyaddr işlevi adres İnternet adresine sahip konak hakkında bilgi döndürür. adres parametresi aslında bir karaktere gösterici değildir - bu IPv4 veya IPv6 adresine gösterici olabilir. uzunluk argümanı adres adresinin (bayt cinsinden) boyutudur. biçim adres biçimini belirtir; bir IPv4 İnternet adresi için, AF_INET değerini belirtiniz; bir IPv6 İnternet adresi için, AF_INET6 kullanınız.
Eğer bulamazsa, gethostbyaddr boş gösterici döndürür.
Eğer gethostbyname veya gethostbyaddr ile isim sorgulama yapılamazsa, sebebini h_errno değişkeninin değerine bakarak bulabilirsiniz. (Bu işlevler için errno değerini değiştirmek daha temiz bir çözüm olurdu, ancak h_errno kullanımı diğer sistemlerle de uyumludur.)
Burada h_errno için karşılaşabileceğiniz hata kodlarını görüyoruz:
HOST_NOT_FOUND
Veritabanında böyle bir konak yok.
TRY_AGAIN
Bu durum isim sunucusu ile bağlantı kurulamadığında gerçekleşir. Eğer tekrar denerseniz, başarabilirsiniz.
NO_RECOVERY
Geri dönülemez bir hata oluştu.
NO_ADDRESS
Konak veritabanı isim için bir girdi içeriyor, fakat buna ilişkin bir İnternet adresi yok.
Yukarıdaki arama işlevlerinin ortak özellikleri: hiçbiri evresel (reentrant) işlevler değildir ve çok evreli uygulamalarda kullanılamazlar. Bu nedenle GNU C kütüphanesi bu bağlamda bir grup yeni işlev sunmaktadır.
int gethostbyname_r
(const char *restrict      isim,
 struct hostent *restrict  sonuç_tamponu,
 char *restrict            tampon,
 size_t                    tampon_uzunluğu,
 struct hostent **restrict sonuç,
 int *restrict             hatanum)
işlev
gethostbyname_r işlevi isim adındaki konak hakında bilgi döndürür. Çağrı sırasında işleve sonuç_tamponu parametresi ile struct hostent türünde bir nesneye gösterici aktarılmalıdır. Ek olarak işlev fazladan bir tampon alanına ihtiyaç duyabildiğinden çağrı sırasında işleve tampona bir gösterici tampon ile ve tamponun uzunluğu da tampon_uzunluğu ile aktarılmalıdır.
Sonucun tutulduğu tampona gösterici, başarılı bir işlev çağrısından sonra döndürülen *sonuç içinde bulunmaktadır. Eğer bir hata oluşur veya girdi bulunamazsa *sonuç göstericisi bir boş göstericidir. Başarı sıfır dönüş değeri ile belirtilir. Eğer işlev çalışmazsa dönüş değeri bir hata numarasıdır. gethostbyname için tanımlanan hatalara ek olarak bu ERANGEde olabilir. Bu durumda çağrı daha büyük bir tampon ile tekrarlanmalıdır. İlave hata bilgisi global değişken h_errno'da değil hatanum ile gösterilen nesnede saklanır.
Burada küçük bir örnek görüyoruz:
struct hostent *
gethostname (char *host)
{
  struct hostent hostbuf, *hp;
  size_t hstbuflen;
  char *tmphstbuf;
  int res;
  int herr;

  hstbuflen = 1024;
  /* Tamponu ayıralım, ama daha sonra bellek kaçağına
     neden olmamak için serbest bırakmayı unutmayalım.  */
  tmphstbuf = malloc (hstbuflen);

  while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen,
                                &hp, &herr)) == ERANGE)
    {
      /* Tamponu büyütelim.  */
      hstbuflen *= 2;
      tmphstbuf = realloc (tmphstbuf, hstbuflen);
    }
  /*  Hata var mı, bakalım.  */
  if (res || hp == NULL)
    return NULL;
  return hp;
}
int gethostbyname2_r
(const char               *isim,
 int                       biçim,
 struct hostent *restrict  sonuç_tamponu,
 char *restrict            tampon,
 size_t                    tampon_uzunluğu,
 struct hostent **restrict sonuç,
 int *restrict             hatanum)
işlev
gethostbyname2_r işlevi gethostbyname_r gibidir, fakat çağrı sırasında sonuç için istenen adres biçimini (örneğin AF_INET veya AF_INET6) belirtme imkanı sunar.
int gethostbyaddr_r
(const char               *adres,
 size_t                    uzunluk,
 int                       biçim,
 struct hostent *restrict  sonuç_tamponu,
 char *restrict            tampon,
 size_t                    tampon_uzunluğu,
 struct hostent **restrict sonuç,
 int *restrict             hatanum)
işlev
gethostbyaddr_r işlevi adres İnternet adresine sahip konak hakkında bilgi döndürür. adres parametresi aslında bir karaktere gösterici değildir - bu IPv4 veya IPv6 adresine gösterici olabilir. uzunluk argümanı adres adresinin (bayt cinsinden) boyutudur. biçim adres biçimini belirtir; bir IPv4 İnternet adresi için, bir AF_INET değeri belirtiniz; bir IPv6 İnternet adresi için, AF_INET6 kullanınız.
gethostbyname_r işlevine benzer olarak, çağırıcı, sonuç için gerekli tampon bölgeyi ve iç kullanım için gerekli belleği ayarlamak zorundadır. Başarı halinde işlev sıfır döndürür. Aksi takdirde değer bir hata numarasıdır ve burada ERANGE çağırıcının-sunduğu tamponun yeterli olmadığını belirten özel bir anlama sahiptir.
sethostent, gethostent ve endhostent kullanarak bütün konak veritabanını bir girdi için tarayabilirsiniz. Bu işlevleri kullanırken dikkatli olunuz, çünkü bunlar evresel (reentrant) işlevler değildirler.
void sethostent
(int açıkkal)
işlev
Bu işlev konak veritabanını tarama yapmak için açar. Bu işlev çağrısının ardından girdileri okumak için gethostent çağırabilirsiniz.
Eğer açıkkal argümanı sıfır değise, bu bir bayrağı kaldırarak gethostbyname veya gethostbyaddr işlevlerine yapılan çağrılarda veritabanının kapanmamasını sağlar (normalde olması gerektiği gibi). Bu yaklaşım işlevlerin sık çağırılması durumunda veritabanının her çağrıda tekrardan açılmasından kurtararak verimi artırır.
struct hostent *gethostent
(void)
işlev
Bu işlev konak veritabanındaki sıradaki girdiyi döndürür. Eğer başka girdi yoksa boş gösterici döndürür.
void endhostent
(void)
işlev
Bu işlev konak veritabanını kapatır.
Önceki Üst Ana Başlık Sonraki
İnternet Soket Adreslerinin Biçimleri Başlangıç İnternet Portları
Bir Linux Kitaplığı Sayfası