コンピュータネットワーク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) - データグラム通信 実装例

ネットワークプログラミング 2章 ソケット

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