Ana içeriğe geç

Bölüm 22:Hata Sezme ve CRC

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

Çerçeve hazır. Fabrikadan gelen MAC adresini başına yazdık, ama yolda bir bit ters dönerse bunu kimin fark edeceğini söylemedim.

Fark eden bir gözlemci yok. Çerçevenin sonuna eklenen küçük bir sayı var ve bütün iş onda. Peki dört bayt, 1.500 baytlık bir yükü nasıl koruyabiliyor?

Bir bit neden ters döner?

Telin üstündeki sinyal yol boyunca zayıflıyor. Üstüne bir de dışarıdan gelen elektromanyetik gürültü biniyor. Alıcı eşiğe yakın bir gerilim gördüğünde yanlış karar veriyor ve gönderilen sıfır, bir olarak okunuyor. Bit hatasının fiziksel sebebi bu iki etkinin toplamı.

Olasılık kanaldan kanala değişiyor ve fiberde diğer bütün ortamlardan çok daha düşük kalıyor. Yıldırım gibi atmosferik olaylar ise hem telli hem telsiz ortamda aynı şeyi yapıyor: art arda gelen bitleri topluca bozuyor. Bu kümeye patlama hatası deniyor. Ayrım yöntem seçimini belirliyor, çünkü tek bir biti koruyan hesap on bitlik bir patlamanın karşısında çaresiz kalıyor.

Sinyalin neden zayıfladığını ve gürültünün nereden geldiğini burada bırakıyorum; ortamın kendisine kitabın sonunda bakacağız.

Bir şeyi de baştan sabitleyeyim. Hiçbir sezme yöntemi %100 güvenilir değil; her yöntem bazı hataları kaçırıyor, ama nadiren. Denetim alanı büyüdükçe hem sezme hem düzeltme gücü artıyor. Bedeli her çerçevede taşınan fazladan bit.

Sezmek ile düzeltmek aynı iş mi?

Hata denetimi iki ayrı aşamada yürüyor. Önce saptama: bir bozulma var mı? Sonra düzeltme: bozulan neydi ve doğrusu neydi? İki büyük aile bu iki aşamayı farklı paylaştırıyor.

FEC (forward error correction, ileri yönlü hata düzeltme) ikisini birlikte yapıyor. Alıcı göndericiye hiçbir şey sormadan bozulan biti geri çeviriyor. Yaygın iki algoritması Hamming kodlaması ve Reed-Solomon kodlaması; 1-2 bitlik hataları anlayıp düzeltebiliyorlar.

Asıl kazanç hızda. Alıcı hatayı yerinde düzelttiği için bir gidiş-dönüş süresi beklenmiyor. Derin uzay bağlantılarında bu belirleyici oluyor, çünkü orada bir sorunun cevabı dakikalarca yolda kalıyor. Gerçek zamanlı ses ve videoda da öyle.

Patlama hataları FEC’i zorluyor. Fiziksel katmanın çözümü, denetim bitlerini ekledikten sonra bitleri karıştırmak. Tek bir gürültü patlaması artık komşu bitleri değil, birbirinden uzak bitleri vuruyor. Alıcı sırayı geri çevirince küme dağılmış oluyor.

ARQ (automatic repeat request, otomatik tekrar isteği) daha az iddialı. Bozulan paketi yeniden gönderiyor, o kadar. Bu yüzden akış kontrolüyle birlikte çalışıyor. Veriyi paketlere bölmenin sebeplerinden biri de bu: bozulan tek paket yeniden gönderiliyor, koca dosya değil.

Bir kodun gücünü ölçen tek sayı

“Bu yöntem kaç bitlik hatayı yakalar?” sorusunun tahmine dayanmayan bir cevabı var ve tek bir büyüklüğe iniyor.

İki bit dizisi arasındaki Hamming uzaklığı, kaç konumda farklı olduklarıdır. 1011010 ile 1001110 arasındaki uzaklık ikidir; üçüncü ve beşinci bitler tutmuyor. Bir hata tam olarak bunu yapıyor: diziyi kendisinden d uzaklıktaki başka bir diziye taşıyor.

Denetim biti eklediğinde bütün bit dizileri geçerli olmaktan çıkıyor; yalnızca bir kısmı geçerli kod sözcüğü oluyor. Kodun gücünü belirleyen şey, bu geçerli sözcüklerin birbirine ne kadar uzak durduğu. En yakın iki geçerli sözcük arasındaki uzaklığa kodun asgari uzaklığı (dmin) deniyor ve her şey ondan çıkıyor:

