令和元年秋期午後問5

質問中さん  
(No.1)
https://www.ap-siken.com/kakomon/01_aki/pm05.html

根本的な質問で大変恐縮です。
「ソケット」とは何なのでしょうか?
ググってみたり、本を読んでも(一応マスタリングTCP/IP入門編は読んでいます)、いまいちよくわかりません。

アプリがTCP/IPで通信をするとき、OSの機能を使うためのAPIということなのでしょうか?
であれば、それが枯渇するという状況がピンときません。(APIが枯渇する??)

また、いわゆる普通の通信ではソケットを使っているのでしょうか?
それとも何か特別な通信の時だけ使っているのでしょうか?

こんな質問で大変恐縮ですが、教えていただけると嬉しいです。
2024.02.01 20:39
GinSanaさん 
AP プラチナマイスター
(No.2)
HTTP通信なら、クライアントが用があったらつないで、入り用が終わったら接続が切れます。
リアルタイムにサーバとクライアントとでやりとりしないといけないようなのにいちいち接続しにいくとリソースのムダなので、ポートを固定してずっとつないでおくようにしたのがソケットという仕組みです。

>枯渇するという状況
sock failed (11: Resource temporarily unavailable)
のようなエラーがサーバ側でおきます。
本問で128が最大になっていたのは、net.core.somaxconnの値をいじってなかっただけかもしれませんが、まとめてソケット通信の確立要求が来たら、129件目から取りこぼしがおきることになります。

>いわゆる普通の通信ではソケットを使っているのでしょうか
リアルタイムにサーバとクライアントとでやりとりしないといけないような状況なので、ストリーミング配信とかに使います。通信効率の向上とかそういう目的です。
node.jsでインターネットにストリーミング配信
のブログではソケットを使ってました。
2024.02.01 21:50
納豆のたれさん 
(No.3)
アプリからみたらAPIですが、OSとしてはいろいろ管理しなければなりません。
・相手のIPアドレス
・相手のポート番号
・自分のIPアドレス
・自分のポート番号
  その他
そのためには器(メモリ)が必要です。
器が128しかないときに全部使用中だと、129個目を同時に接続することができません。
それが枯渇した状態です。

ソケットはTCPとUDPが利用可能ですし、TCPでもUDPでもないICMPやOSPFも利用可能です。
ですからある意味、特別な通信もソケットでいけると言ってよいと思います。

GinSanaさん(No.2)が説明している、一旦接続したら切断せずに使いまわすというのは、
HTTPのKeepalive機能のことだと思います。
2024.02.02 10:52
質問中さん  
(No.4)
>GinSanaさん
ありがとうございます。
おっしゃっているのは、WebSocketのことでしょうか?
確かに問題もWebsocketと思って読めばしっくりきます。

>納豆のたれさん
APIを利用するための、OSのメモリが枯渇した、ということでしょうか?
つまり、ソケットとは、アプリとOSとのAPIのことで、枯渇したのはOS側のソケットのためのメモリということでしょうか?

理解が悪くて申し訳ありませんが、よろしくお願いします。
2024.02.02 19:43
pixさん 
AP シルバーマイスター
(No.5)
ソケットを理解するには、仕様と実装の違いを理解する必要があります。

TCP/IPはプロトコルです。これはネットワーク通信に関する決まりを
仕様として定義したものです。

TCP/IPだけがあってもOSは通信することができません。TCP/IPというルールに
沿った通信用プログラム(API)を作成(実装)する必要があります。
その実装がソケットです。ソケットは今から40年ほど前、UNIX(BSD)上で
開発されました。
ソケットの特徴として、ディスクへのファイル操作と類似しており、
ファイル操作の要領でネットワーク通信ができるという特徴があります。

ソケット以外の実装ですが、昔はいろいろなOSでソケットより高性能な
実装が開発されました。過去にSTREAMSというソケットより洗練された
実装がありましたが、その時点でソケットが広く普及していたため、
普及はしませんでした。
現在ではTCP/IPの実装としてはソケットが一強となっており、ライバルが
いない状況です。

WindowsもソケットをWindows用に改良したものをWinSockとして
実装しています。

ソケットの特徴として、ソケットを使う度にOSのメモリを消費すると
いうものがあります。極端な数のソケットを使ってしまうと
OSのメモリが枯渇し、OSが停止するような事態に陥ることもあります。
2024.02.02 20:21
納豆のたれさん 
(No.6)
> 枯渇したのはOS側のソケットのためのメモリということでしょうか?

OS側のソケットのためのメモリが枯渇したと言うより、ソケットを管理するためのテーブルを使い切ったのだと思います。
テーブルはメモリ上にあるはずなので、「器(メモリ)」という表現を使いましたが少し分かりにくかったかもしれません。
2024.02.02 21:50
質問中さん  
(No.7)
>pixさん、納豆のたれさん

ありがとうございます。
ソケット=クライアントとOSが通信をするための実装
で、「枯渇した」とは、ソケットはOSのメモリを消費するので、メモリが枯渇してしまった(正確には管理するためのテーブルを使い切った)。

ということですね。

理解ができました!
ご丁寧におしえていただきありがとうございました。
大変勉強になりました!
2024.02.06 21:06
質問中さん  
(No.8)

クライアントとOS、でなく、アプリとOSの間違いです。
2024.02.06 21:07

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop