LoginSignup
1

More than 1 year has passed since last update.

P2Pの実装

Last updated at Posted at 2021-01-16

P2Pの課題

現在P2Pはストリーミングやリアルタイムの放送型のコンテンツ配信などに使われていたり、ダウンロードの蓄積型コンテンツ配信、情報共有(コミュニティ、ファイル共有)がある.そのダウンロードの中でファイル交換による通信帯域の圧迫が起こる、その通信帯域が圧迫され回線速度が遅くなってしまうのを解決するために分散システムの仕組みを必要としている.そこで送信先のノードが通信が出来ない状況時に送信元の通信が圧迫された状態になってしまうため、圧迫された状況を改善する必要がある.

本研究の提案

P2Pのファイルを共有をする際に送信先と送信元が存在する。本研究の提案は送信先のpeerが何らかの通信障害または不具合で接続できなくなってしまった時の送信元のpeerがファイルを送れなくなってしまい、通信が圧迫されるのを別のpeerに送信先を移行させてできるだけ送信元のデータ送信を早く終わらせて通信帯域の圧迫を分散させる手法である。

 提案の処理方法

まず、送信元のpeerが送信先のpeerに1024バイトの分割データを送信する.この時は送信先のpeerの接続が継続しているとする.
次に送信先のpeerからの反応がなかった場合、送信先のpeerに1024バイトの分割データを送信できないため転送のpeerに送信先を切り替える.最後に送信元のpeerの通信が改善された場合、送信元のpeerが転送のpeerに送った1024バイトの分割データを転送のpeerから送信先のpeerに送信する.

 実装

Pythonのソケット通信を使ってP2Pの環境を構築する。

クライアント側

import time
import socket

def main():
    soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    soc.connect(("192.168.100.196", 2000))
    data = b'a' * 1024 * 1024 * 40 
    t = time.time()
    soc.send(data) 
    print(t)

if __name__ == '__main__':
    main()

サーバー側

import time
import socket

def main():
    soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    soc.bind(("0.0.0.0", 2000))
    soc.listen(1)
    soc, addr = soc.accept()
    data_sum = ''
    while True:
        data = soc.recv(1024) 
        data_sum = data_sum + str(data) 
        if not data:
            break
    t = time.time()
    print(t)

if __name__ == '__main__':
    main()

今回ソケット通信でP2P環境を作るためサーバー側とクライアント側で分けて作成した。

やってみて

完璧なP2Pの実装ができなかったので今後修正して完成させたい。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1