質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

793閲覧

TCP/IPとHTTPについて - webサーバーにリクエストが来た時点では全部のリクエストが揃ってる?

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2018/03/11 00:59

TCP/IPの基礎的なところを先日勉強したばかりのプログラマーです。

TCP/IPではパケットが細切れになってデータがやりとりされるとのことですが、そこでひとつ気になったことがあります。

Webサーバーにクライアントからリクエストが届いている段階というのは、リクエスト全体を構成する全てのデータ(パケット?)が揃っている状態なのでしょうか?

擬似コード

server.get('/index', function (request, response) { })

普段、自分は例えば上のようなgetリクエストを受け付けるような擬似コードがあったとした場合、requestオブジェクトを参照すると全部必要なデータ(ボディ情報)を含めて、使える状態になっている気がするのですが、これは上手いこと自分が使っているフレームワークなりがリクエストオブジェクトに細切れに渡って来ているデータをまとめてくれてるのでしょうか?(ちなみに最近使ってるフレームワークはnode.jsのexpressです)

それとも、tcp/ip通信からhttp通信に切り替わるタイミングのようなものがあって、http通信をする段階ではすでにリクエストデータを構成する必要なパケットが全て揃ってるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

Webサーバーにクライアントからリクエストが届いている段階というのは

何かのシグナルがきた時点を「届いた」とすることも、ヘッダまで読めた時点を「届いた」とすることもできますから、これでは曖昧で、なんともいえません。

express を使っているとのことですので、Node.js の話をします。Node.js の http/https を使う場合、リクエストのイベントが発生した時点で、ヘッダの情報は全て参照できるようになっていますが、ボディは受け取れていません。ボディを全て受け取るには、次のように書きます。

javascript

1const http = require('http'); 2 3const server = http.createServer() 4.on('listening', () => { 5 console.log('listening', server.address()); 6}) 7.on('request', (req, res) => { 8 const chunks = []; 9 req 10 .on('data', (chunk) => { 11 chunks.push(chunk); 12 }) 13 .once('end', () => { 14 const receivedData = Buffer.concat(chunks); 15 console.log(receivedData.toString()); 16 }); 17}) 18.listen(3000);

もっと低レベルな通信をしたい場合は、net を使います。
いくつか例を作成しましたので、参考になさってください。

投稿2018/03/11 03:34

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/11 03:47

サンプルまで作成して頂いてありがとうございます!早速拝見させて頂いているところですが、また後で質問させていただけると嬉しいです〜!!確認なのですが、このサンプルの1番目は1つのサーバーが自分自身で自分にリクエストを送って、自分自身がそれに応答しレスポンスを返しているのですよね?
退会済みユーザー

退会済みユーザー

2018/03/11 03:52

破壊的に分かりやすいです。ありがとうございます!
退会済みユーザー

退会済みユーザー

2018/03/11 03:58 編集

そうです。ただ「サーバーがリクエストを送る」というのは違います。作ったサーバーにむけてリクエストを送っているというだけで、listeningの中はサーバーとは関係ありません。sendRequestとか、関数で切り出したほうがわかりやすかったかもしれませんね。
退会済みユーザー

退会済みユーザー

2018/03/11 04:01

Node.jsのこのあたりを学習するには、streamの知識が必要になります。便利ですので、ドキュメントを読むなどして、ぜひマスターしてください。https://nodejs.org/api/stream.html
退会済みユーザー

退会済みユーザー

2018/03/11 04:04

ありがとうございます。実は先週socket.ioの勉強をしていてそれでソケット絡みのことが気になったので、昨日、一昨日とtcp/ipのど基本とnode.jsのstreamの勉強をしていたところだったのです。
退会済みユーザー

退会済みユーザー

2018/03/11 04:07

すみません、ちなみにstreamは便利とありましたが、どういったことにhooさんは普段、streamを使われているのですか?いまいち自分では勉強している中で使い道がよくわからず、途中でちょっと昨日は投げ出してしまったのですが(恥)
退会済みユーザー

退会済みユーザー

2018/03/11 04:14

作成して頂いたサンプルの2つ目を拝見したのですが、netとhttpモジュールの違いはサンプルコードの範囲に限っては、netモジュール利用時はリクエストのヘッダーを自分で作っていて、httpモジュール利用時はリクエストはhttpモジュールが勝手に作ってくれてるのを使っているという違いでしょうか?https://stackoverflow.com/questions/29869999/http-createserver-vs-net-createserver-in-node-js 2つの違いをぐぐったら、ここにたどり着き読んで見たら、httpモジュールの方はリクエストヘッダーまでは上手いことやってくれるって書いてあったので、サンプルコードと一致しているっぽかったです。
退会済みユーザー

退会済みユーザー

2018/03/11 04:17

netモジュールはリクエストがhttpプロトコルに沿ったものかは知らないので、自分でリクエストデータが適切にhttpプロトコルに沿っているかを検証する必要もあったり、リクエストヘッダを作ってあげたりする必要がある。一方、httpモジュールはそれらを勝手にやってくれる。こんな感じで理解してよさそうでしょうか?
退会済みユーザー

退会済みユーザー

2018/03/11 04:18

