Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.

Slides:



Advertisements
Similar presentations
TCP/IP によるチャットプログラ ム 薄井 秀晃. 基礎知識編 TCP/IP とは? IP とは・・・ Internet Protocol の略称であり通信方法の技術的なルールで あり、実際にデータを送受信する前にデータを小さなデータ に分割し、それに発信元と受信先の IP アドレスを付加させて.
Advertisements

ファイアウォール 基礎教育 (4日目).
Webプロキシサーバにおける 動的資源管理方式の提案と実装
第一回 プロキシサーバーを駆使したセキュリティシステムの構築
第1回.
Webアプリケーションの 通信メカニズム WEBアプリ研究プロジェクト 第2回.
独習Java ・ 12.1  インターネットアドレス ・ 12.2  サーバーソケットとソケット  12月 19日    小笠原 一恵.
Phenixサーバ クラックまとめ.
「コンピュータと情報システム」 07章 インターネットとセキュリティ
第4回 個人の動画配信補足のためのWeb構築
ネットワーク コミュニケーション トランスポート層 TCP/UDP 6/28/07.
webブラウザ proxy設定 (HTTP1.0)
Windows Network Programming
TCPソケットプログラミング ソケットプログラミング TCP-echoのデータ通信手順
HTTPプロトコルとJSP (1) データベース論 第3回.
JQueryでAjax 藤田@ジャストプレイヤー ※参考しまくり文献 jQuery日本語リファレンス.
の まとめ 2007/04/02 (Mon) / d;id:hzkr
HTTPプロトコル J2EE I 第7回 /
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第11回 プロセス間通信4 仮想FTPの実現 担当:青木義満
(B2) 親: minami, kazuki 多様な認証機器に対応する 認証システム (B2) 親: minami, kazuki.
パケットの流れ ブラウザ OS TCP IP LANアダプタ ハブ ルータ HTTPメッセージ TCP HTTP断片 TCP HTTP断片
情報技術演習Ⅰ 人文学研究のための情報技術入門 2017/07/06
第8章 Web技術とセキュリティ   岡本 好未.
Linux リテラシ 2006 第4回 ネットワーク CIS RAT.
ネットワークアプリケーションと セキュリティ
P2P方式によるオンラインゲームの研究、開発
第11回ネットワークプログラミング 中村 修.
第7回ネットワークプログラミング 中村 修.
RPC:Remote Procedure Call Protocol Specification
UDPエコーサーバ UDP-echoサーバのプログラムモデル(Cプログラム) サーバで利用するソケット関数(Cプログラム)
特定ユーザーのみが利用可能な仮想プライベート・ネットワーク
ソケットプログラム(TCP,UDP) EasyChat開発
マルチスレッド処理 マルチプロセス処理について
岡村耕二 トランスポート層 ソケットプログラミング 岡村耕二 情報ネットワーク.
プログラミング 4 記憶の割り付け.
ソケットプログラム(TCP,UDP) EasyChat開発2
インターネットにおける真に プライベートなネットワークの構築
Cisco Umbrella のご紹介 2018 年 1 月.
UDPマルチキャストチャット    空川幸司.
ネットワークプログラミング (5回目) 05A1302 円田 優輝.
第16章 BOOTP:ブートストラップ・プロトコル
アナライザ パケットを収集 測定用のマシン 通信.
ネットワークプログラミング (3回目) 05A1302 円田 優輝.
第5回 個人の動画配信補足のためのWeb構築
TCP/IPとプロセス間通信 2007年1月12日 海谷 治彦.
Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.
ネットワーク・プログラミング ソケットオプションとスレッド.
岡村耕二 トランスポート層 岡村耕二 情報ネットワーク.
個人の動画配信のためのWebサーバ構築 06A1058 古江 和栄.
第6回 個人の動画配信補足のためのWeb構築
VPNとホストの実行環境を統合するパーソナルネットワーク
最低限インターネット ネットワークにつなぎましょ!
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
アナライザ パケットを収集 測定用のマシン 通信.
システムプログラミング 第10回 プロセス間通信3 簡易Web server(準備) Chat プログラム 担当:青木義満、篠埜 功
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
ネットワークプロトコル.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第11回 プロセス間通信4 仮想FTPの実現 担当:青木義満
ネットワーク・プログラミング TCPサーバ.
ネットワーク・プログラミング 1対多のプロセス間通信.
特定ユーザーのみが利用可能な仮想プライベート・ネットワーク
岡村耕二 UDP通信プログラム 課題と回答例 岡村耕二 情報ネットワーク.
アプリケーションゲートウェイ実験 2001.10.5 鬼塚 優.
ネットワーク・プログラミング マルチタスク.
Webプロキシ HTTP1.1 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
TCP/IPの通信手順 (tcpdump)
ソケットの拡張によるJava用分散ミドルウエアの高信頼化
第6章 インターネットアプリケーション 6.1 インターネットアプリケーション 6.2 Javaによるネットワーク処理 6.3 電子メール
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
HTTPプロトコルの詳細 M1 峯 肇史.
Presentation transcript:

webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I

このスライドについて このスライドでは皆さんがプログラムを書いたり,関数を調べたりする過程で行き詰ると予想される部分について簡単に解説します. このスライドの目的は自主学習のサポートであり,説明が簡略化されています.完全な理解には自主学習が必要なので注意してください.

目次 webプロキシとは 何を実装すればよいのか 実装方法の例 webサーバの特定方法 実装をする上での注意

webプロキシとは 一般的な通信は直接通信 webサーバ ブラウザ

webプロキシとは proxy = 「代理」 webサーバとのデータのやりとりを中継する webサーバ ブラウザ $./proxy プロキシ

何を実装すればよいのか プログラムの流れ webサーバ ブラウザ プロキシ $./proxy proxy側 listen() webサーバ

何を実装すればよいのか プログラムの流れ webサーバ ブラウザ プロキシ $./proxy proxy側 listen() webサーバ ブラウザ側の connect()

何を実装すればよいのか プログラムの流れ webサーバ ブラウザ プロキシ $./proxy webサーバ listen() プロキシ側で accept()

何を実装すればよいのか プログラムの流れ webサーバ ブラウザ プロキシ $./proxy ブラウザからの リクエスト webサーバ listen()

何を実装すればよいのか プログラムの流れ webサーバ ブラウザ プロキシ $./proxy リクエストから webサーバを特定 listen() リクエストから webサーバを特定

何を実装すればよいのか プログラムの流れ webサーバ ブラウザ プロキシ $./proxy webサーバ listen() connect()

何を実装すればよいのか プログラムの流れ webサーバ ブラウザ $./proxy プロキシ webサーバが accept()

何を実装すればよいのか プログラムの流れ webサーバ ブラウザからの リクエストを 転送 ブラウザ $./proxy プロキシ

何を実装すればよいのか プログラムの流れ webサーバ ブラウザ $./proxy プロキシ webサーバからの レスポンス

何を実装すればよいのか プログラムの流れ webサーバ ブラウザ $./proxy プロキシ webサーバからの レスポンスを 転送

何を実装すればよいのか プログラムの流れ webサーバ ブラウザ $./proxy プロキシ ソケットクローズ

何を実装すればよいのか HTTP1.0では 1リクエスト + 1レスポンス = 1コネクション 各リクエストごとに接続を確立します.

何を実装すればよいのか さらに,ブラウザからのconnectを複数受け付けるには webサーバ ブラウザ $./proxy プロキシ

何を実装すればよいのか さらに,ブラウザからのconnectを複数受け付けるには webサーバ ブラウザ プロキシ $./proxy listen() webサーバ listen() ブラウザ側の connect()

何を実装すればよいのか さらに,ブラウザからのconnectを複数受け付けるには webサーバ ブラウザ プロキシ $./proxy listen() プロキシ側で accept()

何を実装すればよいのか さらに,ブラウザからのconnectを複数受け付けるには webサーバ ブラウザ プロキシ $./proxy listen用ソケットは残しておく webサーバ listen() 別スレッド,または別プロセス proxy accept()したら 後は並列処理に任せる

何を実装すればよいのか さらに,ブラウザからのconnectを複数受け付けるには webサーバ ブラウザ プロキシ $./proxy listen用ソケットは残しておく webサーバ listen() 別スレッド,または別プロセス proxy

何を実装すればよいのか さらに,ブラウザからのconnectを複数受け付けるには webサーバ ブラウザ プロキシ $./proxy listen() ブラウザ側の connect() 別スレッド,または別プロセス proxy

何を実装すればよいのか さらに,ブラウザからのconnectを複数受け付けるには webサーバ ブラウザ プロキシ $./proxy listen() プロキシ側で accept() 別スレッド,または別プロセス proxy

何を実装すればよいのか さらに,ブラウザからのconnectを複数受け付けるには webサーバ ブラウザ プロキシ $./proxy listen用ソケットは残しておく webサーバ listen() 別スレッド,または別プロセス proxy proxy

