Javascriptのスコープ(関数、グローバル、ES6はブロック)と巻き上げについて
jsのローカルスコープは関数内のみを参照できることであり、グローバルスコープはscriptのどこからでも参照できることを指す。ローカルスコープを持つ変数をローカル変数、グローバルスコープを持つ変数をグローバル変数という。
スコープは変数が定義された位置で決まり、関数の外で定義されればグローバル変数、関数の中で定義されればローカル変数となる。
- 関数の外でグローバル変数を定義し、中でローカル変数を定義できる。関数内でもvarをつけなければグローバル変数を定義できる。
- 変数の巻き上げ(hoisting)で、グローバル変数への参照を、ローカル変数への参照へスイッチできる。
jsでは、関数内のどこからでもローカル変数を定義できるが、関数内のどこで定義されても、その関数内の先頭で定義されたことになる。
上記のような結果になるのは、関数の先頭で、var global;という中身のない変数が定義され、globalという名前空間がローカルスコープを参照するようになったためである。=>変数定義は必ず先頭で行うこと、でないとローカル変数を参照しているかグローバル変数を参照しているかわからなくなります。
- ブロックスコープはES6からサポートしている。
ECMAScript6より前の仕様では、ブロックスコープを採用していなかった。
ES6以降はletを使うと、ブロックスコープを作れるでござる。
ES 6で開発するにはBabelか、
気軽に試したかったら、fiddleで試してみてください。
Javascriptが持つ関数型言語の特徴(第一級関数、高階関数)
jsはプロトタイプベースのオブジェクト指向言語と呼ばれているが、関数型言語の性質も持ち合わせている。
第一級オブジェクト(first-class object)と第一級関数(first-class function)
第一級オブジェクトとは、プログラムにおいて、生成、代入、演算、(引数、戻り値)としての受け渡し、など基本的な操作を制限なしに使用できるオブジェクトを指す。第一級関数は、関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質を指す。言語によって、第一級オブジェクトと第一級関数の性質は異なってくるが、jsでは以下の点をサポートしている。
- 関数をリテラルとして扱うことができる。無名関数を生成し、変数に代入できる。(リテラルとは、数値や文字列など、プログラムで特定のデータ型を用いて直接表記された値のこと。書式を指すこともある。)
-
関数を動的に生成できる。 js first-class object and first-class function
高階関数(higher-order function)
高階関数とは、関数を引数に取る関数のこと。
- 引数に関数を渡すことができる。
- 戻り値に関数を渡すことができる。
MVCアーキテクチャについて調べたこと
MVCアーキテクチャは、ソフトウェアの構成と役割について言及した概念のひとつ。1978年にXerox Parc(パロアルト研究所)のTrygve Reenskaugが、Smalltalk-76で使われているMVCモデルについて紹介したのが始まりと言われている。Trygve Reenskaug本人のウェブサイトには以下の記述がある。
The essential purpose of MVC is to bridge the gap between the human user's mental model and the digital model that exists in the computer.
MVCの目的は、開発者が作りたいソフトウェアのイメージを、コンピューターのデジタルモデルに変換すること。
1988年に、MVCについて書かれた論文が公開された。
"A Cookbook for Using the Model-View-Controller User Interface Paradigm in Smalltalk-80"
この論文で、MVCアーキテクチャの各コンポーネントの役割と依存関係がまとめられている。18ページとそんなに長くないのでいつか見てみよう。
ユーザーインターフェースを持つアプリケーションを設計するアーキテクチャ。
アプリケーションの内部処理と、ユーザーに対する入出力処理を分離することが目的。
アプリケーションを3つのレイヤーに分割し、それぞれが決められた役割を担当する。
Model (data, logic, rule)
アプリケーションデータ、ビジネスルール、ロジックなどの処理を持つ。
View (UI, presentation, logic)
テキスト、グラフ、図など、情報表現をする。
Controller (façade, flow controll)
ユーザーからの入力を受け取り、ModelとViewへの命令に変換する処理を持つ。
(※façadeとは、Gof(Gang of Four)によって定義された、コンピューターソフトウェアのデザインパターンのひとつ。直訳すると「建物の正面」。処理時間の独立性を高めるために、処理を呼び出す単純な操作だけを持ったクラスを提供すること。)
Server-side MVC と Client-side MVC の違い
Server-side MVCモデルを採用したアプリケーションは、基本的にHTTPリクエスト-HTTPレスポンスのコミュニケーションをサーバーと行う。Viewの生成はサーバーサイドで行う。
Client-side MVCモデルを採用したアプリケーションは、Ajax(非同期通信)またはHTML5のWebSocketを用いて、サーバーとの通信を行う。Viewの生成はクライアントサイドが動的に行う。ブラウザのローカルストレージにデータを保存し、サーバーとの通信時間を少なくする。
WebSocket: webサーバーとwebブラウザ間の双方向通信用のプロトコル。TCP上で動く。サーバーとブラウザがハンドシェイクを行い、持続的なコネクションを確立した後は、必要な通信を全てそのコネクション上で、専用の軽量プロトコルを用いて行う。サーバー、ブラウザのどちらからでもデータの送信を開始できる。
URIスキーマはws:。wss:はセキュアなWebSocket通信を実現する。
W3CはAPIの規格を策定中。The WebSocket API
IETFはプロトコルの規格を策定中。RFC 6455 - The WebSocket Protocol
localstorage: ブラウザ側でKey-Value型のデータを保存する機能。クッキーの保存容量が4KBytesなのに対し、ローカルストレージでは5MBytesまでのデータを無期限で保存可能。
MVCモデルから派生したMVPモデル、MVVMモデル、MVWモデル
新技術の普及を背景に、MVCモデルでは整理しきれなくなったデータやロジックを誰が担当するか、という問いの解決策として新たなデザインパターンが派生した。
MVPモデル:モデル、ビュー、プレゼンターからなる。MVCモデルではどこにも属さなかった、ビューに関する動的なデータ(他の値によって、値を変える背景色などのデータ)とそのロジックはプレゼンターが担当する。モデル自身はビューやプレゼンターに依存せず、純粋なビジネスロジックのみを持つ。ビューは画面の表示とユーザー入力の受付口を担当し、入力されたデータをプレゼンターに渡す。
MVVMモデル:ビジネスロジックとプレゼンテーションロジックを分けることを目的としたデザインパターン。ViewはUIの外観と構造を定義し、いくつかのプレゼンテーションロジックを含む。ViewModelはプレゼンテーションロジックとステート(=状態)を含む。Modelはビジネスロジックを担当する。ViewのDataContextプロパティにViewModelのインスタンスを設定することで、ViewはViewModelとデータバインドを行う。
MVWモデル:GoogleのIgor MinarがAngular.jsを紹介するときに用いたデザインパターン。Model-View-Whateverの略。プレゼンテーションの中で"Whatever stands for 'whatever works for you'."「Whateverの意味は動けばなんでもいいということ」と紹介している。MV*とも書く。
オブジェクト指向と、言語の進化を辿るということ
オブジェクト指向とは、属性と振る舞いを持つオブジェクトを作るための「型」を作ることを意識しながらプログラムを書くこと。
と言われても理解は深まらないので、オブジェクト指向ではない指向とはどんなものかを理解して、比較をすることで、理解を深めよう。比較対象はプロセス指向である。
処理にデータを渡し、値を得ることをプロセス指向と呼ぶ。プロセス指向とは、プログラムはデータと処理からできており、プログラム内でデータは変数、処理は関数として表される。データは処理の対象であり、処理にデータを渡して値を求める。
オブジェクト指向とは、プログラムはオブジェクトとメッセージからできており、プログラム内でオブジェクトは「属性(パラメータ)」と「振る舞い(クラスメソッドやインスタンスメソッド)」を持ち、メッセージは振る舞いを呼び出す「処理」として表される。プログラムは複数のオブジェクトで構成され、オブジェクトは処理能力を持つデータである。オブジェクト(データ)にメッセージ(処理)を渡すことで値を求める。
プロセス指向であるC言語と、オブジェクト指向プログラミングができるJavaの文法を比較する
【C言語で文字列の長さを求める】
strlen(s)
処理strlen()にデータsを渡している。
【Javaで文字列の長さを求める】
s.strlen()
自身の長さを求める処理を持つデータsに、処理を呼び出すメッセージstrlen()を渡している。
※JavaのクラスライブラリにはMath.sqrt(3)のように属性のないクラスメソッドが存在する。Javaは純粋なオブジェクト指向ではなく、開発者の志向によって、プロセス指向で書かれたり、オブジェクト指向で書かれたりする。
オブジェクト指向プログラミング(OOP: Object Oriented Programming)について
現在普及しているOOP言語にはC++/Java/C# がある。次にOOPで使われる言葉の定義をいくつか記す。この定義は上記の3言語で共通の意味を持つ。
クラス:データと処理をまとめたモジュール、複数の型のパラメータを持つ複合データ型。
クラスのインスタンス:クラスをデータ型とした変数、メモリにロードされたもの。
オブジェクト:クラスインスタンスの別名。
クラスがあることによって使える機能に、カプセル化・多態性がある。
カプセル化(encapsulation):システムを独立した小さなプログラムの集合体として管理できる。モジュール間のつながりは関数呼び出しのみであり、変更に強い。不必要な機能は非公開にし、プログラムをシンプルに保つ。
多態性(polymorphism):クラス型が異なっても、同じ機能には同じ名前がつけられるので、人間の感覚では同じ関数が対象となるオブジェクトの型によって異なる手続きを行っているように見える。
OOPに役立つ、23種類の設計パターンのアイデア集のこと。生成・振る舞い・構造のパターンに分類できる。
言語の進化を辿るということ
ちょうど1年前にC言語の勉強を始めた頃、それまでRubyしか触れたことのなかった私は、ポリモーフィズムが素晴らしいアイデアなのだと知った。最近はSmalltalkが純粋なOOP言語であることを知り、言語の進化の歴史を知ることができた。Smalltalkは発明当時では画期的なアイデアであるOOPを採用したが、制御構造もデータ型も演算子もなく、すべてをメッセージとして実行するという欠点があった。
例えば、Smalltalkで下記を実行すると16を返す。
3+5*2
メッセージに優先順位がなく、左から順に実行されるからだ。これでは数学の演算ルールと異なるので、JavaやC言語に慣れた多くの人は使いにくいと感じるだろう。現在では、プログラミング言語は数学の演算法則に従うことが当たり前だからだ。
Rubyが影響を受けた言語を辿ると言語の進化を見ることができる。Rubyは「オブジェクト指向の動的型付け言語」と言われている。Rubyは強い動的型付けを行う。動的型付け言語とはプログラムの実行時に変数の型を決める柔軟な言語のことである。例えば、関数の実引数と仮引数の定義時にデータ型を定義せずに済み、シンプルなプログラムの記述が可能となる。Rubyに影響を与えたと言われる言語を遡ると、「プロセス指向静的型付け言語」から徐々に現在の形に進化を遂げていることがわかる。例えば、C言語は弱い静的型付け、C言語に影響を与えたALGOLは強い静的型付けだった。
言語の進化により、開発者はストレスなくプログラミングを楽しむことができるようになる。また、言語の歴史を知ることで、言語に親しみと感謝を持つようになるので、技術の歴史を学ぶことはやはり重要なのだと思う。
Javaソースコードが実行されるまでの流れについて調べた
Javaでいうコンパイルという動作は、C言語とRubyのそれと、どのように違うのか調べた。
OSやハードウェア依存のJavaプラットフォームで、ソースコードのコンパイルと実行が行われる。コンパイルされたJavaソースコードはバイトコード(中間言語)で書かれたJavaのプログラムに翻訳される。このプログラムは、全てのJavaプラットフォーム環境で同一に動く。Javaプラットフォームは、大きく分けて実行環境および開発環境を含む。
Javaプラットフォームは様々なプログラムから構成される。実行に必要な仮想マシン、開発に必要な標準ライブラリセット、コンパイラ等を梱包する。これらを個々のマシンのOSやハードウェアにあわせて構築することを「Javaプラットフォームを構築する」という。これにより、バイトコード(中間言語)で書かれたJavaプログラムが、全てのJavaプラットフォーム環境で同じ動作をするようになっている。これをプラットフォーム非依存といい、Javaの目標の一つとなっている。Javaの思想が生まれる以前の、多くのプログラミング言語は、プラットフォーム(CPU)に依存したネイティブなコードにコンパイルすることを前提として、設計されていた。
Javaソースコードが、コンパイルされて、実行されるまでの流れ
- Javaコンパイラが、Javaソースコードを、Javaバイトコードに翻訳する。
- JavaバイトコードをJREで実行すると、実行直前にJITコンパイラ(Just In Timeコンパイラ)が、Javaバイトコードを対象CPUの機械語(ネイティブなプロセッサ命令)に翻訳する。
- JITコンパイラはJava仮想マシン上で動く。プログラム実行中はメモリ上にネイティブコードをキャッシュする。
また、多くのJavaバイトコードはJava仮想計算機規定(The Java Virtual Machine Specification)が規定する形式に準拠する。
OSやハードウェア依存の実行環境を構築する。
Cコンパイラで、C言語で書かれたソースコードを、アセンブリソースに翻訳する。アセンブリソースに書かれているのは、mov(move=データをコピー)やadd(addition=加算)などのニーモニックである。
ニーモニックはマシン語の個々の数値が表す命令に、英単語を短くしたようなニックネームを付けたものを指す。
データの入出力を行うニーモニック命令
ニーモニック | 意味 | 機能 |
LD | LoaD | メモリーからCPUへデータを読み込む |
ST | STore | CPUからメモリーにデータを書き出す |
LAD | Load ADdress | CPUのレジスタに値を設定する |
PUSH | PUSH | スタックにデータを書き出す |
POP | POP | スタックからデータを読み込む |
SVC | SuperVisor Call | I/Oとの入出力を行う |
引用( 1週間で学ぶIT基礎の基礎 - 【5分で覚えるIT基礎の基礎】だれでも一度はアセンブラを学んでおこう! 第2回:ITpro )
アセンブラが、アセンブリ言語で書かれたアセンブリソースを機械語プログラムに翻訳する。
機械語は16進数の数値の羅列で構成された、コンピューターのCPUで直接実行される一連の命令。
Rubyの処理系はインタプリタの実装が多いため、インタプリタ言語と呼ばれることがあるが、言語がインタプリタ言語かコンパイル言語かという定義は排他的にひとつに決まるものではない。実装による。また、MRI1.9以降の実装はコンパイラを持つ。
1行ずつ解釈しても、コンパイラがクラスやモジュールごとにバイトコードに翻訳して実行しても、最終的にはCPUが実行しているのは機械語である。
Rubyの公式な実装には以下の2つがある。
- MRI(Matz' Ruby Implementation): C言語で実装されたRubyの公式処理系。
- YARV (Yet Another Ruby VM) : 笹田耕一氏が開発するRuby言語処理系。2007年12月25日にYARVが正式に組み込まれたMRI1.9がリリースされた。
1.8系まではソースコードを抽象構文木(AST: Abstract Syntax Tree)に変換し、そのツリー構造をたどりながら処理を実行していた。1.9系では 、ASTに変換し、さらにそれをコンパイラがバイトコード(数字列)に翻訳してから、仮想マシン上で実行している。
正直、これだけだとRubyが具体的にどのように実行されるのか分からなかったので、本を読むことにした。
外国人が書いたものを、日本語に訳しているのが少し切ないけど、(国産の言語だから)まつもとさんとささださんの付録があるから、きっと公認ではあるのでしょう:)
ネットワーク機器とIPアドレス、ポート番号について調べた
ネットワークを構築するネットワーク機器
有線用機器
ルーター/L3スイッチ: IPアドレスを使って、データの配送先を制御する。インターネットなど、外部のネットワークと接続。
L2スイッチ(スイッチングハブ): MACアドレスを使って、データの配送先を制御する。パソコン同士、ネットワークプリンタなどの1対1での通信をLANで行う。端末が多い時はL2スイッチ同士を接続できる。これをカスケード接続と呼ぶ。
ハブ(リピータハブ): 宛先に関係なく、端末から届いたデータをLAN内全ての端末に配信する。データを受け取った端末は送られたデータが自分宛てでなければ、そのデータを破棄する。電気信号の増幅機能も持つ。現在はほとんど使われない。
リピータ: 電気信号を増幅し、全ての端末に流す。電気信号の衝突(コリジョン)が発生し、電気信号の波形が崩れ、通信フレームが破壊される現象が多発する。
ケーブル: 電気信号で通信データを伝達する。
有線用NIC(Network Interface Card): LANの接続口、別名がいろいろ。LANカード、LANボード、LANアダプタ、ネットワークカード…
無線用機器
アクセスポイント(Wireless LAN access point): 無線端末を相互に接続したり、他のネットワーク(有線LAN)に接続する。有線LANと無線LANを相互接続役割もあるため、無線ブリッジとも呼ばれる。無線LANルーターと呼ばれる製品は、ルーターとアクセスポイントの複合製品。
無線用NIC: 電波の送受信ができる。
MACアドレス: NICごとに割り当てられた固有のID。OSI参照モデルの第2層データリンク層の通信制御(送信先、宛先の指定)に使われる。48bitの数値を":"や"-"で区切って16進数で表記される。前半の24bitはベンダーIDまたはメーカー番号と呼ばれ、後半24bitは端末固有の番号となる。
IPアドレス: ネットワーク上の固有の端末を、ネットワークアドレスとホスト番号で識別するためのアドレス情報。OSI参照モデルの第3層ネットワーク層の通信制御に使われる。32bitのデータを8bitずつ"."で区切り、10進数で表記する。ネットワーク部とホスト部に分かれており、サブネットマスクを2進数に直して、1が続く上位桁がネットワーク部となり、0が続く下位桁がホスト部となる。
インターネットを利用するにはIPアドレス、サブネットマスク、デフォルトゲートウェイ、DNSサーバーアドレスの設定が必要となる。手動で設定する方法と、DHCPを使って自動でIPアドレスを割り当てる方法がある。
IPアドレスはなぜクラス分けされているか
IPv4のアドレスは約43億個あり、その中の約5億個は特定の用途に用いることが決まっていて、グローバルアドレスとして使用できない。IPアドレスは利用者を想定して、次の5つのアドレスクラスに分かれている。()内には2進表記にしたときの先頭が何で始まるかが書かれている。
クラスA 0.0.0.0 - 127.255.255.255 ネットワークアドレス部は8ビット。RFC 791で規定。(0-で始まる)
クラスB 128.0.0.0 - 191.255.255.255 ネットワークアドレス部は16ビット。RFC 791で規定。(10-で始まる)
クラスC 192.0.0.0 - 223.255.255.255 ネットワークアドレス部は24ビット。RFC 791で規定。(110-で始まる)
クラスD 224.0.0.0 - 239.255.255.255 IPマルチキャスト専用。RFC 1112で規定。(1110-で始まる)
クラスE 240.0.0.0 - 255.255.255.255 将来の使用のために予約されている。RFC 1112で規定。(1111-で始まる)
クラスAはネットワーク部が短く、ホスト部が長いため、多くの端末を保有する大組織や多くの顧客を持つインターネットサービスプロバイダに割り当てるのに適している。クラスCはその逆。実際は、ほとんどのネットワークがクラスAでは大きすぎ、クラスCでは小さすぎたため、割り当ての要求がクラスBに集中した。そのため、現在ではアドレスクラスを使わず、ネットワーク部とホスト部の境界を8bit単位に固定しない可変長サブネットマスクやCIDR(Classless Inter-Domain Routing)の使用が一般化している。
IPアドレスの種類
グローバルIPアドレス:インターネット上で使えるアドレス。
プライベートIPアドレス:LAN内で使えるアドレス。予約されているアドレスは以下の通り。
- 10.0.0.0 - 10.255.255.255 (Aクラスの最初の方)
- 172.16.0.0 - 172.31.255.255 (Bクラスの最後の方)
- 192.168.0.0 - 192.168.255.255 (Cクラスの最初の方)
ネットワークアドレス:ネットワーク全体を表すアドレス。ホスト部のビットが全て0。
ブロードキャストアドレス:LAN内の端末に電気信号を送るためのアドレス。ホスト部のビットが全て1。
ループバックアドレス:自分自身を表す仮想的なアドレス。ローカルホスト。127.0.0.1。
ポート番号は3つのグループに分けられる
ポート番号とは、コンピューターがデータ通信を行う際に、通信先コンピューターのプログラム(アプリケーション)を特定するための番号である。指定できる番号の範囲は各プロトコルごとに0から65535(16ビット符号なし整数)と決められている。
ポート番号は大別して3種類に分けられる。
- Well-known port 0-1023番
- Registered port 1024-49151番
- Dynamic/Private port 49152-65535番
Well-known portはIANA(Internet Assigned Numbers Authority)が割り当てを行っており、主にFTP(20,21),SSH(22),TELNET(23),SMTP(25),HTTP(80)などシステムレベルで重要なプロトコルで使われている。Registered portはソフトウェアベンダーが独自アプリケーション用に申請し、IANAが管理するポート。Dynamic/Private portはユーザーがローカルで自由に利用できるポート番号である。
ネットワークアーキテクチャと標準化組織について調べた
ネットワークアーキテクチャとは、ネットワークにおいて必要な論理構造やプロトコルを体系的に定めたもの。代表的なアーキテクチャに、OSI参照モデルとTCP/IPモデルがある。
OSI参照モデルとTCP/IPモデルはどのようにして生まれたか
現在のインターネットのような「パケット通信ネットワーク」の研究が始まったのは1968年。その後、複数の組織が独自にネットワークの研究を進め、複数のネットワーク技術が市場に出回った。以下はその例である。
- アップルコンピューター社製のApple Talk
- IBM社製のNetBEUI
- DEC社製のDECnet
- ノベル社製のIPX/SPX
しかし、これらの技術を搭載したコンピューター製品は互いに互換性がなく、通信ができなかった。そのため、業界共通のネットワークの標準化が進められた。
1977年から1984年にかけて、国際標準化機構(ISO)と国際電気通信連合(ITU-T)がネットワーク技術の標準化を行った。そのとき策定されたのが、OSI(Open Systems Interconnection=開放型システム間相互接続)である。1977年にISOが定めたOSI参照モデルは、OSIのために定義された、プロトコルの階層モデルである。
しかし、OSIの標準化が進められている間に、1970年代初期から米国国防高等研究計画局(DARPA)で研究が進められていたTCP/IP(インターネットプロトコルスイート)が業界で広く使われるようになり、結局OSIのプロトコルや仕様自体は普及しなかった。
実際、OSIの仕様は複雑すぎて、実装が困難だったと言われている。今では「プロトコルの階層モデル」という考え方が教育に適していることから、OSI参照モデルのみが電子科学の教科書などに引用されている。
標準化が進む前に開発されたネットワーク技術
Apple Talk: 1984年に、アップル社製のMacintoshで利用するために開発された通信プロトコル群。TCP/IPとは互換性がない。現在アップル社はApple Talkを廃止し、自社製品にBonjourを実装している。BonjourはZeroconfという技術を実装したもので、ZeroconfはDHCPやDNSの設定をせずに、ネットワークを自動的に作成する技術である。BonjourはTCP/IP上で実現でき、更にネットワーク負荷を小さくする。
NetBEUI: 1985年に、IBM社により開発されたプロトコル。Windows系OSで利用された。TCP/IPが主流になるにつれて、だんだんと使われなくなり、Windows 7からNetBEUI自体が廃止された。
DECnet: 1975年に、DEC(Digital Equipment Corporation)がミニコンピューター同士の接続のために開発した通信プロトコル群。DECの主要OSであるVAX/VMS向けに構築された。当初は4階層で構成されていたが、1982年にOSI参照モデルに準拠し、7層のネットワークプロトコルとなった。現在はLinux向けのオープンソース版が開発されている。
IPX/SPX: 1980年代後半からノベル社のOS Netwareで主に使われていた通信プロトコル。主にLAN向けに設計されており、LAN上での性能はTCP/IPよりも優れている。TCP/IPがデファクトスタンダードとなった理由は、WANやインターネットでの性能がTCP/IPの方が優れていた点、TCP/IPがグローバルな利用を意図して設計されたプロトコルであった点にあるとされる。1990年代に入ってもIPX/SPXはLANとして主流だったが、TCP/IPが主流になったことから、Windows Vistaではサポートされなくなった。
標準化組織
標準化組織は国際的な組織から、地域限定の組織まで複数存在する。
ISO(International Organization for Standardization): 国際標準化機構。OSI参照モデルを策定。電気分野を除く工業分野の国際規格を策定するための非政府組織。
ITU-T(International Telecommunication Union Telecommunication Standardization Sector): 国際電気通信連合の部門のひとつ。データ伝送を含む通信関係の国際標準化を行う。主にWAN回線の仕様として参照される。
ISOC(Internet SOCiety): 1992年に設立された国際的非営利組織。目的は「全世界のあらゆる人々の利益のため、インターネットのオープンな関係・進歩・利用を保証する」こと。IETF(Internet Engineering Task Force)の上層団体に位置する。IETFは、インターネットで利用される技術の標準化を策定する組織。策定された標準仕様はRFC(Request for Comments)として発行する。
IEEE(Institute of Electrical and Electronics Engineers): アメリカに本部を持つ電気工学・電子工学技術の学会。IEEE 802.11は広く普及している無線LAN関連企画。
ANSI(American National Standards Institute): 米国国家規格協会。アメリカの国内における工業分野の標準化組織。
コンピューターの持つべき通信機能を7つの階層に分けて定義している。体系的にまとめられたモデル、実用的ではない。
第7層アプリケーション層: アプリケーションの種類やサービスに関する規定。
第6層プレゼンテーション層: データの種類・表現形式や送信ビット数に関する規定。
第5層セッション層: アプリケーション間の通信モード・接続数に関する規定。
第4層トランスポート層: 通信エラー管理、アプリケーション識別に関する規定。ポート番号から一つのアプリケーションを特定する層。
第3層ネットワーク層: 通信経路や中継経路の選択、識別アドレスに関する規定。IPアドレスを元にLAN間の通信を実現する層。
第2層データリンク層: 通信路の確保や伝送制御手順、エラー訂正に関する規定。MACアドレスを元にLAN内での1:1の通信を実現する層。
第1層物理層: 物理的な回線や機器類、電気信号に関する規定。
TCP/IPモデル
インターネット標準プロトコルのモデル。4つの階層で構成され、複数の独立したプロトコルを組み合わせて通信を行う。各層の名称と対応プロトコルは以下の通り。
第4層アプリケーション層: HTTP, SMTP, POP, IMAP, FTP, TELNET, SSH, DNS, DHCP, NTP
第2層インターネット層: IP(ARP, ICMP: Internet Control Message Protocol)
第1層ネットワークインターフェース層: Ethernet, 無線LAN, PPP(Point-to-Point Protocol), PPPoE(PPP over Ethernet), VPN