ネットワーク

現実世界には無数の家が建っていますが、これらの家々を識別するにはどうすればよいでしょうか? 
そうです、住所ですね。住所があるからこそ、相手方へ宅配便を送れるのです。

では、ネットワークにも無数のコンピュータが接続されていますが、どうやって識別しましょうか?
そうです、IPアドレスです。IPアドレスは、住所と全く同じモデルです。

IPアドレスの正体とは、32Bitの数値データです。0か1が32個並んでいます。
IPアドレスの例:10110100101011010100110101001001


この32桁の数値は全部で4294967296種類の情報を表現できます。(2の32乗)つまり、42億台のコンピュータに、重複しない数列を渡せるということです。
ネットワークの世界では、このIPアドレスを用いて相手方のコンピュータやサーバーを探し出し、必要なデータを送出するのです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
しかし生のIPアドレスは読みにくいですね。……なぜわざわざBitで表記する必要があるのでしょうか。IPアドレスは32Bitです。なので4Byteで表記すればよいのです。

1Byteは8個の0と1を持ちます。
8個の0と1では、256種類の情報を表現できます
00000000~11111111=(256種類)
つまり、BitではなくByte(0~255)の整数でIPアドレスを表現できるということです。


つまり、213.192.255.0 のように表現することもできるということです。わかりやすくする為に1Byte毎に.を打ちました。
人間がコンピュータへIPアドレスを指定する時は、Byteを使います。
コンピュータはあらゆるデータを0と1へ変換しますから、勝手にIPアドレスへ変換してくれるのです。

ちなみにIPアドレスのオール0とオール1は特殊な機能を持っているのでコンピュータへ割り当てることはできません。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ぶっちゃけどうでもいい話なのですが、IPアドレスにはクラスがあります。

IPアドレスは、ネットワーク部とホスト部に分類できるという性質があります。

つまり、10110100101011010100110101001001というIPアドレスがあった時、
101101001010110101001101(ネットワーク部) 01001001(ホスト部)

のように分類ができるということです。
この分類は、1Byte毎に行われます。

10110100(ネットワーク部)101011010100110101001001(ホスト部)
このように分割されたIPアドレスを、AクラスのIPアドレスと呼びます。


AクラスのIPアドレスは、ネットワーク部が1Byteしかないので、世界中で254種類の機関しか持てません。(オール01を除くので)IPアドレスを割り振る際には、コンピュータ1台につき1つずつ割り振るのではなく、機関や団体単位で割り振ります。その際、ネットワーク部を1つ割り振ります。仮に00000001を割り振ったとすると、残り3Byte分のホスト部は、00000001ネットワーク部を貰った機関が自由に使えます。
つまり、00000001.00000000.00000000.0000000000000001.11111111.11111111.11111111 の範囲で00000001ネットワーク部を貰った機関がIPアドレスを割り振れるのです。

AクラスのIPアドレスは大量のコンピュータへIPアドレスを割り振る権利を持てるので、主に世界的な企業などが貰い受けます。

BクラスのIPアドレスは
1011010010101101(ネットワーク部)0100110101001001(ホスト部)
このようになっています。こちらは規模の大きい組織へ割り振られます。

CクラスのIPアドレスは
101101001010110101001101(ネットワーク部)01001001(ホスト部)
となっています。こちらはプロバイダなどへ割り振られ、その中のたった1つの数列がボク達のコンピュータへ割り振られます。

ちなみにIPアドレスがどのクラスかは、サブネットマスクを見れば分かります。
サブネットマスクはIPアドレスと全く同じ32Bitのデータです。IPアドレスとは別のデータですが、セットで扱います。

クラスAの場合、サブネットマスクには1が1Byte分立ちます
クラスBの場合、1が2Byte分立ちます。クラスCの場合、1が3Byte分立ちます。
サブネットマスクはIPアドレスの後ろに/で1の数を表す場合もありますし、1Byte単位で表現する場合、1が8個立っている状態は255を表すので、そのように表記するコンピュータもあります。

ご自身のコンピュータのIPアドレスやサブネットマスクを調べるには、コマンドプロンプトからipconfigと入力して下さい。
3

ボクのコンピュータのIPアドレスはクラスCのようですね。

ちなみにこれは余談です。頭の片隅にでも入れておいて下さい。
このエントリーをはてなブックマークに追加

コンピュータの世界ではあらゆるデータが0と1で表現されます。
なぜなら、Bitがコンピュータの最小単位だからです。
コンピュータの内部では、最終的には電圧が高いか低いかでデータを表現します。

つまり、0(電圧が低い)か、1(電圧が高い)がコンピュータにとっての最小単位なのです。
では画像や音楽も0と1の集合体なのでしょうか? そのとおりです。

このイラストを見て下さい。illust:江ノ木 椎茸
https://pawoo.net/@shitakenoki

この画像は362×272ピクセルの大きさです。ピクセルとは、1色を保存する単位です。
cyber_brain

