Ana içeriğe geç

Bölüm 20:Ağ Arayüz Kartı

9 dakikalık okumaGüncelleme:

Ağlar'a “Sen”i Katmak yazısının parçası: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine kadar inen uzun bir teknik yolculuk.

Tüm bölümler
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. Önbellek, Tazelik ve Güven
  6. Port Numarası ve Soket
  7. Bağlantısız Taşıma: UDP
  8. Üç Adımlı El Sıkışma
  9. Simetrik Şifreleme
  10. Açık Anahtarlı Kriptografi
  11. TLS El Sıkışması
  12. Sertifika Zinciri
  13. HTTP Mesajının Anatomisi
  14. Durum, Çerez ve Oturum
  15. HTTP/2'den HTTP/3'e
  16. İçerik Dağıtım Ağları
  17. Diğer Uygulama Protokolleri
  18. Katmanlı Mimari
  19. Kapsülleme ve Başlıklar
  20. Paket Yakalama ve Çözümleme
  21. Ağ Arayüz Kartı
  22. Fiziksel Adresleme
  23. Hata Sezme ve CRC
  24. Adres Çözümleme: ARP
  25. Anahtarlama ve Ortam Erişimi
  26. Ağ Topolojileri
  27. Sanal Yerel Ağlar
  28. Kablosuz Erişim: 802.11
  29. Radyo Kanalı ve Kapasite
  30. Kablosuz Ağ Güvenliği
  31. Hücresel Ağlar
  32. Spektrum ve Kuşaklar
  33. Hareketlilik ve Aktarma
  34. Adres Kiralama: DHCP
  35. Adresin Anatomisi
  36. Adres Tükenmesi ve IPv6
  37. Yönlendirici Mimarisi
  38. Kuyruk Yönetimi
  39. Cihaz Yapılandırma
  40. Yönlendirme Protokolleri
  41. Kontrol Düzlemi ve SDN
  42. Ağ İzleme ve Yönetimi
  43. Alanlar Arası Yönlendirme
  44. Adres Çevirisi
  45. Ara Kutular
  46. Tünelleme ve IPsec
  47. Güvenlik Duvarları
  48. Operatör ve Metro Ağları
  49. Bitten Sinyale
  50. Çoklama Teknikleri
  51. İletim Ortamları
  52. Kablo Sonlandırma
  53. Fiber Optik İletim
  54. Bakır Erişim Ağı: DSL
  55. Pasif Optik Ağlar
  56. Kablo Erişim Ağları
  57. Denizaltı Kabloları
  58. Veri Merkezi Ağları
  59. Kapsülleme Çözme
  60. Güvenilir Aktarım
  61. Tıkanıklık Denetimi
  62. Trafik Çözümleme
  63. Gecikme Bütçesi
  64. Son Söz

Yakalama arayüzünde her satırı bayt bayt sayıp zarfları tek tek gördün. Çerçeveyi tele koyacak şeyi ise henüz adlandırmadım.

O şey bir program değil. Kablonun ucundaki ağ kartı, kendi işlemcisiyle çalışan ayrı bir bilgisayar. Peki bu kartın sınırı tam olarak nerede başlıyor?

Kart tam olarak nerede duruyor?

Ağ kartı, bilgisayarı ağa fiziksel olarak bağlayan parça. Türkçe adını ağ arayüz kartı olarak göreceksin; kimi kaynakta ağ adaptörü ya da ağ arayüz denetleyicisi diye de geçiyor. Kısaltması NIC.

Kart makinenin sistem veriyoluna takılıyor ve diğer bileşenlerin gözünde sıradan bir giriş/çıkış aygıtından farkı olmuyor; klasik yuvası da PCI. Ethernet’in ilk günlerinde üstü yongalarla kaplı kocaman bir devre kartı olarak duruyordu. Bugün aynı işi tek bir yongada, ya da daha büyük bir sistem yonganın içindeki bir bölümde bitiriyorlar. Anakarta tümleşiği de var, USB’den takılanı da. Kart yine de tek bir parçadan ibaret değil; donanım, yazılım ve firmware birlikte çalışıyor.

Asıl ayrımı kartın hangi katmanları taşıdığında bulacaksın. Kart ikisini birden gerçekliyor, bağ katmanını ve fiziksel katmanı; üstündeki her şey yazılımda kalıyor. Sınırın çipte olduğunu söylemiştim, ama orada adını vermediğim bir şey vardı: bu iki katman arasındaki iç arayüz.

