2011-02-23 6 views
11

가상 시나리오 : udp 패킷 스트림은 두 개의 프로그램, 즉 recv()를 사용하여 패킷을 수신하는 컴퓨터와 pcap을 실행하는 컴퓨터를 실행하는 컴퓨터 X에 도착합니다.pcap 유닉스 버퍼링은 어떻게 작동합니까?

이 경우 패킷은 kernal이 폴링 할 때까지 인터페이스에 저장되고 kernals 메모리의 버퍼로 이동하고 패킷을 다른 두 개의 버퍼에 복사합니다 recv로 청취하는 프로그램을위한 버퍼와 pcap으로 청취하는 프로그램을위한 하나의 버퍼. 패킷은 pcap_next() 또는 recv()에 의해 읽혀질 때 버퍼에서 제거됩니다. 다음 번에 프로세스 스케줄러가이를 실행할 때 (이 경우 블로킹한다고 가정합니다). 이 올바른지? 실제로 4 개의 버퍼가 사용 되었습니까? 아니면 다른 방법으로 처리됩니까?

이 경우 실제로 어떤 버퍼가 관련되는지, 패킷이 다른 패킷으로 이동하는 방법에 대한 설명이 가능한 한 자세하게 설명됩니다 (예 : 패킷이 이동하기 전에 pcaps 버퍼로 복사되는지 확인). recv buffer, after 또는 undefined?).

이 질문은 큰 질문 인 것처럼 느껴지지만, 실제로 신경 쓰이는 부분은 패킷이 저장되는 위치와 그곳에 머문 시간입니다. 글 머리 기호는 괜찮습니다. 이상적으로 나는 일반적인 대답을 원하지만 OS마다 다르다면 리눅스에 가장 관심이있다. 네트워크 데이터를 버퍼링

리눅스 skbuffs (소켓 버퍼를) 사용

답변

8

리눅스의 경우는 (BSD 년대는 mbuf의 대신 skbuff S를 사용하여, 아마 다소 유사하다). skbuff에는 일부 네트워크 데이터에 대한 메타 데이터와 해당 데이터에 대한 포인터가 있습니다.

탭 (pcap 사용자)은 skbuffs의 복제본을 만듭니다. 클론은 새로운 skbuff이지만 동일한 데이터를 가리 킵니다. 누군가 skbuffs (원래 skbuff 및 해당 클론)에서 공유하는 데이터를 수정해야하는 경우 먼저 새로운 사본 (copy-on-write)을 만들어야합니다.

더 이상 skbuff이 필요하지 않은 경우 kfree_skb()입니다. kfree_skb()은 참조 횟수를 감소시키고 참조 횟수가 0이되면 skbuff이 해제됩니다. 클론에 대한 설명은 약간 더 복잡하지만 일반적 아이디어입니다.

+0

그래서 recv() 함수는 커널 버퍼를 사용하지만 각 pcap 인스턴스에는 자체 버퍼 사본이 있다는 것을 알 수 있습니까? 패킷을 받았을 때 어떤 복제본이 만들어 졌습니까? pcap이 그것을 읽고 싶어 할 때? – Benubird

+0

각 pcap 인스턴스는 자체 메타 데이터 복사본을 가지고 있지만 모두 동일한 데이터를 공유합니다. 복제본은 패킷이 수신 될 때 만들어집니다 ('skb_deliver()'IIRC에 있음). – ninjalj