一番左上の1×1ピクセルを見てみましょう。
1

画像とは、大量のピクセルの集合体なのです。
更に拡大してみると、ブロックで表現されているのが分かりますね。
2

一番左上のピクセルは黒色ですね。画像を0と1で表現するのは厳しいかもしれませんが、黒色を表現するのはできそうです。

ところであなたが見ているこのディスプレイは光の三原色を用いて色を表現しています。を重ねると色に、光を当てなければ黒色になります。この光の当て具合を調整することで色を作ることができるのです。

つまり、黒色は、赤の当て具合0, 緑の当て具合0, 青の当て具合0 で表現できるのです。
黒色=0.0.0 おや、いつの間にか数値に変換できましたね。
しかしまだ3桁もありますから、更に縮小して考える必要があります。

0.0.0の一番左側、赤色の0に着目しましょう。赤色の輝度(当て具合)を0~255とすると、(255でコンピュータへ最大出力を命じる)
0も含めて合計256種類の数値表現ができればよいのですね。(0~255=256種類)

ですが、0と1しか使えないとなると、2種類の表現しかできません(0~1=2種類)
では、0と1の数を増やしてみてはいかがでしょうか?

1桁で表現しようとするのではなく、2桁で表現するのです。
0と1 0と1 つまり 00, 01, 10, 11 で4種類の情報を表現できますね(2×2)

このように桁を増やして256種類表現してみましょう。256種類表現するには

2の2乗が256になるまですればよいのですね。結果、2の8乗で256種類の情報を表現できます。8桁あればよいのですね。
つまり(00000000~11111111=256種類)なのです。

42.195kmも1km単位、1m単位、1cm単位、1mm単位へと縮小していけば、1mmで表すことができるのと同じですね。42.195km=42195000mm


このように、大きなデータも小さく分割していくことで、1Bit(0か1)へ変換できるのです。
ちなみに……
8Bit=1Byte
1024Byte=1MByte
1024MByte=1GByte

です。
それぞれBit(ビット)、Byte(バイト)、MByte(メガバイト)、GByte(ギガバイト)と読みます。
ごちゃごちゃしてきたときは、バイト系が大きいことを思い出してください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
次の講座
【2限目】ネットワークバイトオーダー
[難易度:★☆☆☆☆] ネットワーク上に流れるデータの規則について学習します。

前の講座
【0限目】TCP/IP通信とは
このエントリーをはてなブックマークに追加

ネットワークバイトオーダー
今このWEBページを表示しているということは、あなたのPCはネットワークへ繋がっているということですね。

さて、ネットワークの世界には様々なコンピュータが接続されていますが、なぜどのコンピュータでWEBページを見ても同じページが表示されるのでしょうか? なぜどのコンピュータでファイルをダウンロードしても同じデータを手に入れられるのでしょうか?
例えばIntelのCPUかARMのCPUかでバイト列の解釈方法は違います。
(バイト列とは、前回のビット列を1段階拡張させただけの概念です)


実はネットワークへアップロードされているデータはあるルールに基づいているのです。
そのルールのことをネットワークバイトオーダーと呼びます。
ネットワークバイトオーダーへの変換は簡単です。まともなAPIやライブラリであれば、変換用の関数が用意されているはずです。これから学習するWinSockやBSDSocketにももちろん搭載されています。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
次の講座
【3限目】IPアドレス
[難易度:★★☆☆☆] IPアドレスについて学習します。(其の壱)

前の講座
【1限目】Bit と Byte
このエントリーをはてなブックマークに追加

TCP/IP通信とは
TCP(Transmission Control Protocol)とは通信プロトコルのことです。
プロトコルとは、規格という意味です。

ネットワークの世界では相互通信を実現するために、互いのPCあるいはアプリケーションが同じルールに基づいて通信を行う必要があります。
TCP/IPは世界共通の通信規格です。TCP/IP技術により、今日インターネットが構成され、国を問わず通信を行うことができます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
また、TCP/IP通信とは、通信プロトコルの総称です。
TCP/IPの中には、様々なプロトコルが内包されており、プログラマは自身のアプリケーションに適合したプロトコルに基づいてプログラミングを行います。

例えば、音声データを転送したいときは、VoIP(Wikipedia)ハイパーテキストを転送したいときは、Hypertext Transfer Protocol(Wikipedia)などを使います。

なお、TCP/IP通信という呼び方は、最も代表的なプロトコルであるTCPIPから取られています。
11

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
本講義ではTCPとUDPに合わせた通信プログラムを作成します。
更に、基幹技術であるIPについても学習します。

TCP(Transmission Control Protocol)の特徴
・規格が厳正に定められており、パケット(送信するデータの最小単位)がロスしたときには再送処理を行う。互いにSYN(発信)とACK(返信)を行い、データが確実に転送できることが判明した場合にのみ通信を開始するデータサーキットを構成して通信を開始する。