d bitlik hatayı SEZMEK için      dmin ≥ d + 1
d bitlik hatayı DÜZELTMEK için   dmin ≥ 2d + 1

İki formülün arasındaki fark, geometrik olarak düşününce kendiliğinden anlaşılıyor. Geçerli sözcükleri bir uzayda noktalar gibi düşün. Sezmek için, d bitlik bir hatanın seni başka bir geçerli noktaya düşürmemesi yeter — arada en az bir adım daha olmalı. Düzeltmek ise daha fazlasını istiyor: bozulmuş diziye en yakın geçerli noktanın tek olması gerekiyor, yani her noktanın çevresindeki d yarıçaplı kürelerin birbirine değmemesi. İki kat yer gerekiyor, formüldeki 2 katsayısı da oradan geliyor.

Şimdi tanıdık iki kodu ölç:

koddminsezerdüzeltir
tek eşlik biti21 bit
Hamming (7,4)32 bit1 bit
genişletilmiş Hamming (8,4)43 bit1 bit

Tek eşlik bitinin dmin = 2 olması, iki geçerli sözcüğün en az iki bit farklı olması demek — bir bit çevirirsen mutlaka geçersiz bir diziye düşersin, bu yüzden hatayı görürsün. Ama hangi bitin ters döndüğünü söyleyemezsin: d + 1 = 2 sağlanıyor, 2d + 1 = 3 sağlanmıyor. Bu kitapta ilerideki her yöntemin gücü aynı cetvelle ölçülüyor.

Bedeli de aynı cetvelde okunuyor. Sözcükleri birbirinden uzaklaştırmanın tek yolu daha çok denetim biti eklemek, yani her çerçevede daha az veri taşımak. Güvenilirlik ile verim aynı bütçeden besleniyor.

Saymak nereye kadar yetiyor?

En ucuz sezme tek bir bit ekliyor. Asenkron haberleşmede her karakterin yanına giden eşlik biti bu. Çift eşlikte bir’lerin sayısı çift olacak şekilde ayarlanıyor, tek eşlikte tek. Hangisinin kullanılacağına iki tarafın önceden karar vermesi gerekiyor.

Alıcının işi sayı saymak. Gelen bir’leri sayıyor; teklik ya da çiftlik tutmazsa bozulma var demektir ve karakter yeniden isteniyor. Bir baytlık 01001011 içinde dört tane bir var, o yüzden çift eşlikte eklenen bit sıfır oluyor. Bayt başına bir bit, yani %12,5 yük.

Kör noktası da aynı yerde duruyor. Çift sayıda bit ters dönerse toplam yine tutuyor ve hata görünmez kalıyor. Hatalar patlama hâlinde geldiğinde bu bir istisna olmaktan çıkıyor: tek eşlik bitiyle korunan bir çerçevede sezilemeyen hata olasılığı %50’ye yaklaşabiliyor.

İki boyutlu eşlik bir kat yukarı çıkıyor. Veri satır ve sütunlara diziliyor, her satır ve her sütun için ayrı eşlik hesaplanıyor. Tek bit bozulduğunda bozuk satır ile bozuk sütunun kesişimi hatalı biti veriyor; alıcı onu çevirip düzeltiyor. İki bit bozulduğunda ise düzeltemiyor, yalnızca sezebiliyor. Pratikte kullanılmamasının sebebi bedeli: 4x4’lük bir matriste 16 veri biti için 9 eşlik biti gerekiyor, yani %56 yük.

Checksum aynı fikri bir adım ileri taşıyor. İnternet checksum veriyi 16 bitlik tamsayılar dizisi sayıyor, bir tümleyen toplamını alıyor ve sonucu denetim alanına yazıyor. Alıcı aynı hesabı yeniden yapıp karşılaştırıyor. Eşit değilse hata sezildi. Eşitse sezilmedi, ama yine de olmuş olabilir.

Zayıflığı gösterilebilir. Üç kelime al: E38F, A51C, 4B60. Toplamları 2BF3 çıkıyor. Şimdi birinci kelimeyi bir artır, ikinciyi bir azalt. İkisi de değişti, sonuç yine 2BF3 çıkıyor. Toplama değişmeli olduğu için kelimelerin sırasını bozmak da sonucu değiştirmiyor.

TCP ve UDP checksum yalnızca 16 bit yer kaplıyor. Yükü çok düşük, koruması da o oranda zayıf. Sebep tasarımda: taşıma katmanı yazılımda çalışıyor ve ucuz bir hesap seçiyor. IPv6 başlığında bu alan hiç yok; yönlendiricide işlemeyi hızlandırmak için kaldırılmış ve koruma alt ile üst katmanlara bırakılmış.

