2011-02-23 15 views
11

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:

cevap

8

Linux durumda (BSD'lerin mbuf s yerine skbuff s kullanarak, muhtemelen biraz benzer). Bir skebonun bazı ağ verileriyle ilgili meta verileri ve bu verilere bazı göstergeleri vardır.

Musluklar (pcap kullanıcıları) skbuff klonları oluşturur. Bir klon yeni bir skbuff, ama aynı verilere işaret ediyor. Birisi birkaç skbuffs (orijinal skbuff ve onun klonları) tarafından paylaşılan verileri değiştirmeye ihtiyaç duyduğunda, önce yeni bir kopyanın (yazma üzerine yazılan) oluşturulması gerekir.

Artık birisi skbuff'lara ihtiyaç duymuyorsa, kfree_skb() adlı kullanıcının fotoğrafı. kfree_skb(), bir referans sayısını azaltır ve bu referans sayısı sıfıra ulaştığında, skbuff serbest kalır. Klonları hesaba katmak biraz daha karmaşık, ama bu genel bir fikir.

+0

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

+0

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