質問編集履歴

1 調査中の内容を追記しました。

uni8inu

uni8inu score 117

2016/11/21 17:00  投稿

Pythonで通信量を測定するにはどうすればいいでしょうか?
###前提・実現したいこと
サーバーから提供されているwebAPIを叩いてデータを定期的に取得するソフトを作っております。
なるべく相手のサーバーへ負荷をかけないように、問い合わせ毎の通信量を測定して取得時間の間隔を調整したく思っております。
データ取得にはurllib.requestのurlopenを使用しております。
```Python
response = urlopen(url)
```
pythonにて通信量(送受信量)を測定する場合はどういった方法を取ればよいでしょうか?
測定に便利なmoduleがある等、ご存知でしたらご教示いただけますでしょうか?
###試したこと
reponseのパラメータを見たところ、response.lengthという値がありますが、
通信量が直接この値ではないような気がしています。(httpヘッダの知識があまりないです)
pythonでの通信量測定方法がわからなかったので、
とりあえずwiresharkを用いてパケットキャプチャを試みました。
差し当たり、対象サーバーへの1問い合わせ時の通信量は分かりましたが、
なんだかpythonでもっとスマートにできそうな気がしており、詳しい方にお聞きしたく思います。
###補足情報(言語/FW/ツール等のバージョンなど)
Python3
pyCharm
pyCharm
###(追記)手法調査中
- requestsに何か良い感じの値がないか
-- 無かった。でも応答時間はあったので、他の用途で使えることがあるかも。
- pysnmpを利用する
- scapyを利用する
- WireSharkの結果を元にContents-lengthから逆算して泥臭く計算する
-- 正確な仕様ではないし、誤差が大きそうです。Not Pythonicです・・・。
```python
#サーバーからの受信量を、contents-lengthから逆算する
url = "http://XXXXX.com/api/?out=json"
response = urlopen(url)
data_len = response.length
#WireSharkでキャプチャした値を参考に逆算して通信量(受信量)を組み立てる
ip_tr_size = (66+60+60) + 60 # SYN ACK,ACK,FIN ACK / + 追加でACKがあることがある
data_segments = math.ceil(data_len / 1414) # segment分割数 / MRUのサイズで分割する / 1414
data_tr_overhead = (54 * data_segments) # segment分割分のoverhead
httpheader_size = 250 # tcp segment len - response.lengs / マージン+20byte程度 / 正確な算出方法分からない
total_comm_size = data_len + ip_tr_size + data_segments + data_tr_overhead + httpheader_size
```
  • Python

    12188 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    10201 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る