C ile ağ programlama
Soketlerle TCP ve UDP istemci-sunucu yazar, çok bağlantıyı select, poll ve epoll ile yönetir, ağdan gelen veriye güvenmeyen sağlam kod geliştirirsin.
Seviye 301 · 22 ders · 21 pratik lab
Dersler
Soket temelleri
- Ağ bayt sırası ve adres yapıları
- Ad çözümleme: getaddrinfo ile IPv4 ve IPv6
- TCP istemcisi: connect, send, recv
- TCP sunucusu: bind, listen, accept
- Kısmi okuma ve yazma: mesajın tamamını almak
- Kısa görev: yankı sunucusu
Birden çok bağlantı
- Her istemciye bir süreç
- select ve poll ile çoklu bağlantı
- epoll ile ölçeklenen sunucu
- Engellemeyen soketler ve zaman aşımları
- Kısa görev: çok kullanıcılı sohbet sunucusu
Protokoller
- UDP: sendto, recvfrom ve kaybolan paketler
- Mesaj çerçeveleme: uzunluk önekli protokol
- Ham soketle HTTP isteği
- Küçük bir HTTP sunucusu: istek satırı ve başlıklar
- OpenSSL ile TLS istemcisi ve sertifika doğrulama
- Kısa görev: lab hedeflerindeki servislerin karşılama satırlarını topla
Sağlam ağ kodu
- Ağdan gelen veriye güvenmemek: uzunluk ve sınır denetimi
- Kaynak sınırları: bağlantı sayısı, süre ve bellek
- Kendi protokol ayrıştırıcını bulanıklaştırmak
- Kısa görev: sunucunu bozuk isteklere karşı sağlamlaştır
Bitirme
- Bitirme görevi: zaman aşımlı, paralel servis denetleyici
Pratik lablar
- Adres yapısını okunur yazdırmak: sockaddr_in ve sockaddr_in6 yapılarını inet_ntop ile adres ve port olarak yazdıran yardımcıyı yaz.
- Lab saat servisine bağlanan istemci: Lab hedefindeki saat servisine TCP ile bağlanıp yanıtı okuyan ve bağlantı hatalarını açıklayan istemciyi yaz.
- Tam N bayt alana kadar okumak: recv'in kısmi dönüşlerini birleştiren recv_exact fonksiyonunu yaz; bağlantı erken kapanırsa hata versin.
- Yeniden başlatılabilen TCP sunucusu: Kapatılıp hemen açılınca 'Address already in use' veren sunucuyu düzelt ve istemci kapanınca kaynakları sızdırmasın.
- Bir adın tüm adreslerini listelemek: getaddrinfo ile bir lab alan adının IPv4 ve IPv6 adreslerini listeleyen küçük aracı yaz.
- Adresleri sırayla deneyen bağlantı: getaddrinfo sonuçlarını sırayla deneyip ilk başarılı bağlantıyı dönen fonksiyonu yaz ve addrinfo'yu serbest bırak.
- Çözümleme hatalarını ayırt etmek: Ad bulunamadı, geçici hata ve zaman aşımı durumlarını gai_strerror ile ayıran, yeniden denemeyi yalnızca geçici hatada yapan kod yaz.
- poll ile çok istemcili sayaç sunucusu: Her istemciye bağlı kaç kişi olduğunu söyleyen sunucuyu poll ile tek süreçte yaz.
- select'in tanıtıcı sınırını aşmak: FD_SETSIZE üstündeki tanıtıcılarda bellek bozan select tabanlı sunucuyu poll'a taşı ve bin bağlantıyla test et.
- Kenar tetiklemeli epoll döngüsü: EPOLLET kullanan sunucuda veriler EAGAIN'e kadar okunmadığı için takılan bağlantıları düzelt.
- Bağlantıya zaman aşımı koymak: Engellemesiz connect ve poll ile lab hedeflerine en fazla iki saniye bekleyen bağlantı fonksiyonu yaz.
- UDP ile kayıp paket oranı ölçmek: Lab yankı servisine sıra numaralı UDP paketleri gönderip geri gelmeyenlerin oranını hesaplayan istemci yaz.
- Uzunluk önekli mesaj kodlayıcısı: 4 baytlık uzunluk önekiyle mesaj gönderen ve alan fonksiyonları yaz; üst sınırı aşan uzunluklar reddedilsin.
- Ham soketle HTTP durum kodu almak: Lab web hedefine ham soketle HEAD isteği gönderip durum kodunu ve Server başlığını ayrıştıran aracı yaz.
- TLS istemcisinde ana bilgisayar adını doğrulamak: Sertifikayı doğrulamayan OpenSSL istemcisine zincir ve ana bilgisayar adı doğrulaması ekle; yanlış adlı hedefte bağlantı reddedilsin.
- Başlık satırı uzunluğunu sınırlamak: İstek satırını sabit tampona okuyan sunucuya uzunluk sınırı ekle ve uzun satırlara 431 dön.
- Yavaş istemcileri zaman aşımıyla düşürmek: Veriyi çok yavaş gönderen istemcilerin bağlantıyı tutmasını istemci başına zaman sınırıyla engelle.
- Eşzamanlı bağlantı ve bellek sınırı: Sunucuya IP başına bağlantı sınırı ve toplam tampon belleği üst sınırı ekle; sınır aşılınca kibarca reddetsin.
- Çerçeve ayrıştırıcısını fuzz ile sınamak: Mesaj çerçeve ayrıştırıcısını libFuzzer hedefiyle çalıştır, bulunan çökmeyi düzelt ve girdiyi teste ekle.
- Kopan bağlantıya artan bekleme ile dönmek: Sunucu yeniden başlatılınca çöken istemciyi üst sınırlı artan beklemeyle yeniden bağlanan ve kaldığı satırdan devam eden hale getir.
- Dört baytlık çerçeve başlığını çözmek: Ağ bayt sırasındaki tür ve uzunluk alanlarından oluşan dört baytlık başlığı yapıya çeviren ve kısa girdiyi reddeden fonksiyonu yaz.
Kurs hakkında
Soketlerle TCP ve UDP istemci-sunucu yazar, çok bağlantıyı select, poll ve epoll ile yönetir, ağdan gelen veriye güvenmeyen sağlam kod geliştirirsin.
Ne öğreneceksin
- Soket temelleri
- Birden çok bağlantı
- Protokoller
- Sağlam ağ kodu
- Bitirme
Ön koşullar
Aynı yolun 101 ve 201 düzeyindeki konularına hâkim olmalısın.
Lab ortamı
Dersler, tarayıcında açılan sana özel bir Kali Linux terminalinde ve ona bağlı özel bir lab ağında geçer. Kurulum gerekmez.
Sık sorulan sorular
- Bu kurs benim düzeyime uygun mu?
- Kurs 301 düzeyindedir; daha düşük düzeydeki kursların konularını bildiğin varsayılır.
- Kurulum gerekir mi?
- Hayır. Her ders tarayıcında açılan sana özel bir lab ortamında geçer.
- Dersler nasıl işleniyor?
- Her ders 8 ile 10 adımdan ve bir kısa sınavdan oluşur. İlk adımlarda yazman gereken komut gösterilir, sonraki adımlarda yardım azalır; iki denemede takılırsan çözüm açılır.
- Ücretsiz deneyebilir miyim?
- Evet. Her kursun ilk üç dersi ücretsizdir.