2013-08-22 77 views
8

Tôi muốn tra cứu bộ đếm hoạt động tải trọng TCP (tổng số byte nhận được) cho mô tả tệp đã cho hoặc giao diện đã cho. Tốt nhất là mô tả tập tin đã cho, nhưng đối với giao diện sẽ là đủ. Lý tưởng nhất là tôi thực sự muốn biết về bất kỳ byte đã được ack-ed, ngay cả những người mà tôi đã không đọc vào userspace (chưa?).Xác định hoạt động/thống kê tải trọng TCP

Tôi đã thấy tính năng TCP_INFO của getsockopt() nhưng không có trường nào xuất hiện để lưu trữ "Tổng số byte nhận được" hoặc "tổng số byte được truyền (acked, ví dụ)" cho đến khi tôi có thể biết.

Tôi cũng thấy các netlinkIFLA_STATS + RTNL_TC_BYTES và (lĩnh vực rx_bytes) SIOCETHTOOL + ETHTOOL_GSTATSioctl() cho các giao diện, và những người là rất lớn, nhưng tôi không nghĩ rằng họ sẽ có thể phân biệt giữa chi phí/tiêu đề của các lớp khác và byte tải trọng thực tế.

procfs/proc/net/tcp nhưng điều này dường như không chứa nội dung tôi đang tìm kiếm.

Có cách nào để nhận dữ liệu cụ thể này không?

EDIT: chế độ promiscuous có tác động không thể chịu nổi về thông lượng, vì vậy tôi không thể tận dụng bất kỳ thứ gì sử dụng nó. Chưa kể đến việc triển khai các phần lớn của ngăn xếp IP để xác định gói nào phù hợp vượt quá phạm vi dự định của tôi cho giải pháp này.

Mục đích là để có một sự bao quát/không tin tưởng/dự đoán thứ hai về giá trị mà tôi lưu trữ từ recvmsg().

Điều Đúng đắn cần làm là theo dõi các giá trị đó một cách chính xác, nhưng sẽ rất có giá trị khi có một hệ điều hành "Hey OS? Có bao nhiêu byte có thực sự là đã nhận được trên ổ cắm này không?"

+0

Bạn có thể sử dụng 'iptables' để thực hiện việc đếm. Câu trả lời này là thú vị mặc dù: http://superuser.com/a/264651 – alk

+0

Bạn có thể sử dụng libpcap không? Bạn có thể đặt giao diện màn hình và nắm bắt chính xác các loại gói bạn muốn, sau đó chỉ tăng bộ đếm nếu các gói đó đáp ứng tiêu chí của bạn. –

Trả lời

1

Có lẽ số liệu thống kê trong/proc/net/dev có thể hữu ích. Tôi không quen với việc đếm trọng tải so với các gói đầy đủ bao gồm các tiêu đề, do đó làm cho câu hỏi khó trả lời hơn.

Đối với thống kê về mô tả tệp riêng lẻ, tôi không biết bất kỳ phương tiện chuẩn nào để nhận thông tin đó.

Nếu có thể kiểm soát việc khởi động các chương trình cần có số liệu thống kê, có thể sử dụng thư viện "chặn" thực hiện đọc(), write(), sendto() và recvfrom của riêng nó() cuộc gọi, chuyển các cuộc gọi đến thư viện C chuẩn (hoặc trực tiếp đến cuộc gọi hệ thống), giữ bộ đếm hoạt động và tìm cách xuất bản các giá trị đó.

2

Bạn có muốn điều này để chẩn đoán hoặc phát triển không?

Nếu chẩn đoán, tcpdump có thể cho bạn biết chính xác những gì đang xảy ra trên mạng, được lọc theo chi tiết cổng và máy chủ lưu trữ.

Nếu để phát triển, có lẽ một chút thông tin về những gì bạn đang cố gắng đạt được sẽ giúp ...

ifconfig cung cấp tổng số RX và TX.

ifconfig lấy các chi tiết này từ/proc/net/dev (như bạn có thể thấy qua ifconfig strace).

Ngoài ra còn có các giá trị Gửi/nhận-Q được cung cấp bởi netstat -t, nếu đó là gần hơn với những gì bạn muốn.

+0

