プロトコルスタック

プロトコルスタック（）は、コンピュータネットワーク用のプロトコルの階層である。プロトコルスイート（）も同じ意味で使われることが多い。ただし「プロトコルスイート」は各種プロトコルの定義、「プロトコルスタック」はそれらのソフトウェアでの実装と、使い分けられることもある。
概要.
スタック（階層）やスイート（一組）内の、個々の通信プロトコルはある1つの目的のために設計されることが多い。このようなモジュール化によって設計や評価をより容易にする。各プロトコルモジュールは上下の他のモジュールと互いに通信するので、一般にこれをプロトコルが積み重ねられたものとして見ることになる。最下層のプロトコルはハードウェアとのやり取りを行う層である。より高い層はさらに様々な機能をそれに付与していく。ユーザーアプリケーションは最上層とだけやり取りする。（OSI参照モデルを参照）
実装では、プロトコルスタックは、メディア（媒体）層、トランスポート（転送）層、アプリケーション（応用）層の3層に分けられることが多い。オペレーティングシステムによっては、これらの層間のインタフェースを明確に定義していることもある。つまり、メディア層とトランスポート層のインタフェースと、トランスポート層とアプリケーション層のインタフェースである。
メディア・トランスポート層インタフェースは、トランスポートプロトコル・ソフトウェアからメディアやハードウェア（カードドライバ）をどう使うかを定義している。例えば、TCP/IPトランスポート・ソフトウェアとイーサネットハードウェアとのやり取りを定義している。この種のインタフェースの例として、ODI、Microsoft WindowsやMS-DOSのNDISがある。
アプリケーション・トランスポート層インタフェースは、アプリケーションプログラムからどのようにトランスポート層を使うかを定義している。例えば、ウェブブラウザからTCP/IPトランスポートソフトウェアを使う方法が定義されている。この種のインタフェースの例として、UNIX系ではソケットやSystem VのSTREAMS、マイクロソフトではWinsockがある。
一般的プロトコルスイートについて.
 T ~ ~ ~ T
 [A] [B]_____[C]
"A"、"B"、"C" という3台のコンピュータがあり、"A"と"B"は無線で接続され、IEEE 802.11などの適当な通信プロトコルで通信を行うとする。一方、"B"と"C"はケーブルで繋がれ、適当なプロトコルでデータを交換する。しかし、それぞれに使われている通信プロトコルは、それぞれメディア（媒体）に固有であって、"A"から"C"へ通信を行う機能を持たない。このためネットワーク間を繋ぐプロトコルが必要となった。
このケーブルと無線の両方を扱うプロトコルを新たに開発するという考え方もあったが、その場合、新たなネットワーク媒体が登場するたびに、それに対応していく必要が生じる。従って、基本のプロトコルはそのままとしておき、それらの上に新たなプロトコルが動作するよう設計する方が容易である（インターネットのプロトコルがその例である）。その場合、各ネットワークで2層のプロトコルスタックができることになる。ネットワーク間プロトコルはベースとなるプロトコルと簡単な言語でやり取りし、ベースとなっているプロトコル同士が直接やり取りすることはない。
"A" から "C" に、あるデータを送るとき、まず上位プロトコルに要求が送られる。"A" の上位プロトコル層は、 "C" へは "B" を経由して到達できることを知っているので、無線プロトコルに対して "B" にデータパケットの送信を指示する。"A" の下位層は、渡されたパケットに自身の通信に必要な情報を付与して "B" にパケットを送る。"B" はパケットを上位層に渡し、上位層はパケットの情報から最終あて先が "C" であることを知る。"B" の上位層は、ケーブルのプロトコルを使って "C" にパケットを転送する。受信したパケットは、再び上位層に渡され、あて先が自分であることから "C" の上位層はさらに上位の層（おそらくアプリケーション）にパケット内のデータを渡す。一般に、実際のプロトコルスタックは、これよりも多層化されている。
プロトコルスタックの例を以下に示す: