関数を指定するソケットの必要性の確立においてソケットIPv4
またはIPv6
、それぞれAF_INET
とAF_INET6
ネットワーク層です。第二に、必要かどうかを指定するTCP
かUDP
、トランスポート層です、。TCPは、ストリームベースなので、セットでSOCK_STREAM
、UDPはデータグラムベースなので、セットですSOCK_DGRAM
。
ソケットベースのプログラムは、TCPプロトコルの処理機能を呼び出します。
最初のポート上のサーバーのリスニングに通常最初の呼び出しbind
機能、指定したIPアドレスとポートにソケット。サーバはIPとポートを持っているときは、呼び出すことができるlisten
機能監視を。この時点リスニング状態にサーバーでは、クライアントが接続を開始することができます。
Linuxカーネルでは、各ソケットのための2つのキューを維持します。接続は、今回設立されたキューは、3ウェイハンドシェイクが接続されている中で、完成されたestablished
状態; 1は、まだ完全には接続キューを確立していない、この時間の3ウェイハンドシェイクがで、まだ完了していないsyn_rcvd
状態。
次に、サーバーは呼び出しをaccept
処理するために完了した接続を思い付く、機能を。あなたが完了していない場合、待つ必要があります。
サーバーを待っている間、クライアントができるconnect
接続機能を開始します。最初のパラメータに接続するためのIPアドレスとポート番号を指定し、3ウェイハンドシェイクを開始することを始めます。クライアントのカーネルは、一時的にポートを割り当てます。ネゴシエーションが成功すると、サーバは別のソケットを返します受け入れます。ソケットは本当にと呼ばれる転送データと2ソケットにリッスンリスニングソケットと呼ばれ、接続ソケット。
接続が確立された後、双方が通じ始めread
とwrite
データ機能を読み書きします。彼は、TCPソケットは、ファイルストリームで非常に正確であると述べました。Linuxでのソケットは、ファイルの形式であるため。また、ファイルディスクリプタ、書き込みや読み出しは、そこにあるファイルディスクリプタです。
カーネルでは、ソケットは、対応するファイル記述子を持つファイルです。各プロセスは、データ構造を有するtask_struct
ファイルディスクリプタ配列へのポイントは、プロセス・オープンのファイルディスクリプタ内のすべてのファイルを一覧表示するには、。ファイル記述子は、配列のインデックスである整数です。
この配列は、開いているすべてのファイルのカーネルのリストへのポインタです。それはファイルとして保存されているので、そこになりますinode
が、対応するソケットinode
ハードディスク上のが、メモリに保存されている実際のファイルシステムとは異なり。この中でinode
、彼はカーネルにソケットソケット構造を指します。主な2つのキュー、1つの内部のこの構成では、送信キューと1つのキューを受け取ります。2つのキューに保存されたキャッシュがありますsk_buff
。このキャッシュの内部は完全なパッケージの構造を見ることができます。
Scoketプログラム機能は、呼び出し元プロセスのUDPプロトコルに基づいています。
UDPの場合は、3ウェイハンドシェイクが必要とされていない、呼び出す必要はありませんlisten
とはconnect
。しかし、UDPの相互作用は、まだIPを必要とし、ポート番号も必要ですbind
。UDP接続状態は、ソケットの各対のセットを確立する必要がなく、維持されていないが、長いソケット、及び複数のクライアントのように通信することができます。これは、状態が接続されていないため、毎回の通信、両方の呼び出しもあるsendto
とはrecvfrom
、あなたがIPアドレスとポートを渡すことができます。
どのようにサーバーより多くのアイテムにアクセスするには:
システムは、TCPコネクションを識別するために、4つの要素を使用します。
{本机IP, 本机端口, 对端IP, 对端端口}
IPおよびサーバのポートが本能を変更する自由なので、唯一のクライアントはIPとピアポートを変更することができます。だから、理論的にはTCP接続の最大数=クライアントIPポート番号*クライアントの数。IPv4の、2 ^ 32までのクライアントのIP番号の場合、ポート番号は、TCP接続のスタンドアロンサーバー理論上の最大数は2 ^ 48である2 ^ 16を、です。
明らかに、これは、実際には、理論だけでははるかに短いです。まず第一に、ファイル記述子の制限は、ソケットを介して第1、ファイルであるulimit
ファイル記述子の構成数;他の制限は、メモリ上のデータ構造によれば、特定のメモリを占有する必要があり、各TCP接続、オペレーティング・システム制限されています。
だから、我々はそれが各プロジェクトによって消費されるリソースの量を減らす必要があり、限られたリソースでより多くのプロジェクトを取らなければなりません。
一つの方法:マルチプロセス
接続が確立されると、接続されたソケット、子プロセスを作成し、接続されたソケットの相互作用に基づいて行うために、新しい子プロセスに引き継がするには、この時間があるでしょう。
Linuxでは、使用して追加のプロセスを作成fork
する機能を。これは、親プロセスに基づいて子の完全なコピーです。Linuxカーネルでは、それは、現在実行中のプログラムをラインメモリ空間が、また、記録プロセスのコピーをコピーする、ファイルディスクリプタのリストをコピーします。コピーを呼び出すときに明らかに、fork
コピーが完了した後、親と子プロセスが終了したばかりの現在の実行を記録しますfork
。ちょうどちょうどに基づいて、同じほぼ正確に、時間をコピーした二つのプロセスfork
の端に区別するために、戻り値は、親または子です。それが0の場合、子プロセスを返す場合、それは別の整数を返す場合、それは親プロセスです。
第二の方法:マルチスレッド
プロセスと比較すると、スレッドは軽量で、よりであることを。Linuxの場合、によってpthread_create
プロセスを作成するだけでなく、コールへdo_fork
。違いは、新しいスレッドがあるが、それであるtask
新しいリスト項目を作成しますが、そのようなファイルディスクリプタ、プロセス空間、または共有などのリソース、多くの、より多くの唯一の基準より。
並行処理の目的を達成するために、新しいプロセスは、要求を処理するソケットを介して接続することができます。
プロセスやスレッドベースのモデル以上、それはまだ問題です。新しいTCP接続の到着は、あなたはマシンがプロセスとスレッドの多くを作成することはできません、プロセスまたはスレッドを割り当てる必要があります。そこC10Kは、それが100,000の接続を維持するためにマシンを意味し、それは万個のプロセスやスレッドを作成する必要があり、オペレーティングシステムが持続不可能です。
三つの方法:IO多重化、スレッドは、複数のソケットを維持します
ソケットは、ファイル記述子であるため、スレッドのすべてのソケット凝視して、ファイルディスクリプタのセットに配置されfd_set
、その後、呼び出すselect
ファイルディスクリプタの変更のセットがあるかどうかを監視するための機能を。変更があると、ファイルディスクリプタは、順番にそれぞれを見ていきます。ファイル記述子でこれらの変更fd_set
のビット対応が1に設定され、それはソケットが読み取り可能または書き込みを示し、読み取り及び書き込み動作を行い、その後、呼び出しすることができるselect
凝視の変化次に、。
4つの方法:IOから、多重化select
epoll
上記select
ソケットの変更が大幅にファイルディスクリプタの各セットが配置ソケット接続の数に影響を与えるであろう、ポーリングの方法によって必要とされる時間があるので、この関数は、依然として問題があります。したがって、私たちが使うselect
、同時に見つめファイル記述子の数を設定する必要がありますFD_SETSIZE
。
モード変更イベント通知した場合、状況はかなり良くなる、あなたは投票ファイルディスクリプタを必要としません。コレクションの変更が発生した場合でも、事前通知スレッドは、その後、スレッドとし、適切な処置を行うこと。
あなたは機能と呼ばれるこの事を終えることができepoll
、それは、ポーリングを介してカーネルに実装されていませんが、登録することで、callback
機能の作品をファイルディスクリプタの変更は、通知するためにイニシアチブを取るとき。
複数のプロセスがファイルディスクリプタソケットM、N、Xなどを開いた場合、示され、今必要としてepoll
、これらのイベントをリッスンするソケットです。これはepoll_create
作成しepoll
たファイルオブジェクトをある、また、リスト内のファイルを開くには対応しても、ファイルディスクリプタに対応しています。これであなたは、この保存したい、赤、黒の木、赤黒木があるepoll
聞くために、すべてのソケットを。
場合epoll_ctl
、実際には、構造体に節点の内部赤黒木ながら、赤黒木に参加するとき、ソケットを追加して、この構造は、ソケットがでリッスンしているイベントリストに掛けられます。ときにソケットイベントに、あなたがこのリストを取得することができepoll
、オブジェクト、およびコールcallback
にそれを通知します。
この通知ソケットデータ増加を聞いて、効率が大幅に同時にソケットを聴くの数を減少させないような方法も非常に多くのです。開いているファイル記述子プロセスのシステム定義の最大数の上限。したがって、epoll
解決するために呼び出されC10Kの