Varsayımlı senaryo: Bir udp paket akışı, iki programı çalıştıran X makinesine gelir;PCap unix tamponlaması nasıl çalışır?
Bu durumda, anladığım kadarıyla, paketler kernal tarafından sorgulanana kadar arabirim içinde depolanır, daha sonra bunları çekirdek belleğinde bir arabelleğe taşır ve paketleri diğer iki arabelleğe kopyalar - bir recv ile program dinleme için tampon ve pcap ile dinleyen program için bir tampon. Paketler okunduklarında ilgili tampondan çıkarılır - ya pcap_next() veya recv() ile, bir sonraki işlem zamanlayıcısı bunları çalıştırırsa (bu durumda engellendiğini varsayar). Bu doğru mu? Gerçekten 4 arabellek var mı, yoksa başka bir şekilde mi kullanılıyor?
Bu kutuda hangi tamponların gerçekten yer aldığına ve paketlerin birinden diğerine nasıl geçtiğine ilişkin ayrıntılı bir açıklama arıyorum (örneğin, paketler önce bir paketin arabelleğe kopyalanmasını sağlar) recv tamponuna, sonra veya undefined?).
Bunun büyük bir soru gibi göründüğünü biliyorum, ama gerçekten umursamıyorum, paketin nerede saklandığı ve ne kadar süre orada kaldığı. Mermi noktaları iyi. İdeal olarak genel bir cevap istiyorum, ancak işletim sistemi arasında değişiyorsa, Linux'la daha çok ilgileniyorum. ağ veri tampon
Linux skbuffs (soket tamponlar) kullanır:
Yani, recv() işlevinin çekirdekler arabelleğini kullandığını söylüyorsunuz, ancak her pcap örneğinin arabelleğin kendi kopyası var mı? Bu klonlar hangi aşamada yapılır - paket alındığında? pcap okumak istediğinde? – Benubird
Her pcap örneğinin meta verileri kendi kopyası vardır, ancak hepsi aynı verileri paylaşır. Klonlar, paket alındığında yapılır (skb_deliver() 'IIRC'de). – ninjalj