Soket four-tuple’ını kurarken çekirdeğin altında ne olduğunu kapalı kutu bırakmıştım. Kutuyu şimdi açıyorum. Soket katmanını kullanıcı alanı ile çekirdek alanının tam sınırında buluyorsun. Altında TCP ve UDP duruyor, onun altında IP, en altta da fiziksel ağa bakan sürücü.

Çerçeveyi kim kuruyor?

Kartın kalbinde, MAC protokolünü de taşıyan tek bir özel amaçlı denetleyici yonga var. Çerçeveleme, hatta erişim ve hata sezme bu yonganın işi. Üçünü de donanımda yapıyor.

Ucuz bir Ethernet kartının devre kartı: yüzeydeki en büyük kare parça, MAC ile fiziksel katmanı birlikte taşıyan denetleyici yonga. Çerçevelemenin, hatta erişiminin ve hata sezmenin işletim sistemine hiç uğramadan bittiği yer tam olarak orası.

Yonganın içi de ikiye bölünmüş durumda. MAC bölümü çerçeveyle ilgileniyor, fiziksel katman bölümü sinyalle. İşte o iç arayüzün adı hıza göre değişiyor: 100 Mbit/s’te MII, gigabitte GMII, on gigabitte XGMII. Fiziksel katman tarafı kendi içinde ayrıca katmanlı. Orada bir kodlama alt katmanı ile ortama bağlanan ve ortama bağımlı alt katmanlar duruyor.

Çerçeveleme, datagramın önüne başlık arkasına kuyruk eklemek demek. Kapsülleme merdivenini çıkarken bu basamağı dışarıdan, yani başlık ve kuyruk eklenmiş hâliyle görmüştük. Gönderme tarafında denetleyici, üst katmanların ana bellekte hazırlayıp bıraktığı datagramı oradan alıyor ve çerçeveyi kendisi kuruyor.

Ama çerçevelemenin asıl zorluğu ekleme değil, ayırma. Fiziksel katmanın alıcıya verdiği şey kesintisiz bir bit dizisi; içinde nokta, boşluk ya da satır sonu yok. Alıcı bu akışta bir çerçevenin nerede başlayıp nerede bittiğini bilmek zorunda, yoksa elindeki baytların hangisinin adres hangisinin veri olduğunu söyleyemez. Sorunun adı çerçeve sınırlandırma ve tarih boyunca dört ayrı çözümü denendi.

Bayt sayısı. Çerçevenin başına uzunluğu yazarsın, alıcı o kadar bayt sayar. Zarif ama kırılgan: o sayıyı taşıyan bayt bozulursa alıcı sınırı kaçırır ve bir daha asla bulamaz — sonraki bütün çerçeveler kayar. Tek bir bit hatası kalıcı bir hizasızlık üretiyor.

Bayrak baytı ve bayt doldurma. Çerçevenin iki ucuna özel bir bayrak baytı konur. PPP’de bu değer 0x7E. Peki veri içinde aynı bayt geçerse? Gönderen onun önüne bir kaçış baytı (0x7D) ekler ve baytı değiştirir; alıcı kaçışı görünce sonraki baytı ham veri sayar. Kaçış baytının kendisi de kaçırılır. Bedeli değişken: rastgele veride yaklaşık %1 şişme, ama en kötü durumda çerçeve iki katına çıkabilir.

Bayrak dizisi ve bit doldurma. Aynı fikrin bit ölçeğindeki hâli. HDLC’de bayrak 01111110, yani altı ardışık bir. Gönderen veride beş ardışık bir gördüğü anda araya zorla bir sıfır sokar; böylece veri içinde altı ardışık bir asla oluşamaz. Alıcı beş birden sonra gelen sıfırı sessizce atar.

veri            0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0
telde (doldurulmuş) 0 1 1 1 1 1 [0] 1 0 1 1 1 1 1 [0] 1 1 0

Köşeli parantezler gönderenin eklediği, alıcının atacağı bitler. Şişme en kötü durumda %20’de kalıyor — bit doldurmanın bayt doldurmadan üstün olduğu yer burası.