Devleopment: Tôi muốn có một overarching/no-trust/second-guess về những giá trị mà tôi lưu trữ từ 'recvmsg()'. 'ifconfig' bao gồm chi phí từ các lớp bên dưới TCP. Giá trị Receive-Q 'netstat -t' bị cản trở bởi nguy cơ lỗi lấy mẫu. Bao lâu tôi có thể lấy mẫu để có được một số đáng tin cậy? Tần xuất bản thân giá trị được xuất bản thành 'procfs' như thế nào? –

+0

Tôi nghi ngờ rằng giá trị procfs luôn được cập nhật - nó không thực sự là một tập tin, nó được tạo ra khi đang bay. –

+0

Có lẽ, nếu điều này được dự định như là một cơ chế kiểm toán, bạn nên đặt một cái gì đó ở giữa mã làm việc recv'ing và mã sử dụng dữ liệu. Hoặc là trong cùng một mã, hoặc một quá trình hoàn toàn độc lập có thể ủy quyền dữ liệu và giữ số lượng dữ liệu đi qua. Nếu nó không phải để kiểm toán, bạn có chắc chắn rằng bạn sẽ không thay vì chỉ đếm mình cho các byte đọc cho đến nay? –

4

Một cũng có thể sử dụng cuộc gọi ioctl với SIOCINQ để nhận số lượng dữ liệu chưa đọc được xếp hàng đợi trong bộ đệm nhận. Dưới đây là cách sử dụng từ trang người đàn ông: http://man7.org/linux/man-pages/man7/tcp.7.html

int value; 
error = ioctl(tcp_socket_fd, SIOCINQ, &value); 

Đối với số liệu thống kê giao diện TCP, chúng ta có thể sử dụng "netstat -p tcp -i" để tìm số liệu thống kê trên một cơ sở cho mỗi giao diện.

+0

Điều này khá hữu ích. Nó không phải là toàn bộ shebang như tôi đã hy vọng, nhưng là một thông tin tuyệt vời. –

+0

Miễn là chúng ta đang thảo luận về các giải pháp, người ta cũng có thể xem xét mở rộng cuộc gọi IOCTL trong lớp TCP bằng cách thêm một giá trị IOCTL mới. Bạn có thể tìm thấy nơi SIOCINQ được định nghĩa ở đây: http://lxr.free-electrons.com/source/net/ipv4/tcp.c#L535. Về cơ bản, thêm một cấu trúc mới sẽ trả lại cho bạn tất cả thống kê tùy chỉnh mà bạn đang tìm kiếm. Rõ ràng, đây sẽ là cách hiệu quả hơn các giải pháp chế độ promiscuous. Điều hiển nhiên là người ta cần phải biên dịch hạt nhân cho điều đó, có lẽ một cái gì đó mà usecase của bạn có thể không cho phép bạn làm. –

+1

Vâng, tôi muốn xác định rằng ngoài phạm vi. Nhưng có lẽ tôi nên đi đến những rắc rối của trình lên thượng nguồn. –

1

Trong trường hợp bạn không muốn chỉ cần đếm tổng RX/TX mỗi giao diện (đó là đã có sẵn trong ifconfig/công cụ iproute2) ...

Nếu bạn nhìn vào/proc hơn một chút, bạn có thể có thêm thông tin. Cụ thể hơn /proc/<pid>/net/dev.

Mẫu đầu ra:

Inter-| Receive            | Transmit 
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed 
    eth0: 12106810846 8527175 0 15842 0  0   0 682866 198923814 1503063 0 0 0  0  0   0 
    lo: 270255057 3992930 0 0 0  0   0   0 270255057 3992930 0 0 0  0  0   0 
    sit0:  0  0 0 0 0  0   0   0  0  0 0 0 0  0  0   0 

Nếu bạn bắt đầu tìm kiếm, thông tin được phát ra từ net/core/net-procfs.c từ Linux kernel (procfs chỉ sử dụng thông tin này). Tất cả điều này tất nhiên có nghĩa là bạn cần quy trình cụ thể để theo dõi.

Bạn có thể tìm hiểu thông tin có sẵn trong /proc hoặc nếu bạn cần một cái gì đó ổn định hơn, sau đó nhân đôi chức năng net-procfs dành riêng cho ứng dụng của bạn có thể có ý nghĩa.