- PR -

Webサーバに複数のクライアントから同時に接続要求があったとします

投稿者投稿内容
世界の中心で愛を酒舞
会議室デビュー日: 2004/11/19
投稿数: 4
投稿日時: 2004-11-19 15:16
拙者、世界の中心で愛を酒舞と申す者にございます。

Webサーバに複数のクライアントから同時に接続要求があったとします。
さて、この場合、ポート80番をどういう仕組みで使いまわすのでしょうか?

(最初にWebサーバ(80ポート)とTCPコネクションを張ったクライアントが
 終わるまで他のクライアントはコネクションを張れないと思っていましたが
 違うって叱られました。)

確かに、netstat -anしたら、ESTABLISHとLISTENの双方がありました。
奇ッ怪至極にございます。

[ メッセージ編集済み 編集者: 世界の中心で愛を酒舞 編集日時 2004-11-19 15:17 ]
めぐ
ベテラン
会議室デビュー日: 2004/11/09
投稿数: 86
お住まい・勤務地: 千葉県内
投稿日時: 2004-11-19 18:10
こんにちは。

引用:

Webサーバに複数のクライアントから同時に接続要求があったとします。



同時刻に二つの要求が来る、ということではないですよね。

引用:

(最初にWebサーバ(80ポート)とTCPコネクションを張ったクライアントが
 終わるまで他のクライアントはコネクションを張れないと思っていましたが
 違うって叱られました。)



もしそうだとしたら、大きなファイルをWebサイトからHTTPを通してダウンロード
してる間は、誰もアクセスできなくなってしまいますね。

さて、
昔、Linuxでソケットプログラミングをしていたときの記憶なので、
間違っているかもしれませんが...

Webサーバは、クライアントからの要求を受け付けるために80番ポートで
常に待ち受け(Listen)しています。

プログラム内部では、別にソケットを複数用意しておいて
要求してきた各クライアントのIPとポート番号と対応付けています。

Apacheだと、初めに起動するプロセスが80番ポートで要求を待っていて、
クライアントからの要求がある度に子プロセス(スレッド)を生成します。
各子プロセスは、独自に確保したソケットを通じてクライアントと接続を
確立(ESTABLISH)しますので、複数のクライアントとWebサーバが通信できる
わけです。

Mattun
ぬし
会議室デビュー日: 2004/08/10
投稿数: 1391
投稿日時: 2004-11-19 20:06
引用:

Webサーバに複数のクライアントから同時に接続要求があったとします。
さて、この場合、ポート80番をどういう仕組みで使いまわすのでしょうか?


そういう疑問をもってて、
引用:

確かに、netstat -anしたら、ESTABLISHとLISTENの双方がありました。


ってところまで辿り着けてるなら、以下を試してみてください。

クライアントからSSHなりTELNETなり、セッション張り続けるTCPアプリケーションで
複数のTCPセッションを張ってください。
HTTPだとセッションすぐに切れちゃうから分かりにくいですし。
1台のマシンで2セッションでも構いません。TELNETなら、2つのウィンドウから
それぞれセッションを張ってみればいいです。
で、サーバ側で、netstat -nを実行してみてください。
結論としては、1つの待ち受けポートで複数のセッションを処理できるし、
複数のセッションに違う点があるからちゃんと区別も出来る、って感じです。


あとは、TCP/IPの基礎勉強をしてください。
世界の中心で愛を酒舞
会議室デビュー日: 2004/11/19
投稿数: 4
投稿日時: 2004-11-22 11:36
めぐ殿
ご回答有難うでございます。

めぐ殿の御答えに、拙者の知りたかった答えが全て
含まれておりましたでございます。

めぐ殿、今後共宜しくお願い申し上げます。
世界の中心で愛を酒舞
会議室デビュー日: 2004/11/19
投稿数: 4
投稿日時: 2004-11-22 13:36
Mattun殿

> クライアントからSSHなりTELNETなり、セッション張り続けるTCPアプリケーションで
> 複数のTCPセッションを張ってください。
やりましてございます。

> HTTPだとセッションすぐに切れちゃうから分かりにくいですし。
> 1台のマシンで2セッションでも構いません。TELNETなら、2つのウィンドウから
> それぞれセッションを張ってみればいいです。
重々承知でございます。

> で、サーバ側で、netstat -nを実行してみてください。
> 結論としては、1つの待ち受けポートで複数のセッションを処理できるし、
> 複数のセッションに違う点があるからちゃんと区別も出来る、って感じです。
当然、重々承知でございます。
拙者の質問は、めぐ殿の回答に相通ずるものでございます。

> あとは、TCP/IPの基礎勉強をしてください。
基礎でめぐ殿の様に優れたご回答を出せる、とは思えないでございます。

以上でございます。
kaz
会議室デビュー日: 2004/11/19
投稿数: 18
投稿日時: 2004-11-22 13:45
引用:

世界の中心で愛を酒舞さんの書き込み (2004-11-22 13:36) より:

> あとは、TCP/IPの基礎勉強をしてください。
基礎でめぐ殿の様に優れたご回答を出せる、とは思えないでございます。




うん、世界の中心で愛を酒舞さんの言うとうりと思いますな.
世界の中心で愛を酒舞さんの質問の回答は、基礎把握しただけじゃ
わかんないでしょ?(Mattunさんの回答はちょっと・・・)
私、TCP/IPの基礎は把握してるつもりだったけど、回答はできなかったですね...
(てゆーか、どこまでがキソ?)

d (^ー^)

[ メッセージ編集済み 編集者: kαz 編集日時 2004-11-22 13:46 ]
はゆる
ぬし
会議室デビュー日: 2004/02/16
投稿数: 1008
お住まい・勤務地: 首都圏をウロウロと
投稿日時: 2004-11-22 14:01
こんにちは。

引用:

世界の中心で愛を酒舞さんの書き込み (2004-11-22 13:36) より:
> あとは、TCP/IPの基礎勉強をしてください。
基礎でめぐ殿の様に優れたご回答を出せる、とは思えないでございます。


たとえば、「マスタリングTCP/IP 入門編」 の 「6.2 ポート番号」 で説明されてたりはしますね。
あとは、特定のプログラムでの実装を調査するべきかと。
# 初回ポストの内容だと、私も TCP/IP の方をオススメしたかなぁ…
未記人
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 70
投稿日時: 2004-11-22 14:25
W. Richard Stevens の vol.1 までは基礎・基本だと思います。
(TCPコネクションの制御を気にする必要のある人にとっては)

スキルアップ/キャリアアップ(JOB@IT)