web-dev-qa-db-ja.com

ソケットとは?

誰かが私にソケットが何であるかを説明できますか?私はそれをSSLなどの文脈で多くの頭字語で見ます。

また、なぜソケットと呼ばれるのですか?純粋に彼らが発明した名前だったからでしょうか?それとも彼らが思いついた最初の名前でしたか?

57
chrisjlee

ソケットは、通信のための単なる論理エンドポイントです。それらはトランスポート層に存在します。ソケットで物事を送受信したり、ソケットをバインドしてリッスンしたりできます。ソケットはプロトコル、マシン、ポートに固有であり、パケットのヘッダーでそのようにアドレス指定されます。

Beejの ネットワークプログラミング および プロセス間通信 のガイドには、ソケットの使用方法に関する優れた情報があり、さらに この正確な質問に答える についても説明しています。

48
Shawn J. Goff

簡単に言うと、ソケットはネットワーク接続を表す疑似ファイルです。ソケットが作成されると(適切なプリミティブと他のホストを識別するための適切なパラメーターを使用)、ソケットへの書き込みはネットワークパケットに変換されて送信され、ネットワークから受信したデータをソケットから読み取ることができます。

ある点では、ソケットはパイプと非常に似ています。ソケットは、パイプを使用するプログラムにとってはファイルのように見えますが、ディスクへの読み取りや書き込みは行われません。むしろ、それらは別のプログラム(パイプの場合はローカル、ソケットの場合はリモート)との通信を許可します。また、ご存じのとおり、双方向通信を提供します(適切に接続されたパイプのペアができるように)。

最後に、単一のマシン上のプログラムがTCPなどの標準ネットワークプロトコルを使用して通信することは一般的です。同じハードウェアに戻るために、ネットワークハードウェア(存在する場合)、チェックサムの計算などに行くのは無駄です。ここに、Unixドメインソケットが入ります。これらは、通常のソケットによく似ていますが、リモートプロセスではなく同じホスト上のプロセスを接続し、ネットワークリソースをまったく使用しません。このように、それらはプロセス間通信の媒体です。

Tripleeeが述べたように、BSDの歴史の中で、パイプはソケットよりも前に導入され、存在していたソケットを使用して再実装されました。同じ参照The FreeBSD Operating Systemの設計と実装は、パイプがパフォーマンス上の理由から非ソケット実装に戻されたことに言及しています:これはパイプが類似点を共有するという事実を確かに強調しています。

74
dhag

さて、それは何ですか?

ソケット、または「ソケット」は、いくつかの場合があります。

まず、それは思考モデルであり、アプリケーションプログラミングインターフェイス(API)です。つまり、厳密に指定された規約に従って、従う必要がある一連のルールと、何かを実行するプログラムを作成するために使用できる一連の関数があるということです。この特定のケースでは、somethingは別のプログラムとデータを交換することを意味します。

ソケットAPIは、一般的に「通信」の詳細を幅広く抽象化します。これは、1人の(ほぼ)一貫した同一のcookie-cutterフォームを通じて、誰とどのように対話するかをカプセル化します。
さまざまな「ドメイン」(「unixソケット」や「インターネットソケット」など)やさまざまなタイプの通信(「データグラム」ソケットや「ストリーム」ソケットなど)のソケットを作成できますさまざまな受信者と話すと、すべてがまったく同じように機能します(まあ、99%で、明らかに必要な微妙な違いがあります)。

同じコンピューターまたは別のコンピューターで別のプログラムと話しているのか、それらのコンピューターの間にIPv4またはIPv6ネットワークがあるのか​​、あるいは他の何かであるのかを知る必要はありません(知りたくさえありません!)あなたが聞いたことがないプロトコル。

socket は、特別な種類の "socket"を作成するライブラリ関数(またはsyscall)の名前でもあります。ファイル(UNIXのすべてがファイルです)。

それはどのように比較します...

ソケットはパイプおよび名前パイプと同じカテゴリに分類されます

