macOS işletim sisteminin, uzun süreli çalışmalarda ağ bağlantılarında beklenmedik sorunlara yol açabilen ve yalnızca yeniden başlatmayla çözülebilen kritik bir hatayı barındırdığı ortaya çıktı. Yaklaşık 49 gün, 17 saat, 2 dakika ve 47 saniyelik kesintisiz çalışma süresine ulaşıldığında, işletim sisteminin TCP/IP ağ yığını çökerek birçok ağ özelliğinin çalışmasını durduruyor.
Bu dikkat çekici bulgular, iMessage hizmetlerini izleyen bir grup Mac bilgisayarında karşılaştıkları gizemli bir sorun üzerine detaylı bir inceleme yapan teknoloji uzmanları tarafından yapıldı. Sorunun, makinelerin aniden ağ bağlantılarına yanıt vermemesiyle kendini gösterdiği, ancak ping isteklerine hala cevap verebildiği belirtildi. Bu durum, sorunun teşhisini daha da zorlaştıran, mevcut ağ bağlantılarının ise çalışmaya devam etmesiyle daha da karmaşık hale gelen bir tablo çizdi.
Sorunla karşılaşan ekip, bu durumu çözmek için bilgisayarları yeniden başlatmak zorunda kaldı. Ancak bu tür bir çözümün, özellikle sistem yöneticileri için pek iç açıcı olmadığı ve sorunun tekrar yaşanabileceği endişesi taşıdığı ifade edildi. Ekip, 49.7 günlük kullanım süresine yaklaşan başka makinelerde de benzer sorunların yaşanması üzerine bir teori geliştirdi ve bu teoriyi test etmek için özel script'ler hazırladı.
Yapılan testlerde, kritik süreye ulaşıldığında Mac'in yeni bağlantı kurma yeteneğinin aniden durduğu ve herhangi bir hata mesajı vermediği gözlemlendi. Bu durum, hatanın kök nedeninin ağ ile ilgili bir zamanlayıcıdan kaynaklandığını düşündürdü. Yapılan incelemeler sonucunda sorunun kaynağının, TCP yığını tarafından kullanılan ve "taşmaya" mahkum olan "tcp_now" adlı dahili bir sayaç olduğu belirlendi.
tcp_now, TCP yığınının önyüklemeden bu yana geçen süreyi milisaniye hassasiyetinde takip eden bir sayaçtır. Bu sayaç, 32-bit işaretsiz bir tam sayı olarak temsil ediliyor ve maksimum 4.294.967.295 (2^32 - 1) değerine ulaşabiliyor. Milisaniyeleri takip ettiği için, tcp_now'ın maksimum değeri yaklaşık olarak 49.7 güne denk geliyor.
Standartlara göre işletim sistemleri, kısa bir süre sonra kapatılan TCP bağlantılarını toplar ve kaldırır. macOS'te bu süre yaklaşık 30 saniye olarak belirlenmiş. Ancak, tcp_now'ın limitine yaklaştığı veya o anda takılı kaldığı durumlarda (bu durum, Apple'ın XNU çekirdeğindeki bir hatadan kaynaklanıyor), kapatılan bağlantıların geçerlilik süresi bu donmuş sayaca göre hesaplanıyor. Bu hesaplama, 32-bit işaretsiz tam sayının taşmasına neden oluyor. Kapatılmış bir bağlantının silinmesi gerekip gerekmediğini kontrol eden periyodik denetimlerde, karşılaştırma matematiksel olarak yanlış sonuçlandığı için bağlantı silinmiyor.
Sonuç olarak, TCP yığını hatalı tutulan geçici portlarla doluyor ve daha fazla port kullanılamadığında sistem tamamen durma noktasına geliyor. Sorunun ne kadar hızlı ortaya çıktığı ağ etkinliğine bağlı olsa da, sunucu veya profesyonel ortamlarda bu durumun hızla yaşanması bekleniyor. Bu tür tamsayı taşması hataları, daha önce Windows 98'deki ünlü 49.7 günlük çökme ve yaklaşan Milenyum 2038 sorununa da neden olmuştu.
Araştırmacılara göre, mevcut çözüm yolu yeniden başlatma olsa da, ekip alternatif bir çözüm üzerinde çalıştıklarını belirtiyor. Ayrıca, bu sorunun Apple Topluluk forumlarındaki bazı çevrimiçi sorunların da kaynağı olabileceği tespit edildi. RFC 7323 standardı, zaman damgası saatinin (tcp_now) limitine ulaştığında ne olması gerektiğini belirtse de, Apple'ın çekirdeği bu konuda yanlış bir uygulama sergiliyor. Bu sorunun, raporun yayınlanmasından sonraki 49.7 gün dolmadan hızlı bir şekilde düzeltilmesi bekleniyor.