Çerçevenin sonundaki dört bayt

Bağ katmanı aynı ödünleşimi ters yönde çözüyor. Hesap ağ kartının üstündeki özel donanımda çalışıyor, bu yüzden pahalı bir yöntem göze alınabiliyor. O yöntem CRC.

CRC (cyclic redundancy check, döngüsel artıklık denetimi) kodlarının öbür adı polinom kodları. Bit dizisi, katsayıları 0 ve 1 olan bir polinom gibi ele alınıyor. Gönderici ile alıcı önce r+1 bitlik bir üreteç deseninde anlaşıyor; desenin en soldaki biti 1 olmak zorunda ve deseni standart veriyor. Hesap mod-2 aritmetiğiyle yürüyor: elde ve borç yok, toplama ile çıkarma aynı işlem ve ikisi de bit bazında XOR.

Gönderici veriyi r bit sola kaydırıp üretece bölüyor. Kalan, veriye eklenen CRC bitleri oluyor:

D = 100110        veri, 6 bit
G = 1101          üreteç, r+1 = 4 bit   (r = 3)

100110000 ÷ G  ->  kalan 110
tele çıkan     ->  100110110
alıcıda kalan  ->  000

soldan dördüncü bit ters:  100010110  ->  kalan 011   (hata sezildi)

Alıcı ayrı bir hesap tutmuyor. Veriyi ve CRC bitlerini birlikte üretece bölüyor; kalan sıfırdan farklıysa hata var.

Uluslararası standartlarda 8, 12, 16 ve 32 bitlik üreteçler tanımlı. Ethernet’in seçtiği CRC-32’nin üreteci 33 bitlik sabit bir desen ve aynı desen bağ katmanındaki IEEE protokollerinde ortak. Her standart iki şeyi garanti ediyor: r+1 bitten kısa bütün patlamalar ve tek sayıda bit hatasının hepsi kesin yakalanıyor. Daha uzun patlamalar da yüksek olasılıkla seziliyor. 32 bitlik artıklıkta kaçırma olasılığı %0,0000000233’e iniyor.

Üç yöntemi aynı hata patlaması üstünde karşılaştıralım:

Aynı patlama, üç ayrı sezme yöntemi
çerçevenin bitleridört bit ters döndütek eşlik biti1 bitçift dönüşü kaçırırinternet sağlaması16 bittelafiyi kaçırırCRC-3232 bitpatlamayı yakalarkör nokta %50’den milyarda bire
Çerçeve yola çıkıyor. Kartın kabloya ittiği bit dizisi. Her kutucuk bir bit; hepsi doğru çıktı ve karşı uçta doğru okunması bekleniyor.
  1. Çerçeve yola çıkıyor. Kartın kabloya ittiği bit dizisi. Her kutucuk bir bit; hepsi doğru çıktı ve karşı uçta doğru okunması bekleniyor.
  2. Gürültü patlaması vuruyor. Atmosferik bir darbe ardışık dört biti birden ters çeviriyor. Bozulma tek tük gelmiyor, küme hâlinde geliyor; sezme yönteminin sınavı da bu.
  3. Tek eşlik biti. Bir’lerin sayısını çift ya da tek tutuyor. Tek sayıda dönüşü kesin yakalıyor; dört bit döndüğü için burada toplam yine tutuyor ve hata görünmez kalıyor.
  4. İnternet sağlaması. Veriyi 16 bitlik sayılar dizisi sayıp topluyor. Bu patlamayı görüyor, ama birbirini telafi eden iki değişimde toplam aynı kaldığı için kör kalabiliyor.
  5. CRC-32 ve aradaki fark. Aynı bitleri bir polinom gibi bölüyor: 33 bitten kısa her patlama kesin yakalanıyor. Alan 1 bitten 32 bite çıkarken kör nokta milyarda bire iniyor.
DerinleşmeCRC neden bölme, ve neden tam olarak bu desen?

Bir sezme değerinden istenen tek şey var: veriyle birlikte yolculuk etsin ve bozulma onu da bozsun. Toplamanın kör noktası bir uygulama kusuru değil; değişmeli bir işlemden başka türlüsü çıkmıyor.

Bölme kalanı öyle davranmıyor. Kalan, dizinin her bitinin konumuna duyarlı; bir biti başka bir yere taşımak kalanı da değiştiriyor. Patlama garantisinin kaynağı burada: ardışık bir bozulma, üreteç deseninin derecesinden kısa kaldığı sürece kalanı sıfır bırakamıyor.

