はじめに
kernelのネットワークがどのような仕組みになっているのか、気になったので少し調べてみました。
まだ軽くしか調べられていないが、一旦アウトプット。
概要
- プロセスはソケットを介して通信を行う。
- ソケットは、ファイルインターフェースを拡張して作られているので、kernelレベルではファイルの利用手順とほぼ同じである
Kernelのネットワークスタックはどのようになっているのか?
- 詳細はKernel Map
- 概略図。ここから転載
ソケットインターフェース
-
プロセス間通信が可能。遠隔のプロセスとの通信も可能
-
ソケットバッファによってデータのコーピー処理を頻繁に発生させない仕組みになっている
-
通信確立までの流れ
- サーバ側がクライアントを受け付けるソケットファイルを作成する(socket()を呼び出す)
- 受付用ソケットファイルに名前をつける(bind()を呼び出す)
- ソケット・キューを作成する(listen()を呼び出す)
- ソケット・キューに入っているクライアントからの接続の最初の1つを受け付ける(accept()を呼び出す)
- クライアント側ではソケットファイルを作成する(socket()を呼び出す)
- クライアント側からサーバへ接続要求を出す(connect()を呼び出す)
- サーバ側で、受付用ソケットファイルとは別に、接続用ソケットファイルを作成する。
- 結果、read()やwrite()などのシステムコールを呼び出せるようになる
-
通信切断時は、close()を呼び出し、切断