Fiziksel katman ihlali. Dördüncüsü en zarifi ve Ethernet’in kullandığı yol. Hat kodlaması bazı sinyal desenlerini veri için kullanmıyorsa, o kullanılmayan desen sınır işareti olur. Veri içinde geçmesi fiziksel olarak imkânsız olduğu için doldurmaya hiç gerek kalmıyor. Hat kodlamasına indiğimizde göreceksin: 4B/5B, 32 desenden yalnızca 16’sını veriye ayırıyor ve artan desenler tam da bunun için duruyor.

Ethernet aslında üç yöntemi birden kullanıyor. önsöz ve çerçeve başlangıç sınırlayıcısı başlangıcı, uzunluk alanı ile taşıyıcının kesilmesi sonu, çerçeveler arası boşluk da iki çerçevenin birbirine karışmamasını sağlıyor.

Hata sezme bitlerini de gönderen taraftaki denetleyici koyuyor. Alan taraftaki denetleyici aynı bitleri denetliyor. İki uçtaki yonga, işletim sistemine hiç sormadan anlaşıyor.

Yazılımın devreye girdiği tek nokta alış tarafında. Kart bir çerçeve aldığında işlemciyi kesiyor. Kesmeye yanıt veren sürücü yazılımı hata durumlarını ele alıyor ve datagramı ağ katmanına yukarı veriyor. Donanımın bittiği çizgi tam orası.

Çerçevenin üstündeki adres de kartın kendi adresi, ve kart bu kimliği üstündeki ROM’da taşıyor. Birinci katman aygıtı sayılan bir parçanın ikinci katman aygıtı olarak da anılması bu yüzden. Bu adresin nasıl kurulduğunu, yani MAC adresinin biçimini 21. bölümde tek tek açacağız.

Çekirdek işi karta nasıl devrediyor?

Paket akışı arayüze girip çıkarken doğrudan bellek erişimiyle yönetiliyor; kısaltması DMA. Kart ana belleği kendisi okuyup yazıyor. Kopyalama işini CPU yapmıyor.

İkisinin buluştuğu yer bir halka tampon. Halka, sabit sayıda tanımlayıcıdan oluşan bir dizi. Her tanımlayıcı bellekteki bir paket tamponunun adresini ve o tamponun kime ait olduğunu taşıyor. Çekirdek sıradaki boş tanımlayıcıyı dolduruyor ve sahipliği karta bırakıyor. Kart sırası gelince tanımlayıcıyı okuyor, veriyi DMA ile çekiyor, işi bitince sahipliği geri veriyor.

Tanımlayıcının kart ile çekirdek arasında nasıl el değiştirdiğini izleyelim:

Çekirdek ile kartın paylaştığı gönderme halkası
çekirdek · sürücüağ kartı · link denetleyicisiçerçeveyi kuran ve hatayı sezen yongapaket tamponuana bellek · gönderme halkasıdoludoludoluboştanımlayıcıDMAtelekesme
Halka ikisinin ortasında. Halka ana bellekte duruyor ve iki tarafın da eriştiği tek yer orası. Her tanımlayıcı bir paket tamponunun adresini ve o tamponun kime ait olduğunu taşıyor.
  1. Halka ikisinin ortasında. Halka ana bellekte duruyor ve iki tarafın da eriştiği tek yer orası. Her tanımlayıcı bir paket tamponunun adresini ve o tamponun kime ait olduğunu taşıyor.
  2. Çekirdek tanımlayıcıyı yazar. Çekirdek sıradaki boş girişi dolduruyor ve sahiplik bitini karta çeviriyor. Devretme bundan ibaret: paketin kendisi kopyalanmıyor, yalnızca adresi yazılıyor.
  3. Kart sırayı kendisi okur. Kart, sırası gelen tanımlayıcıyı ana bellekten kendisi okuyor. İşletim sistemine sorulmuyor, çünkü halkanın hangi girişinde olduğunu kart da sayıyor.
  4. Veriyi kart çeker. Paket, tanımlayıcının gösterdiği tampondan doğrudan bellek erişimiyle alınıyor. Kopyalamayı CPU yapmıyor; veri ana bellekten kartın tamponuna gidiyor.
  5. Çerçeve çıkar, kesme döner. Denetleyici çerçeveyi kurup tele veriyor ve sahipliği çekirdeğe iade ediyor. Kesme en sonda geliyor; birleştirme açıksa tek kesme birden çok girişi kapatıyor.

