基本 - ネットワーク
最終更新日: 2026-07-25
TOP(About this memo)) > 一覧(ネットワーク) > 基本
OSI参照モデル
OSI(Open System Interconnection)参照モデルとは、ISOで定められている、異なるベンダー間で相互に通信を行うためのネットワークモデルと言われる統一規格。
- アプリケーション層 HTTP,FTP,DNS,SMTP,POP等
- プレゼンテーション層
- セッション層
- トランスポート層 TCP,UDP
- ネットワーク層 IP,ICMP,ARP
- データリンク層 イーサネット
- 物理層 光ファイバ、無線
プロセス間通信(IPC)
- 「プロセス」とは、簡単に言えば動作中のプログラムのこと。
- プロセス同士の通信例として、コマンドのパイプやシグナルがある。
- プロセス同士の通信や、プロセスがファイルに読み書きするのは、ファイルディスクリプタを出入り口としてストリームを通って行われる。
- ストリーム = バイト列(バイトストリーム(byte stream))の通り道
- プロセス同士がストリームを通じてデータをやりとりしたり意思の疎通をはかることを一般にプロセス間通信(IPC:InterProcess Communication)と言う。
- プロセスはファイルディスクリプタを持ち、(POSIX 上は)0-2 を標準で持っている。0 は標準入力、1 は標準出力、2 は標準エラー。
- コンピュータの世界ではストリームからバイト列を取り出すことをreadと呼び、バイト列を流し込むことは書く(write)と言う。
- UNIX上ではすべてはファイルとして扱われる。例えばキーボードもファイルディスクリプタとして、そこにつながるストリームがあり、readができる。
- (参考) https://jibun.atmarkit.co.jp/lskill01/rensai/fulinux/04/01.html
ネットワーク越しのプロセス間通信、ソケット
TCP
- TCPは、「データの内容はおいといて、通信デバイス間での通信内容を確実に送受信するためのルール」を定めているプロトコル。
- 元々はTCPの中にIPも含まれていた。そこから音声などは多少ロスしてもリアルタイムであることが必要なUDPを作るために、TCPからIPを切り離した。
- TCP/IPレベルの通信ではソケットを利用する。(TCP/IP 通信をソケット通信と呼ぶこともある)
- インターネットは TCP/IP と呼ぶ通信プロトコルを利用する。
HTTP
- TCPにさらにルールを追加して、送受信されるデータの形式や送受信タイミングをWebサイト閲覧に最適化する形に定められたルール。
- アプリケーション層のレイヤはTCP/IPのさらに上の階層のため、HTTP通信も当然ソケットを使用している。
UNIXドメインソケット
- ソケット通信は便利なプロセス間通信の規格であり、必ずしもインターネットを通す専用のものではない。
- ソケットには2種類ある。
- INETドメイン: ネットワーク上でマシンを越えてのプロセス間通信
- UNIXドメイン
- 同じマシン上で動いているプロセスが通信を行うためのソケット
- アドレス・名前空間としてファイルシステムを使用している。
- ファイルシステム内のinodeとしてプロセスから参照される。
- UNIXドメインソケットは、TCPソケット(INETドメインソケット)よりもスループットが優れている。
- 例えば、MySQLなどではUNIXドメインソケットが利用可能。
keep alive
- 概要: TCPなどのコネクションにおいて、定期的に相手が活きているかチェックして、活きているならコネクションを継続(タイムアウト延長)、通信がないならタイムアウトとする仕組み。これによって、例えばHTTPならひとつのTCPコネクションの中に複数のHTTPリクエストを実行できる。
- (参考) https://milestone-of-se.nesuke.com/nw-basic/as-nw-engineer/keepalive-tcp-http/
- 一般に、ある2つの機器間の通信接続において、相手が活きているかを確認し、その接続を維持する仕組みをKeepAliveと呼ぶ。
- KeepAliveはTCPやHTTP、IPsec、BGP等、様々なレイヤー・プロトコルで実装されているが、それぞれ仕組みや狙いが少し異なる。
- TCP KeepAlive
- TCPコネクションを確立したホスト間において、通信開始からしばらくして相手からの通信が途絶えた際に、相手が活きているかを確認する仕組み。
- RFC 1122で定められているものの、必ずしも使える必要はないとされている。
- HTTP KeepAliveの仕組みとメリット
- HTTP KeepAliveは、1つのTCPコネクションの中に複数のHTTPリクエストを実行できる機能であり、通信の効率化が図れるというメリットがある。
- 一方的に送るのではなく、相手からの応答を待つHandshake系通信(TCPコネクションやSSL/TLSコネクション)は現状ボトルネックであることがGoogleの調査でも明らかになっている。(この流れがTLS v1.3やHTTP/3に繋がっている)
- HTTP KeepAliveはHTTP 1.0ではオプション扱いだが、HTTP 1.1からはデフォルトで有効になっている。
- デメリット
- KeepAliveは通信効率性を追求することのトレードオフとして、サーバ側はTCPコネクションを確立し続けることに負荷がかかることがデメリット。
- これはnginxなどが「イベント駆動」方式でデメリットを克服している。
サーバーのアーキテクチャ
- (参考) WEBアーキテクチャ進化論: https://blog.ojisan.io/server-architecture-2023/
- マルチプロセス
- forkしてプロセスを増やしていく方法や、そもそも事前にプロセスを立てておく方法がある。
- 有名どころがApache httpd。
- マルチスレッド
- スレッドはメモリ空間が分離されない。
- 独自のアドレス空間を作る必要がないのでパフォーマンスにはメリットがある。
- 競合状態を避けるようにプログラムを組む必要がある。
- 大抵のプログラミング言語にはロック機構がある。ただ、ロックがそもそも守れているかどうかという点と、デッドロックという問題はある。
- Rustは言語レベルでロックを守れるようになっている。
- C10K問題
- 各クライアントに毎回プロセスやスレッドを割り当てると、たとえマシンリソース自体が残っていたとしても、下記のような問題が起きるという話。
- プロセスIDの枯渇
- ファイルディスクリプタの枯渇
- ハードウェアのコア数は決まっているのでCPU割り当て時のコンテキストスイッチがたくさん発生し、そのコストが多い
- C10K問題の対応策のひとつが、NginxやNode.jsのシングルスレッドでの非同期処理とイベントループ。
- マルチスレッドは空間を分離していたのに対し、シングルスレッドでの非同期処理は時間を分離する。
- シングルスレッドでI/Oが発生してもアプリケーション全体が止まることはないし、シングルスレッドだからコンテキストスイッチを考える必要がなくなる。
- Goでは、軽量スレッドでコンテキストスイッチのコスト自体を抑えたり、グリーンスレッドでpid、fdの枯渇を回避している。
IPアドレス
CIDR
- Classless Inter Domain Routing
- クラスフルのIPアドレス(クラスA、クラスB、クラスCなどに分けるもの)はIPアドレスのグルーピングが大雑把すぎるため、
xxx.xxx.xxx.xxx/18 のような形で表記するのがCIDR。18はサブネットマスクを表しており、左から18桁までがネットワークアドレスということになる。
ブロードキャストアドレス
- 予約されたIPアドレスの一つ。
- 例えば、「150.10.0.0/16」のブロードキャストアドレスは「150.10.255.255」。
- 「150.10.255.255」としてデータを送信すれば、「150.10.X.X」に属する全てのホスト「150.10.1.1」〜「150.10.255.254」の端末が宛先となる。
POPvsIMAP
- POPはサーバにあるメールをパソコン等の端末にダウンロードして、端末上でメールを管理する仕組み。
- メリット:パソコン等に保存したメールの削除・移動等を素早く処理でき、端末の容量が許す限りメールを保存できる。
- デメリット:複数のパソコン等でのメール利用は使い勝手が悪い場合がある。また、同時に複数台の端末で受信を行うことができない。
- IMAPはサーバにあるメールをパソコン等の端末にはダウンロードせず、サーバ上でメールを管理する仕組み。
- メリット:サーバ上でメールを管理するので複数の端末での利用に優れている。また、開封状態等も共有されるのでメールを一元管理することができる。
- デメリット:メールサーバーの容量制限など。
メモ
- Google
- さくら
- macの場合。
- 送信:POP
- ポート110、認証:パスワード。
- TLS,SSLは外す、TLS証明書はなし。
- 受信:SMTP
- ポート587、認証:パスワード。
- TLS,SSLは外す。
587とは?
- SMTPは「Simple Mail Transfer」という名前の通り非常に単純な仕様で文章を送信できるため、一気に普及した。
- しかしユーザー認証機能を備えておらず、その手順に従えば誰でもメールを送信可能。
- そのため、多くのプロバイダは迷惑メール対策として「Outbound Port 25 Blocking」(OP25B)を導入している。
- 利用プロバイダが「Outbound Port25 Blocking」に対応していない場合などは、送信サーバ情報のポートは『25』のままで送信が可能。
0.0.0.0
なぜ、ブラウザやcurlで0.0.0.0にアクセスすることができるのか?
- 宛先として使用しないアドレス帯にも関わらずアクセスできるのはなぜか。
- macOSやLinuxでは、OSレベルで0.0.0.0を127.0.0.1(ローカルホスト)として扱う実装になっているため。
- この挙動を悪用し、公開されている悪意のあるWebサイトが
0.0.0.0宛にリクエストを送ることで、本来は同一オリジンポリシー等で保護されているはずのローカルホスト上のサービス(開発用サーバーなど)にアクセスできてしまう「0.0.0.0 Day」という脆弱性が2024年8月に公表された。
- これを受けて、Chrome/Chromium系ブラウザは128以降のバージョンで公開Webサイトから
0.0.0.0へのアクセスを段階的にブロックするようになった。SafariやFirefoxでも同様の対策が行われている。
- さらにChrome 142(2025年10月)では、公開WebサイトからプライベートIPアドレス(
192.168.x.x等)やlocalhost、.localドメインへのアクセス全般を許可制にする「Local Network Access(LNA)」という、より広範な保護機能が導入されている。
- (参考) https://www.theregister.com/2024/08/09/0000_day_bug/
192.168.11.3
- イントラネットIPアドレス。
- 通常は携帯電話、デスクトップパソコン、ラップトップ、テレビ、スマートスピーカーなどのようなデバイスに割り当てられる。
- また、イントラネットには、通常外部ゲートウェイとして使用されている別のIP 192.168.11.1 もある。