UDP(User Datagram Protocol)の特徴
・転送の為の最低限の機構しか持たない。パケットがロスしても再送処理は行わず、データが転送できるか否かに関わらずとりあえず転送する。データサーキットを構成しない。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
IP(Internet Protocol)とは、TCPとUDPの下層に存在する基幹技術である。TCPもUDPも、IPを利用して通信を行う。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

次の講座
【1限目】Bit と Byte
このエントリーをはてなブックマークに追加

まずは下の動画を見て下さい。

※曲は僕の大好きな Lose Yourself です。

閲覧ありがとうございます。このページではオンラインゲームの作り方を解説します。
僕の名前はRyuです。
世界中の誰かとランダムにマッチングして、1:1で対戦するカードゲームを作った経験を持ちます。

http://jamfolder.work/DMS

残念ながらサーバー台を捻出できなくなったり、モチベーションが落ちたりして現在はサービス終了しています。

オンラインゲームを作るルートはいくつもあります。
僕が取ったルートはこちらです。
C言語→C++言語→DXライブラリ→Winsock2→Linux/CentOS7 & BSDSocket

ちなみにDXライブラリはゲームの根幹の部分を制作するのに必要なだけで、通信機能とは一切関係ありません。お好きなライブラリでどうぞ。


他には……
C言語→C++言語→UnrealEngine
C#言語→Unity
Java言語→サーバーサイド

などのルートがあります。

僕が取った具体的なルートを提示します。
ここに書いてある修行を全てこなすことができれば、オンラインゲームは作れるようになります。

C言語→C++言語→DXライブラリ→Winsock2→Linux/CentOS7 & BSDSocket
スラスラわかるC言語 (Beginner’s Best Guide to Programmin)
・表記されているサンプルコードを90%以上写経する。(書き写す)
・読み進める過程で、なぜこうなるのかを理解する。

独習C 第4版
・表記されているサンプルコードを90%以上写経する。
・読み進める過程で、なぜこうなるのかを理解する。

やさしいC 第5版
・ポインタの章, 配列・ポインタの応用の章のみ読む
・読み進める過程で、なぜこうなるのかを理解する。

C言語→C++言語→DXライブラリ→Winsock2→Linux/CentOS7 & BSDSocket
C++ の絵本
・表記されているサンプルコードを90%以上写経する。
・読み進める過程で、なぜこうなるのかを理解する。

独習C++ 第4版
・表記されているサンプルコードを90%以上写経する。
・読み進める過程で、なぜこうなるのかを理解する。
(第9章は第13章の後に取り組んでも可)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
・1回読む。(サンプルコードの写経は必要ない)


C言語→C++言語→DXライブラリ→Winsock2→Linux/CentOS7 & BSDSocket
https://dixq.net/g/ にてDXライブラリの基礎を学ぶ。

https://bituse.info/game/shot/ にてオブジェクト指向的ゲーム開発(機能分割型ゲーム開発)の基礎を学ぶ。


C言語→C++言語→DXライブラリ→Winsock2→Linux/CentOS7 & BSDSocket
マスタリングTCP/IP 入門編 第5版
・1回読む(サンプルコードの写経は必要ない)

猫でもわかるネットワークプログラミング 第2版
・第1章/第4章/第6章/第7章のコンソールの部分だけを勉強する。
・上記の章の表記されているサンプルコードを50%(コンソールの部分)以上写経する。
・読み進める過程で、なぜこうなるのかを理解する。
・Win32GUIの話は理解さえできればよい。また、サンプルコード写経の必要はない。

WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミングのすべて
・1回読む
・表記されているサンプルコードの内、気が向いたものは写経する。
・読み進める過程で、なぜこうなるのかを出来る範囲で理解する。

DXライブラリもWinsockも、関係ないライブラリとAPIなので、そのままincludeすると競合します。
競合を回避するには下のリンクの記事を読んで下さい。
DXライブラリとWinsock2を併用する方法
http://jamfolder.work/archives/22073653.html


C言語→C++言語→DXライブラリ→Winsock2→Linux/CentOS7 & BSDSocket
Linuxネットワークプログラミング
・表記されているサンプルコードを90%以上写経する。
・読み進める過程で、なぜこうなるのかを理解する。

サーバーサイドプログラムは家の余っているPC等にLinux/CentOS7等をインストールしてEclipse CDT を使用して書く。また、完成したサーバーサイドプログラムはさくらVPS等に載せる。

詰みそうなポイントは当ブログの記事(http://jamfolder.work/Programming)にも書いてある
WSAEventSelectの挙動などで分からないことがあれば参考にして欲しい。


また、本当に分からなくて困った時はこちらのメールへ相談頂ければ対応します。
但し、私も1人の人間なので解決できない問題もあります。
(★を@へ変更して下さい)
duemachine★gmail.com


結局のところゲーム制作は根気と根気と根気である。
簡単に諦めず、なんとか喰らいつこう。
このエントリーをはてなブックマークに追加

↑このページのトップヘ