expressを使うと、requestのbodyも参照できるのは、これはexpressが内部で使ってるhttpモジュールがやってくれていることに加えて、さらにいろいろやってくれているからということで合っていますか?すみません、質問多くて。。。
退会済みユーザー

退会済みユーザー

2018/03/11 04:29 編集

netモジュールを使うシーンというのは、HTTP(s)以外のFTP, DNS, SMTPプロトコルが必要になってくるアプリケーションを作る時という解釈であってますでしょうか?あ、ごめんなさい。ここで追加質問はもうしません。。。
退会済みユーザー

退会済みユーザー

2018/03/11 04:39

そうですね。http/httpsはnetをラップしたモジュールで、中身はサンプルとして書いたもののような感じになっているはずです。もっとも、私のnetのサンプルではエラー処理がガバガバで実用には堪えないでしょうが、やっていることは伝わると思っています。このガバガバな部分をしっかり作ってあるのが、Node.jsのhttp/httpsです。 streamの使い道ですが、簡単な例だとファイルをコピーするにはこう書けますね。 fs.createReadStream(sourcePath).pipe(fs.createWriteStream(destPath)) socket.ioをお使いなら、socket.ioのポート番号をHTMLの中に入れたくなることがありませんか?そのような時は、stream.Transformを使うと、HTMLのレスポンスを変形できます。 (htmlのstream) .pipe(htmlのヘッダのあたりにsocket.ioのポート番号をねじ込むstream) .pipe(res) 大雑把ですが、こんな感じです。 フロントエンドの開発などで使われるgulpは、vinyl-fsをつかっており、単数・複数のファイルをstreamで流せるようになっています。 https://github.com/gulpjs/vinyl-fs expressについては経験がないので詳しくはわかりません。 http://expressjs.com/en/api.html#req.body に「デフォルトは undefined だけど body-parser か multer が使える」とあるので、これらが知らずに有効になっているではないでしょうか。 net は普段は触らないのですみませんが、わかりません。 https://ja.wikipedia.org/wiki/Internet_Message_Access_Protocol のアプリケーション層のところにある BGP / DHCP / DNS / FTP / HTTP / IMAP / IRC / LDAP / MGCP / NNTP / NTP / SNTP / TIME / POP / RIP / ONC RPC / RTP / SIP / SMTP / SNMP / SSH / Telnet / TFTP / TLS/SSL / XMPP のあたりは、頑張ればできるのかもしれませんね。
退会済みユーザー

退会済みユーザー

2018/03/11 04:46

>「デフォルトは undefined だけど body-parser か multer が使える」 なるほど!body-parserをいつも何も考えずに使ってるので、それでbodyが準備万端になってたのですね。expressの理解が深まりました!! socket.ioはまだ先週勉強してなんとなく使えるようになったレベルなので、まだポート番号をhtmlに入れたくなるケースというのが想像つかないですが、書いて頂いたことを頭に入れて覚えておきたいと思います! いろいろと回答頂いてありがとうございました!!
guest

0

TCP/IPってのはデータをやり取りする規格
HTTPってのは簡単に言うとWebページを構成するためのデータフォーマットの規格
全くべつのレベルの話なので、切り換わるとかそんなはなしではありません。

たとえば、
TCP/IP 水道管
HTTP  コーヒーの入れ方
と例えてみるとわかりますw

投稿2018/03/11 01:11

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/11 02:07

> HTTPってのは簡単に言うとWebページを構成するためのデータフォーマットの規格 それはHTMLではないですか?HTTPもTCP/IP同様に通信規格ですよね。
y_waiwai

2018/03/11 02:13

はい、それはHTMLです。まー、それと同様に、HTTPとTCP/IPは同様ではありません。 「ネットワークレイヤ」でぐぐってみましょう。そこらへんの解説がひっかかってきます HTML、HTTP、TCP/IP、それぞれ、レイヤ階層が違います
guest

0

node.jsのネイティブhttpモジュールを調べていたら、ひとかたまりのデータ(たぶんパケットのこと)を受け取る度に発火するdataイベントをリッスン出来たり、全てのデータ(全パケット?)を受け取り終えた時に発火するendイベントをリッスン出来たりすることがわかったので、普段はその辺の内部処理を勝手にフレームワークなり高レイヤーモジュールがやってくれているのだろうと思いました。

投稿2018/03/11 03:22

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

BAが出てますが・・・OSI参照モデル あるいは、TCP/IPアレルギー撲滅ドリルを参考に
「追記」TCP(Transmission Control Protocol:トランスポート層)は,ネットワークで送受信されるデータの伝送単位である「パケット」の分割や組み立てをします。(エラーや欠落による再送要求も)
"すべて揃ってる”の意味がブラウザで見る1頁分の情報と言う意味ならちがいますd^^ なぜならブラウザは、受信したHTMLファイルに含まれている画像などを送信する様にリクエストするかも知れないからです。
下記は、現在のページを再読み込みしたときの結果です。
テラテイルの1頁を読み込むのに74回もリクエストが出ています。
ページ読み込み

投稿2018/03/11 02:37

編集2018/03/11 03:34
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

HTTPは内部的にTCP/IPを使用しております(HTTPoverUDPも聞いたことあります)。ですので、実際にはTCP/IPが下請けとして使用されており、これをとりまとめたものをプログラマが使用しているという形です。

投稿2018/03/11 01:58

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問