【12日目】TCP/IPネットワーク入門(第5章UDP編)

皆さん,こんにちは.bb_lotusです. さて,今回はTCP/IPネットワークに関しての12日目のアウトプットになります.

すぐアウトプットだけ見たい人はこちらから

(ネットワーク初学者のため,記載内容等間違いがありましたらどしどしコメント,指摘等していただければと思います.)

使用する教材はこちらです.

 

Linuxで動かしながら学ぶTCP/IPネットワーク入門」

 

Linuxで動かしながら学ぶTCP/IPネットワーク入門 | もみじあめ |本 | 通販 | Amazon

www.amazon.co.jp

 

--------------↓ここからアウトプット--------------

さて,今回は第5章になります.

具体的な内容に関しては,トランスポート層プロトコルです.

その中でも特に今回はUDPというものに関してやっていきます!

 

~用語確認~

トランスポート層OSI基本参照モデルにおける第4層,IPのペイロードとなるプロトコル.(ペイロードとは,パケット通信においてパケットに含まれるヘッダやトレーラなどの付加的情報を除いた、データ本体のこと)

 

トランスポート層プロトコルTCPUDPなど.(パケットが経路上で破棄されないように観察する)

 

さて,それではUDPについて見ていきましょう.

TCP/IP - UDPとは

www.infraexpert.com

 

まず,イーサネットフレームを見てみると,UDPヘッダはIPのヘッダの直後にペイロードとして連結されている.

ということは,UDPヘッダの中に,通信するアプリケーションを区別する情報が入っている!

では,ここで通信するアプリケーションはどうやって区別するのか.

ポートとポート番号で区別!!

 

ncコマンドはサーバ・クライアント方式

まずはサーバとなる側を用意.

$ nc -ulnv 127.0.0.1 54321
Bound on 127.0.0.1 54321

コマンドのオプション,-ulnvはそれぞれ以下の意味みたいです.

-u:UDPで通信することを指定している.

-l:サーバとして動作させることを指定している.

-n:IPアドレスDNSで名前解決させないために指定する.

-v:コマンドの表示を詳細にするため指定する.

 

このコマンドの意味合いとしては,ncコマンドというアプリケーションがUDPの54321番ポートに入居する.

 

次に別のターミナルを開いて,クライアント側を用意しサーバに接続.

$ nc -u 127.0.0.1 54321

 

さらにUDP通信を観察するため,別のターミナルを開く.

$ sudo tcpdump -i lo -tnlA "udp and port 54321"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes

 

クライアント側で文字列を入力しサーバへメッセージを送る.

$ nc -u 127.0.0.1 54321
Hello,World!

 

サーバのターミナルを見るとクライアントで入力した文字列が反映されている.

$ nc -ulnv 127.0.0.1 54321
Bound on 127.0.0.1 54321
Connection received on 127.0.0.1 58684
Hello,World!

 

tcpdumpコマンドを実行したターミナルも確認すると..

$ sudo tcpdump -i lo -tnlA "udp and port 54321"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 127.0.0.1.58684 > 127.0.0.1.54321: UDP, length 13
E..)-*@.@............<.1...(Hello,World!

末尾に自分が入力した文字列が反映されているのが確認できます.

また,この文字列はUDPフォーマットのデータの部分(UDPペイロード)に格納され,運ばれています.

 

次は,サーバからクライアントへメッセージを送って見ましょう.

$ nc -ulnv 127.0.0.1 54321
Bound on 127.0.0.1 54321
Connection received on 127.0.0.1 58684
Hello,World!
Reply,World!

 

クライアントのターミナルを確認すると..

$ nc -u 127.0.0.1 54321
Hello,World!
Reply,World!

ちゃんと表示されていますね!

 

tcpdumpコマンドを実行しているターミナルも確認してみると,

$ sudo tcpdump -i lo -tnlA "udp and port 54321"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 127.0.0.1.58684 > 127.0.0.1.54321: UDP, length 13
E..)-*@.@............<.1...(Hello,World!

IP 127.0.0.1.54321 > 127.0.0.1.58684: UDP, length 13
E..)0S@.@..o.........1.<...(Reply,World!

送信元と送信先のポート番号が入れ替わってメッセージのやりとりがされているのが確認できます!

 

これにて,UDPでのパケットのやりとりが確認できました!!

重要なこととしては,

トランスポート層プロトコルで,ポート番号を確認すれば,それをやりとりしているアプリケーションが判断できるということ!

しかし,UDPには問題点があり,コネクションレス型という,送ったら送りっぱなしのプロトコルになっており,経路上でパケットが破棄されてもUDPは何もしてくれません.

そこで出てくるのがTCPさんです.

 

次回はそんなTCPさんを見ていきます!!

今回はここまで!

それではまた次回!!