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 netlink
IFLA_STATS
+ RTNL_TC_BYTES
và (lĩnh vực rx_bytes
) SIOCETHTOOL
+ ETHTOOL_GSTATS
ioctl()
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
có /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?"
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
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. –