質問: ネットワークにおいてOSI参照モデルについての質問なのですが・・・ データリンク層と物理層はハードウェアが処理を行っているのですか?? どの層までがソフトウェアの部分なのでしょうか?? それとプロトコルはどのような言語でプログラミングしているのでしょうか? C言語あたりでしょうか?? パケットはどのようにして生成しているのでしょうか? データ分割と各層におけるヘッダの追加作業などはどのようにして行っているのですか? ネットワークの基本的なことをかなり詳しく知りたいです。 教えていただければ幸いです。
回答: 現在のネットワークのほとんど全てはEthernetとTCP/IPが使われています。そして、TCP/IPはOSI参照モデルとは少しずれがあります。ましてやさらに上位層となるHTTPやSMTPなどでは、プロトコル毎に状況が変わってくるため、OSI参照モデルのどこまでカバーするのかが変わる場合があります。 つまり、OSI参照モデルのどの層がどうなっているか一般的に述べることは難しく、具体的なそれぞれのプロトコルについて述べることしかできないと言うことです。 Ethernetから見ていきましょう。Ethernetは物理層とデータリンク層あたりに相当します。パソコンの場合であれば、NIC自体(ハード)およびNICのコントローラチップ(ハード)とOSのNICドライバ(ソフト)によって処理されます。どこがどこまでやっているかはNICによると思われますが、LANケーブルを流れる具体的な電圧の変化を起こしたり、読み取ったりすることは少なくともハード側でしょう。電圧の変化から作られたフレームの処理(自分宛かの判断など)はソフト側と思われます。ただ、パソコンでは無いL2スイッチなどではほぼ全てハードで処理をしていると考えられます。なお、NICドライバはC/C++作られる場合が多いです。 TCP/IPになると、ほとんどの場合はOSで処理します。TCP/IPはネットワーク層、トランスポート層、セッション層が混ざった形です。こちらもC/C++で作られることが多いでしょう。こちらもL3スイッチなどでは高速化のためにある程度ハードで処理している場合がありますので、全てがソフトというわけではありません。TCP/IPは下位のIPと上位のTCP, UDP等に分けることができますが、規格として一緒に存在するため、L3スイッチなどIPしかみない場合を除いて、同じ所で処理されていると考えて問題ないと思います。 更に上位のHTTPやSMTPになると、それを提供するアプリケーションが処理しています。HTTPのサーバーであればApache HTTP Server、nginx、Apache Tomcat、node.jsのhttp-server、Pythonのhttp.server、RubyのPuma、PHPのビルトインウェブサーバーなど多くの実装が存在しますし、クライアント側はさらに各種ブラウザを初めとした多くの実装が存在します。具体的なプログラミング言語はアプリケーションによるため多岐にわたります。高速な動作を目的にしている場合は、C/C++などのコンパイル出来る言語が使われる場合がありますが、Webrickのようなスクリプト言語であるRubyだけ作られたものもあります。 OSがTCP/IPを提供し、各言語でTCP/IPをやり取りできるためのインタフェースやライブラリを初めから用意している場合がほとんどになります。ほとんどのプログラマにとっては、TCP/IPを扱うインタフェースやライブラリだけがわかっていればすむ形であり、それによって具体的なパケットをどのように作るかはOSの開発者が考えることになります。IPパケットからEthernetフレームがどのように作られ、どのような電気信号になるかはNICの開発者の関心事なります。こういった低レベルでの処理に関心があるのであればLinuxカーネルのソースコードが参考になると思います。