2012-02-13 22 views
9

Thực ra, tôi có hai câu hỏi liên quan.Làm thế nào để gửi các gói lớn hơn 1500 byte bởi pcap_sendpacket?

Tôi đang chụp lưu lượng truy cập mạng được lọc theo libpcap trên Debian. Sau đó, tôi cần phải phát lại lưu lượng truy cập này trên máy chủ Win2k3. Đôi khi tôi nắm bắt các gói tin, cả TCP và UDP, lớn hơn nhiều 1500 byte (kích thước MTU mặc định cho Ethernet). Ví dụ: 2000+ byte. Tôi không có thay đổi cụ thể đối với kích thước MTU trên Linux đó. Vì vậy, câu hỏi # 1:

Lý do cho các gói này lớn hơn nhiều so với MTU mặc định là bao nhiêu?Jumbo frames? Bài viết trên Wikipedia này nói rằng "các thẻ giao diện mạng có khả năng khung jumbo yêu cầu cấu hình rõ ràng để sử dụng các khung jumbo", nhưng tôi không biết về bất kỳ cấu hình nào như vậy. Ngoài ra ifconfig cho tôi biết "MTU: 1500". Nó có thể được bằng cách nào đó liên quan với kỹ thuật "kết hợp gián đoạn" (hoặc "ngắt kết hợp" như trong this article)? Tôi có thể chặn các gói như vậy không?

Sau đó, câu hỏi # 2:

Làm thế nào tôi có thể gửi các gói tin như vậy bởi pcap_sendpacket trên Windows? Tôi nhận được thông báo lỗi "gửi lỗi: PacketSendPacket không thành công" chỉ cho các gói lớn hơn 1500 byte. Dường như tôi không thể sử dụng khung jumbo bởi vì tôi đang gửi dữ liệu để kết nối trực tiếp tùy chỉnh "net tap" như thẻ pci và tôi không chắc chắn tôi có thể cấu hình NIC của nó. Còn gì nữa? Tôi có nên phân mảnh các gói này theo các quy tắc giao thức không?

EDIT:

Kiểm tra phân mảnh bởi NIC như Guy Harris gợi ý:

~# ethtool -k eth0 
Offload parameters for eth0: 
rx-checksumming: on 
tx-checksumming: on 
scatter-gather: on 
tcp-segmentation-offload: off 
udp-fragmentation-offload: off 
generic-segmentation-offload: off 
generic-receive-offload: off 
large-receive-offload: off 
ntuple-filters: off 
receive-hashing: off 

Cùng cho eth1br0 - mạng cầu nối giữa eth0eth1 mà tôi đang đánh hơi.

Và tôi vẫn nhận được các gói UDP lớn.

+0

pcap có lẽ đang dán các gói dữ liệu bị phân mảnh lại với nhau thành một đoạn từ các gói dây cho bạn. Kiểm tra xem bạn có thể yêu cầu nó cung cấp cho bạn khung ethernet và không vận chuyển gói dữ liệu không. –

+0

@NikolaiNFetissov: Tôi đang nhận các khung ethernet –

Trả lời

4

¿Bạn đang sử dụng công cụ đánh bắt để chụp?

Đó là điều quan trọng beacause theo mặc định wireshark lắp ráp lại phân mảnh ip datagrams (và lưu trữ chúng trong một tập tin pcap như gói lại MTU-higger đơn mà không có phân mảnh). Để tắt:

Chỉnh sửa-> tùy chọn-> Giao thức-> ipV4-> và bỏ chọn "Lắp ráp lại gói dữ liệu IPv4 phân mảnh".

+0

Tôi đang chụp bằng libpcap (cốt lõi của Wireshark). Bất kỳ thông tin làm thế nào để vô hiệu hóa này trong libpcap? –

+1

Libpcap không có tính năng này trừ khi gói bạn sử dụng đã áp dụng bản vá này -> http://seclists.org/tcpdump/2007/q2/112 Bạn có thể kiểm tra phiên bản libpcap của mình hoặc tải xuống phiên bản chính thức thay vì sử dụng cái được cung cấp bởi bản phân phối (đôi khi chúng áp dụng các bản vá lỗi lạ ...) –

+0

+1. tnx cho thông tin, tôi đã xây dựng libpcap cuối cùng từ các nguồn, bây giờ tôi chỉ thấy một gói lớn hơn một chút so với MTU, 1518 byte. Có vẻ vì đoạn giới thiệu Ethernet. Nhưng tôi vẫn không thể gửi các gói này bằng 'pcap_sendpacket'. Tôi có nên sửa đổi chúng bằng cách xóa đoạn giới thiệu đó không? –

6

adapter mạng của bạn có lẽ là làm TCP Phân khúc/desegmentation giảm tải và IP phân mảnh/giảm tải reassembly, vì vậy:

  • gói UDP được gửi bởi máy tính của bạn có dung lượng lớn hơn sẽ phù hợp trong một khung Ethernet đơn đang được trao cho bộ điều hợp mạng mà không bị phân mảnh, với bộ điều hợp mạng thực hiện phân mảnh, và chúng cũng được chuyển giao cho libpcap trước khi bị phân mảnh;
  • Các đoạn UDP nhận được bởi bộ điều hợp mạng lớn hơn sẽ phù hợp trong một khung Ethernet duy nhất được bộ điều hợp mạng lắp ráp lại trước khi được giao cho máy chủ và được chuyển đến libpcap sau khi được lắp ráp lại;
  • khối dữ liệu luồng TCP được gửi bởi máy quá lớn để vừa với một khung Ethernet duy nhất được chuyển đến bộ điều hợp mạng, với bộ điều hợp mạng chia khối thành các phân đoạn TCP nhỏ hơn và toàn bộ đoạn được giao cho libpcap;
  • Các phân đoạn TCP nhận được bởi bộ điều hợp mạng của bạn đang được tập hợp lại thành các khối dữ liệu TCP lớn hơn và các khối được chuyển cho máy chủ và sau đó đến libpcap;

vì vậy những gì libpcap đang chứng kiến ​​là không gói Ethernet và là không giới hạn kích thước khung Ethernet.

(Tức là, Nikolai Fetissov có lẽ là chính xác; những gì bạn nhận được có thể là trông giống như các khung Ethernet, nhưng đó là do bộ điều hợp mạng và trình điều khiển khiến chúng trông như vậy. trên hoặc nhận được từ Ethernet.)

Bạn chỉ có thể chặn chúng bằng cách tắt bất kỳ hình thức phân đoạn/desegmentation/phân mảnh/reassembly đang được thực hiện trên bộ điều hợp mạng của bạn bằng cách sử dụng lệnh ethtool; tắt các tùy chọn như Tắt phân đoạn TCP, Giảm phân mảnh UDP, Giảm phân đoạn chung, Giảm tải xuống lớn và Giảm tải nhận chung.

Khi bạn đã vô hiệu hóa các tùy chọn đó, bạn sẽ không còn có các gói lớn nữa và do đó bạn sẽ có thể phát lại chúng mà không gặp vấn đề gì. Có không có cách nào dễ dàng để phát lại các gói đã được reassembled/un-fragmented hoặc segmented mà bạn đã chụp cho đến nay - bạn phải viết mã của riêng bạn để phân đoạn chúng và không đảm bảo rằng chúng sẽ trở lại -fragmented/tái phân đoạn theo cùng một cách mà họ đã được phân mảnh ban đầu/phân đoạn trên dây.

+1

+1: thx để biết thông tin, kiểm tra ... –

+0

xin xem bài chỉnh sửa –

Các vấn đề liên quan