実装方法の例 main { listenSocket = listen中のソケットを作成; sockaddr_in変数の各種メンバの設定; bind(); listen(); while (1) { browserSocket = accept(listenSocket, …); /* ブラウザからlistenSocketへの接続要求をaccept(); */ スレッド(またはプロセス)の作成; /*子スレッドor子プロセスに送受信処理を実行させる*/ /*browserSocketをスレッド(またはプロセス)に渡す*/ }/*main関数はaccept→子スレッドorプロセスの作成を繰り返す*/ } ※あくまでも一例です.また,引数や実装方法が簡略化されています.

スレッドorプロセス によって作成した子の中で 実装方法の例 スレッド(またはプロセス) { recv(browserSocketからの文字列 → buffer); webserverSocket = socket(); hostName = bufferからwebサーバのホスト名を抜き出す; hostAddress = hostNameからwebサーバのIPアドレスを求める; hostPort = webサーバならば通常は80を代入;(well-known port)  sockaddr_in型変数のメンバへの設定; connect(); send(bufferの文字列 → webserverSocket) while(1) { browserSocketまたはwebserverSocketが読み取り可能になるまで待機; if (browserSocketからrecv()できるなら) { recv(browserSocketからの文字列 → buffer); /* ① */ if (recv()が失敗したら) break; send(bufferの文字列 → webserverSocket) /* リクエストの転送 */ if (①のrecv()の結果,browserSocketがクーロズされていたとわかった(つまり0バイト受信)) { break; } if (webserverSocketからrecv()できるなら) { recv(webserverSocketからの文字列 → buffer); /* ② */ send(bufferの文字列 → browserSocket) /* レスポンスの転送 */ if (②のrecv()の結果,webserverSocketがクーロズされていたとわかった(つまり0バイト受信)) { close(browserSocket); close(webserverSocket); return 0; スレッドorプロセス によって作成した子の中で Selectを用いればよい ※あくまでも一例です.また,引数や実装方法が簡略化されています.

HTTPのリクエスト,レスポンスはテキストデータである. webサーバの特定方法 HTTPのリクエスト,レスポンスはテキストデータである. HTTP1.0 プロキシを用いたリクエスト GET http://www.inf.shizuoka.ac.jp/ HTTP/1.0\r\n Host: www.inf.shizuoka.ac.jp\r\n (以下省略)

※接続先ポート番号は今回は80番で固定でOK webサーバの特定方法 HTTP1.0 プロキシを用いたリクエスト GET http://www.inf.shizuoka.ac.jp/ HTTP/1.0\r\n Host: www.inf.shizuoka.ac.jp\r\n (以下省略) ホスト名が特定できた =名前解決でIPアドレスが分かる ※接続先ポート番号は今回は80番で固定でOK

※接続先ポート番号は今回は80番で固定でOK webサーバの特定方法 HTTP1.0 プロキシを用いたリクエスト GET http://www.inf.shizuoka.ac.jp/ HTTP/1.0\r\n Host: www.inf.shizuoka.ac.jp\r\n (以下省略) “Host: ”がないならば “GET”からホスト名を特定 ※接続先ポート番号は今回は80番で固定でOK

実装上の注意 プロキシを使う場合と使わない場合ではリクエストが異なる! webブラウザによっては… プロキシ使用 プロキシ未使用 GET http://www.inf.shizuoka.ac.jp/ HTTP/1.0\r\n Host: www.inf.shizuoka.ac.jp\r\n (以下省略) プロキシ未使用 GET / HTTP/1.0\r\n Host: www.inf.shizuoka.ac.jp\r\n (以下省略)

実装上の注意 プロキシを使う場合と使わない場合ではリクエストが異なる! webブラウザによっては… プロキシ使用 プロキシ未使用 GET http://www.inf.shizuoka.ac.jp/ HTTP/1.0\r\n Host: www.inf.shizuoka.ac.jp\r\n (以下省略) プロキシ未使用 GET / HTTP/1.0\r\n Host: www.inf.shizuoka.ac.jp\r\n (以下省略) リクエストをwebサーバに転送するときは“GET”メソッドから “http://ホスト名”を削除しておこう!! ※メソッドは”GET”だけとは限りません あくまでも“http://ホスト名”を削除するだけで それ以外の部分をプロキシ側で書き換えてはいけません

まとめ webプロキシプログラムは ブラウザからのconnect()をaccept()する ブラウザとの通信用のソケットを並列処理に持っていく 以下,並列処理 ブラウザからリクエストを受け取る ブラウザのリクエストからwebサーバを特定する webサーバとの通信用ソケットを作成し,connect()する ブラウザのリクエスト,webサーバからのレスポンスを転送する(このとき,リクエストはあらかじめ適切に変換しておく) ソケットを閉じる