Halkanın derinliği kartlarda tipik olarak 256 ile 4.096 tanımlayıcı arasında. En küçük çerçevelerle tam yükte, saniyede bir gigabit taşıyan bir hatta 256 girişli alma halkası 172 µs’de doluyor. Derinlik bellek gibi görünüyor ama çekirdeğe tanınan süreyi ölçüyor.

Süre yetmezse ne oluyor? Kuyruğa alınmış paketleri tutacak bellek dolduğunda gelen paket düşüyor. Kayıp tam olarak orada oluyor, kablonun ortasında bir yerde değil.

Halkanın öbür ucundaki kesme de bedava değil. Saniyede bir gigabit taşıyan bir hatta en küçük çerçeve 64 bayt, ama telde 84 bayt yer kaplıyor. Yanına 7 baytlık önsöz, 1 baytlık ayraç ve 12 baytlık çerçeveler arası boşluk ekleniyor. Toplamı 672 bit eder. Tam yükte saniyede 1.488.095 çerçeve geçiyor. Her çerçeve için bir kesme, saniyede 1,49 milyon kesme demek. Tek bir çekirdek için ulaşılamaz bir sayı.

Kartlar bu yüzden kesme birleştirme yapıyor: sürücü ya da kart, işlemciyi kesmeden önce birkaç çerçeve biriktiriyor. 32 çerçevede bir kesme verildiğinde aynı yük saniyede 46.503 kesmeye iniyor. Çerçeveler yine aynı halkada birikiyor. Değişen tek şey, çekirdeğin kaç kez rahatsız edildiği.

Bedeli de aynı bölme işleminden çıkıyor. 32 çerçevede bir kesme veren kart, gruptaki ilk çerçeveyi en kötü durumda 31 çerçeve süresi bekletiyor. Boş bir hatta durum daha kötü: grup hiç dolmazsa kesme de hiç gelmiyor. Yalnızca çerçeve sayan bir politika bu yüzden tek başına kullanılamıyor.

Kartlar ikinci bir politika daha taşıyor. İlk çerçeve halkaya düştüğü anda bir zamanlayıcı başlıyor ve süre dolunca kesme veriliyor, grup dolsun dolmasın. ethtool -c eth0 çıktısında yan yana duran iki ayar tam olarak bunlar: biri çerçeve sayıyor, biri mikrosaniye. 200 µs’ye ayarlanmış bir zamanlayıcı, boş bir hatta gelen tek çerçeveye 0,2 ms’ye kadar gecikme ekliyor; aynı ayar tam yükte gecikmeyi düşürüyor, çünkü işlemci kesme işlemekten kurtulunca kuyruklar daha çabuk boşalıyor. Ayarın işareti yüke bağlı.

Darboğaz gerçekten kartta mı?

Her Ethernet arayüz yongası, desteklediği ortamın tam çerçeve hızında gönderip alabiliyor. Darboğaz yongada değil.

Toplam başarımı dört şey belirliyor. İşlemci gücü, işlemci ile kart arasındaki iç sinyal yolunun hızı, kart üstündeki tampon bellek miktarı ve sürücünün kalitesi. Dördü de Ethernet standardının dışında kalıyor. Makine yetişemezse çerçeveler arayüzde düşürülüyor ya da yok sayılıyor, ve standart bunu kusur saymıyor. Sebebi açık. Standart bir bilgisayarın ne kadar hızlı olacağını tanımlamaya çalışmıyor.

Sayılar farkı gösteriyor. Az önce saydığımız 1.488.095 çerçevelik tavan en küçük çerçevelere aitti. Aynı hatta en büyük çerçevelerle tavan saniyede 81.274 çerçeveye iniyor. Çerçeve sayısı on sekiz kat azalıyor, taşınan veri artıyor.

Bir çerçevenin telde ne kadar durduğu tek bir bölmeden çıkıyor. L bitlik bir paketi R bit/s hızındaki bir hatta itmek L/R saniye sürüyor. 1.518 baytlık bir çerçeve için bu, gigabitlik hatta 12,1 µs. On kat hızlı bir hatta aynı iş 1,21 µs’ye iniyor. Gecikme bileşenlerini ayırırken buna iletim gecikmesi demiştik.

Rakamların ucu bugün bile açık. On gigabitlik bir kanalın tam çerçeve hızına piyasadaki masaüstü ve sunucuların bir kısmı hâlâ yetişemiyor.