Desenin en soldaki bitine konan şart da aynı yerden geliyor. Kalanın genişliğini desenin derecesi belirliyor; baştaki bir sıfır dereceyi düşürür ve çerçevede ayrılan alanın bir kısmı boşa gider. Tek sayıda bit hatasının hepsinin yakalanması ise desenin (x+1) çarpanını taşımasından: tek sayıda terimli hiçbir hata deseni ona tam bölünmüyor.

Desenin kendisi de keyfî seçilmiyor. Standartlaşan polinomlar, hangi hata desenlerinin tam bölünemeyeceğine bakılarak belirlenmiş ve seçim bir kez yapıldıktan sonra dondurulmuş. İki ucun aynı deseni kullanması şart olduğu için desen değiştirmek, dünyadaki bütün adaptörleri aynı anda değiştirmek demek. Spesifikasyon bit sırasına kadar iniyor: CRC değeri tele yazılırken polinomun en yüksek dereceli katsayısı ilk, sabit terim son bit olarak çıkıyor.

Ethernet çerçevesinin son alanı FCS (frame check sequence, çerçeve denetim dizisi). 32 bit, yani 4 bayt, ve içine CRC-32 sonucu yazılıyor. Hesap hedef adres, kaynak adres, tür alanı ve veri alanları üzerinden yapılıyor; baştaki 8 bayt, yani önsöz ile çerçeve başlangıç sınırlayıcısı, hesaba katılmıyor. Kapsülleme merdiveninde bu alanı adlandırmış ama içini boş bırakmıştım.

Bu dört baytın bedeli çerçeve boyuna göre değişiyor. 1.518 baytlık dolu bir çerçevede FCS’nin yükü %0,26 kalıyor. 64 baytlık en küçük çerçevede aynı alan %6,25’e çıkıyor. Aradaki fark kabaca yirmi dört kat.

Hesap tutmazsa çerçeve düşürülüyor ve arayüzün hata sayacı bir artıyor. Üst katmana hiçbir şey çıkmıyor. Alıcı kart göndericiye ne ACK ne NAK yolluyor; Ethernet güvenilir değildir. Düşen çerçevedeki veri ancak üst katmanda güvenilir bir protokol varsa kurtarılıyor. Bağ katmanı hatayı tespit ediyor, telafi etmiyor.

Yol üstünde iki tuzak var. Bir anahtar çerçeveyi tamponuna alıp CRC’sini denetledikten sonra iletiyorsa bozuk çerçeve orada duruyor; hedef adresi okur okumaz iletiyorsa CRC’ye hiç bakılmadan bozuk çerçeve yayılabiliyor. Bu tercihin adını anahtarı açtığımızda koyacağız. İkinci tuzak da anahtarın elinde: çerçeveye bir etiket eklendiğinde FCS baştan hesaplanıyor.

Sayacı kendi makinende görebilirsin:

ip -s link show enp3s0
ethtool -S enp3s0 | grep -i crc

İlk komut RX satırının altında errors sütununu dökecek. İkincisi sürücünün tuttuğu ayrıntılı sayaçlardan rx_crc_errors benzeri bir satır verecek. Sayı artıyorsa kablo, konnektör ya da yakındaki bir gürültü kaynağı sorguya çekilir.

Özet

Peki, ne öğrendik?

  • Bozulmanın sebebi zayıflama ve gürültü: yıldırım gibi olaylar bitleri tek tek değil ardışık kümeler hâlinde deviriyor ve yöntem seçimini belirleyen şey bu.
  • Saptama ile düzeltme ayrı işler: FEC ikisini birlikte yapıp gidiş-dönüş süresini kurtarıyor, ARQ ise yalnızca saptayıp bozulan paketi yeniden istiyor.
  • Ucuz yöntemlerin kör noktası ölçülü: tek eşlik biti çift sayıda dönüşü, internet checksum birbirini telafi eden değişimleri kaçırıyor.
  • CRC bölmeye dayanıyor: veri r bit kaydırılıp üretece bölünüyor, kalan çerçeveye ekleniyor ve alıcıda kalanın sıfırdan farklı çıkması hatayı ele veriyor.

Çerçevenin sonu artık dolu ve başındaki iki adres de yerinde. Peki oraya yazdığın MAC’i sen nereden buldun? Elinde hedefin IP adresi var; aradaki eşlemeyi kim yapıyor?

23. bölüme devam et: Adres Çözümleme: ARP