パイプは、同じコンピューター上のリーダーとライター(どちらもプログラム)間の一方向通信の手段です。データのstreamをシミュレートします(TCPなどと同様)。
つまり、パイプの観点からは、個々の「メッセージ」または「データのブロック」は存在しません。任意の量のデータを「一方の端」にコピーでき、他の誰かが「もう一方の端」で同じバイト順で任意の量のデータを読み取ることができます(必ずしも同じである必要はなく、必ずしも一度に行う必要はありません)。押し込んだ。

namedパイプは、まあ、単純にパイプであり、ファイルシステムで名前を所有しています。つまり、ファイルのように見え、動作するものであり、ディレクトリリストに表示され、ファイルを開いたり、ファイルに書き込んだりできます。ソケットスペシャルファイル(名前付きソケット)を作成することもできます。 。

一方、ソケットは、双方向( "duplex")通信の手段であり、同じものに書き込みおよび読み取りできることを意味します。ソケット、および双方向通信のために2つの別個のソケットは必要ありません。
また、ソケットはストリーム(パイプと同じ)として機能したり、個別の信頼性のないメッセージを送信したり、個別の順序付けられたメッセージを送信したりできます(最初の2つは任意のドメインで機能し、最後は「unixドメイン」)。まったく別のコンピューター上の誰かにメッセージを送信(またはストリームをシミュレート)できます。ソケットは、特定の条件下で、1対多の通信(マルチキャスト)の形式を実行することもできます。

そのことを念頭に置くと、ソケットがはるかに複雑な処理を行い、一般にパイプよりオーバーヘッドが多いことは明らかです(基本的には単純なmemcpyそしてバッファから!)、ただしローカルソケットを作成する場合(つまり、同じコンピュータ上)、オペレーティングシステムは通常、大幅に最適化された高速パスを適用するため、実際にはそれほど大きな違いはありません。

ネットワークに関して時々言及されるプロセス間通信

はい、ソケットはプロセス間通信の1つの可能な方法です(共有メモリとパイプは代替手段の例です)。同時に、上で説明したように、これらは「ネットワーキング」に使用されています。

8
Damon

ソケットは抽象化です。これは、オペレーティングシステムが任意の数のアプリケーションによる制限されたリソースの使用を仲介および編成できるように、アプリケーションがシステムリソース(この場合はネットワーク接続)を利用するためのインターフェースを提供します。

ソケットを介して送信されるデータをメールのエンベロープと見なすことができる場合、ソケットはメールボックスになります。メールボックス(ソケット)を家(プログラム)に添付し、そこに送信メール(データ)を入れます。スケジュールされた時間になると、郵便配達員(オペレーティングシステム)がやって来て、送信メールを受け取り、同じメールボックス内の受信メールをすべてドロップします。あなたの送信メールはあなたに代わってすべてのあなたの隣人のメールと共に郵便配達人のトラック(ネットワーク接続)を通して受信者に運ばれます。これにより、自分で手紙を届ける費用、時間、困難さなどを必要とせずに、遠く離れた人とやり取りすることができます。

なぜそれらが「ソケット」と呼ばれるのかについては、発明者が好きなようにそれを呼び出すことができるという考えは、おそらくそこで大きな役割を果たすでしょう。しかし、それは私の意見では悪い名前ではありません:)

7
Andrew Lambert

Udpまたはtcp over IPの場合、

ソケットアドレスは、IPアドレスとポート番号の組み合わせです。

IPアドレスは、インターネット上のマシンのアドレスです。 unix.stackexchange.com has address 198.252.206.140

ただし、各マシンは複数のサービスを提供できる必要があるため、ほとんどのマシンはポート80にhttp(Webページ)、ポート22にsshなどを提供します。

そう unix.stackexchange.com:80 ポート 80/unix.stackexchange.com(ソケット)は、このWebサイトのアクセスポイントです。

ただし、他のタイプのソケットがあります。以下のコメントを参照してください。

2
ctrl-alt-delor

ネットワーキングについてお伺いしたと思います。したがって、TCPサービスは、通信のポイントとしてソケットを使用し、IPアドレス、プロトコル、およびポート番号で構成されます。

0
Dragos Alexe