Bu yüzden bazı üreticiler üst katman protokol işlemesini kartın üstünde yapan arayüzler satıyor. Boşaltma motorlarının çıkış noktası bu. Somut bir örnek. Çekirdek karta 65.535 baytlık tek bir tampon veriyor, kart onu 1.460 baytlık parçalara bölüyor. 44 tam parça ve 1.295 baytlık bir artık çıkıyor, toplam 45 parça. Yazılımın 45 kez yapacağı iş bir kez yapılıyor.

Kendi makinende bakmak istersen Linux’ta iki program var: mii-tool ve ethtool.

ethtool eth0
ethtool -g eth0
ethtool -c eth0
ethtool -k eth0
ip -s link show eth0

İlk komut arayüzün hızını ve çalıştığı kipi yazıyor. İkincisi halka tamponunun azami ve o anki derinliğini, üçüncüsü kesme birleştirme ayarlarını, dördüncüsü açık olan boşaltma özelliklerini döküyor. Sonuncudaki düşen çerçeve sayacı sıfırdan büyükse makinen kartın hızına yetişemiyor demektir.

İlk satırdaki kip de kendi başına bir başarım ayarı. Bir hattın verinin hangi yönde ve ne zaman akabileceğine dair üç seçeneği var, ve üçünün de adı var:

kipveri yönüörnek
tek yönlü (simplex)yalnızca tek yön, hiç dönüş yokradyo yayını, klavyeden bilgisayara
yarım çift yönlü (half duplex)iki yön de mümkün ama aynı anda değiltelsiz, hub’a bağlı Ethernet
tam çift yönlü (full duplex)iki yön aynı andaanahtara bağlı Ethernet, telefon

Ortadaki kip ile alttaki arasındaki fark yalnızca hız değil. Yarım çift yönlü bir hatta iki taraf aynı anda konuşabildiği için çarpışma diye bir olasılık vardır ve o olasılığı yönetecek bir kurala ihtiyaç duyulur. Tam çift yönlü hatta böyle bir kural gerekmez, çünkü gönderme ve alma ayrı yollarda yürür.

Tam çift yönlü çalışmanın iki koşulu var: ortamın aynı anda işleyen ayrı gönderme ve alma yolları olması, ve hatta tam olarak iki istasyon bulunması. Koşullar sağlanınca çarpışma diye bir olasılık kalmıyor. Kip 1997’de standartlaştı, ve bugün bağlantıların neredeyse tamamı böyle çalışıyor. Hızı ve kipi seçen şey Auto-Negotiation, yani iki cihazın da desteklediği en yükseğini kendiliğinden bulan protokol.

Bir arıza tam burada saklanıyor. Hattın yalnızca bir ucunda Auto-Negotiation açıksa, uzlaşmaya çalışan taraf yarım çift yönlü kipe düşüyor. Diğer uç elle tam çift yönlüye sabitlenmişse kip uyuşmazlığı kaçınılmaz oluyor. Bu arıza sıradan web trafiğinde hiç görünmüyor. Bandı gerçekten dolduran bir başarım testinde ortaya çıkıyor.

Özet

Peki, ne öğrendik?

  • Ağ kartı iki katmanı birden gerçekliyor: bağ katmanı ile fiziksel katman kartın üstünde, geri kalan her şey yazılımda; yığının donanımla buluştuğu çizgi orası.
  • Çerçeveyi denetleyici yonga kuruyor: çerçeveleme, hatta erişim ve hata sezme donanımda bitiyor ve ana işlemciye hiç uğramıyor.
  • Halka tampon ile DMA işi devrediyor: çekirdek tanımlayıcıyı dolduruyor, kart veriyi bellekten kendisi çekiyor, ve halkanın derinliği aslında çekirdeğe tanınan süredir.
  • Kesme birleştirme çekirdeği kurtarıyor: çerçeve başına bir kesme tam yükte ulaşılamaz bir sayıya çıktığı için kart birkaç çerçeveyi biriktirip tek kesme veriyor.

Kart hazır. Halkayı okuyor, çerçeveyi kuruyor, hatayı donanımda seziyor. Ama çerçevenin üstünde iki alan hâlâ boş duruyor. Kart oraya kimin adını yazacak?

21. bölüme devam et: Fiziksel Adresleme