linux netwrok stack
これ読んだ。
次の図はlinux network stackの内部フロー図。netwrok stackは基本的にイベントドリブンで動く。
https://gyazo.com/3b0aa32d5318125ff1ff1f804250be17
(1)
(1)はTCPを使うためにシステムコールをアプリケーションが呼んだ場合のフロー。例えばread,writeシステムコールを呼んでTCPを利用する場合。しかしながらこのときは実際の通信はまだ発生しない。
(2)
(2)はTCPの実行後に通信が必要な場合のフロー。ここでは実際のパケットを作成、Driverに転送する。
Driverの前にはキューがあり、まずパケットはこのキューに格納される。このキューはドライバーにいつパケットを転送するかを決定する。このキューとはlinuxのqdisc(Queuegin Discipline)である。linuxのトラフィックコントロールの機能はこのqdiscをいじることで行われている。デフォルトのqdiscはFIFOである。ほかのqdiscを使うとパケットロス、パケットディレイ、トラフィックシェーピングもできる。
(3)
(3)はTCPのタイマーによるケース。具体的にはTIME_WAITが起きた場合。これによってTCPのコネクションは消される。
(4)
(3)と同様に(4)はタイマーによるケースであり、パケットを送る場合に使われる。具体的にはTCPの再送タイマーが来た場合にACKが受信できなかったパケットの再送信を行う場合。
(5)
NICドライバはインタラプトを受け取ったときや新しいパケットを受信した時にソフトIRQを送信する。
(5)はインタラプトを受けた場合。
ソフトIRQはドライバを呼び出して受信パケットを上位のレイヤーに転送する。linuxは上記の受信パケットを処理するためにNew API(NAPI)が呼ばれる。ドライバーは直接パケットを上位レイヤーに転送しないのでこの仕組みはポーリングに似ている。しかし、上位レイヤーは直接パケットを得ることができる。実際のコードではNAPI pollが呼ばれている。
(6)
完全なTCP実行のケースである。
これもLinuxのネットワークスタックについて書いてる。
#it
#network