コンピュータネットワーク2
2016年度 臨時担当用資料
第11回 TCP と UDP
実習概要:
プログラム言語 Scala の REPL環境でTCPおよびUDPのプログラムを実行する。
REPL環境では、コマンド単位で対話的にプログラムを実行できる。
プログラムはこのページに記載のものを利用する。
提出物:
eclipse のScala コンソール上の実習内容のメッセージをコピーしてWebclassに提出。
実習手順:
eclipse の起動
スタート →ボリュームD: →eclipse →eclipse.exe
ワークスペースの設定
ボリュームD に新規フォルダ 学籍番号CN2 を作成し、ワークスペースに設定する
ようこそ画面は片付ける。
Scalaプロジェクトの作成
ファイル→ 新規プロジェクト → その他→ Scalaウィザード →Scalaプロジェクト
次へ→ プロジェクト名 TCPUDP → 完了
Scalaアプリケーションの作成
REPL環境を利用するために、空のコードを作成する。
プロジェクト TCPUDP →src →右クリック →新規 →Scala App →名前 Test
コンソールを Scalaコンソール に切り替える
参考サイト: JavaによるUDP通信、TCP通信のコード例
ライトニングJava 52 UDP(1) - データグラム通信 実装例
UDPによる送受信実験 ブロードキャスト編
UDPによる受信例)
送信よりも先に受信の準備をします。
UDPはコネクションレス型通信なので、受信の準備ができていなくても、送信側は一方的にデータを送信できます。データが端末に到着した時点で受信準備ができていなければ、そのパケットは受信されずに失われます。
val receiveSocket = new java.net.DatagramSocket(5100)
val receiveBuffer = new Array[Byte](1024)
val receivePacket = new java.net.DatagramPacket(receiveBuffer, receiveBuffer.length)
receiveSocket.receive(receivePacket)
System.out.print(receivePacket.getAddress().toString())
System.out.println(new String(receivePacket.getData(),0, receivePacket.getLength()))
↑コンソールにコピー&ペーストした後、Enterします。最後の一行がコマンドとして実行されていない場合の対策です。
※このコードでは、receiveSocket は開いたままで閉じていません。以下の実験では、この開いたポートで何度か受信します。
※ receive の処理は受信完了までブロックされ、次のprintlnに進みません。 受信完了後に、コンソール画面にメッセージが表示されます。
受信の実験用に追加のコンソールを開きます。
先ほどの「コンソールを Scalaコンソール に切り替える」と同じ操作をします。
2個目のコンソールが開きます。1個目は隠れます。
標準出力に変更があった場合にコンソールを表示 の 設定ボタン を オフ にする。
コンソールの切り替え操作で、受信用コンソール と 送信用コンソール を切り替えできます。
以下のコードは、新しく開いた送信用コンソールで実行します。
※コンソールビューを増やす方法
1つのコンソールビューで、2つのコンソール(受信と送信)を操作すると、いちいち切り替えが面倒です。
2つのコンソールビューを開いて、以下の実験実施を推奨します。
方法; コンソールビューの メニューで 新規「コンソール」ビュー を開く
コンソールビューを横に並べる。
各コンソールビューに、別々のコンソールを表示する。
例)
送信&受信テスト:
UDPによるブロードキャスト送信例) ”HELO kobashi” の様にメッセージに名前を入れてください。
一行ずつコピペして実行します。2行目は、メッセージを編集してからEnterします。
val remoteAddress = new java.net.InetSocketAddress("192.168.152.255", 5100)
val sendBuffer = "HELO kobashi".getBytes()
val sendPacket = new java.net.DatagramPacket(sendBuffer, sendBuffer.length, remoteAddress)
new java.net.DatagramSocket().send(sendPacket)
↑最後の1行が送信コマンド。必要に応じてEnterを入力。
送信コードを実行すると、受信用コンソールにウインドウが切り替わり、「HELO」と表示されます。
※文字入力位置がずれて、コンソールが反応しなくなったら、 コンソールクリア のボタンを試す。
実験1:
以下のコードでパケットを何回か送信してから、受信してみてください。メッセージデータの名前の部分は自分のメッセージと分かるように書き換えてください。
val sendBuffer =
"HELO kobashi".getBytes()
val sendPacket = new java.net.DatagramPacket(sendBuffer, sendBuffer.length, remoteAddress)
new java.net.DatagramSocket().send(sendPacket)
以下のコードでパケットを何回か受信してみてください。
receiveSocket.receive(receivePacket)
System.out.print(receivePacket.getAddress().toString())
System.out.println(new String(receivePacket.getData(),0, receivePacket.getLength()))
受信側の通信バッファーに残っているパケットを受信できます。
※面倒な場合は、次の実験2に進めば無限ループで受信待機します。
実験2:
受信側のコードを修正し、無限ループで常時受信&表示するようにします。
while(true) {
receiveSocket.receive(receivePacket)
System.out.print(receivePacket.getAddress().toString())
System.out.println(new String(receivePacket.getData(),0, receivePacket.getLength()))
}
送信側で何回かデータを送信します。
new java.net.DatagramSocket().send(sendPacket)
new java.net.DatagramSocket().send(sendPacket)
new java.net.DatagramSocket().send(sendPacket)
受信状況を確認してください。
UDPによる送受信実験 ユニキャスト編
実験3:
送信先アドレスをブロードキャストアドレスから、実習中の受講生のPCのIPアドレスに変更し、送信実験をする。
実験4:
受信ポートを 学籍番号の末尾5桁、3114999 なら、14999 に変更し、
受信用コンソールを新しく開いて実行してください。
val receiveSocket = new java.net.DatagramSocket(14999)
val receiveBuffer = new Array[Byte](1024)
val receivePacket = new java.net.DatagramPacket(receiveBuffer, receiveBuffer.length)
receiveSocket.receive(receivePacket)
System.out.print(receivePacket.getAddress().toString())
System.out.println(new String(receivePacket.getData(),0, receivePacket.getLength()))
送信用コンソールから、
受講生どうしで相手のIPと相手のポート番号にデータを送信します。
val remoteAddress = new java.net.InetSocketAddress("192.168.152.70", 14999)
val sendBuffer = "HELO kobashi custom port".getBytes()
val sendPacket = new java.net.DatagramPacket(sendBuffer, sendBuffer.length, remoteAddress)
new java.net.DatagramSocket().send(sendPacket)
自分宛に送られてきたメッセージが表示されることを確認してください。
UDPによる送信実験 マルチキャスト編
省略します。
TCPによる送受信実験
省略します。
Cookieの確認
ブラウザ Google Chrome → その他のツール → デベロッパーツール (Ctrl + Shift + I )
Resources のタブを表示 → Cookies → www.nagoya-bunri.ac.jp
JavaScript による Cookie の読み書き。
サンプルコード利用1 http://javascript.eweb-design.com/1401_cn.html
サンプルコード利用2 http://javascript.eweb-design.com/1403_on.html
↑上記2つのファイルを、WebServer に Sample1.html と Sample2.html で設置。
※2016年度、N101情報実習室でXAMPPが起動できないため(要管理者権限)、下記の別の方法を試す。
場所: Dドライブ XAMPP → htdocs
xampp-control から Apache Web Server を起動し、Chrome で動作を確認と Cookie の確認をする。
確認用アドレス http;//127.0.0.1/Sample1.html
確認用アドレス http;//localhost/Sample2.html
※2016年度臨時対応
大学のWebサーバに、sFTP でファイルを転送する。
使用ソフト: WinSCP
場所: public_html
Chrome で アップロード他ページの表示確認と Cookie の確認をする。
確認用アドレス http;//www.nagoya-bunri.ac.jp/~学籍番号/Sample1.html
確認用アドレス http;//www.nagoya-bunri.ac.jp/~学籍番号/Sample2.html
Cookie の改ざんが可能か試す。Chomeのアプリか拡張機能で、cookie editor を検索して、試してみる。
※上記の参考サイトに掲載のコードは、XSS脆弱性があります。セキュリティの問題がありますので、実運用はしないでください。
XSSを試す。 参考サイト: https://www.websec-room.com/2013/03/14/567
telnet の実験
大学のWebServer の個人領域に、ファイルを設置する。
使うアプリ Tera Term
スタート → Tera Term 起動。
ユーザ名とパスワードは、パソコンのものと同じ。
操作例
Last login: Fri Jun 24 13:12:18 2016 from 192.168.152.70
-bash-4.1$ ls
-bash-4.1$ cd public_html
-bash-4.1$ ls
-bash-4.1$ touch cn2_sample.html
-bash-4.1$ echo "hello world" > cn2_sample.html
-bash-4.1$ ls
ここで、ブラウザからファイルを表示。
確認用アドレス http://www.nagoya-bunri.ac.jp/~学籍番号/cn2_sample.html
-bash-4.1$ who am i
ここで、課題提出用のスクリーンショットを撮影。
-bash-4.1$ rm cn2_sample.html
-bash-4.1$ ls
-bash-4.1$ exit
時間に余裕があれば、 D:ドライブの ローカルの Apache に ネットから探してきた CGI を設置して動作を確認してみる。
また、 Apache のアクセスログを表示して、記録内容を確認する。
※ 大学のWebサーバは、個人ユーザにCGIを開放していない。CGIの実習は別の機会に。
提出: 第11回の課題、 課題B として、提出
ターミナルや Web画面など、自習内容が分かるようなスクリーンショットをとり、WebClass にアップロードする。
スクリーンショットの例) 実習後半部分 cookie と telnet