要件:毎日、ウェブページやアプリを開く際、閲覧した情報はほぼ必ずHTTPまたはHTTPSリクエストの応答によってアクセスされます。C#を使い、Hypertext Transfer Protocolとネイティブソケットを使ってHTTPリクエストを送信します。
合意
ハイパーテキスト転送プロトコル(HTTP)は、分散型の協働ハイパーテキスト情報システムで使用される状態のないアプリケーション層プロトコルです。
HTTP / 1.1 プロトコル(RFC 9112):ハイパーリンクのログインが見えます。 HTTP意味論(RFC 9110):ハイパーリンクのログインが見えます。
例示リクエスト:
HTTP/1.1 hello.txt取得
User-Agent: curl/7.64.1
Host: ハイパーリンクのログインが見えます。
Accept-Language: en, mi サンプル回答:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
こんにちは、世界!私のコンテンツには後尾のCRLFが含まれています。
ソケットはリクエストを送信します
ソースコードは以下の通りです:
ソースコードはHTTPおよびHTTPSプロトコルへのリクエスト送信をサポートしています。以下に示すように:
接続:近い vs キープアライブ
ReadToEndAsyncを使ってレスポンスからすべてのデータを読み取る場合、接続をクローズに設定する必要があります。キープアライブに設定すると、ReadToEndAsyncのレスポンスはフリーズします。フリーズしない理由:多くのウェブサーバー(Nginx、Apache、特定のAPIゲートウェイなど)は、クライアントがネイティブにソケットを書き込む場合や、サーバーがアイドルタイムアウト(通常5秒に設定され)をトリガーすると、TCP接続を閉じるためにFINパケットを積極的に送信します。
HTTPパイプラインは複数のリクエストを同時に送信します:ハイパーリンクのログインが見えます。
Transfer-Encoding: chunked 表示数据是以分块的形式传输的。每个数据块前面都有一个指示该块大小的十六进制数字,这个数字后面跟着一个换行符(CRLF),然后是实际的数据内容,再接着另一个换行符来结束这一块。这种编码方式允许服务器在不知道全部内容长度的情况下开始发送数据。
FDD8は、次のデータブロックのサイズ(バイト単位)を指定する16進数です。fdd8を16進数から10進数に変換すると65,016バイトになります。つまり、fdd8とCRLFの直後に65,016バイトのデータが存在します。その後、さらにデータブロックが増え、サイズ0のブロックに遭遇するまで続き、これは送信完了を示します。
FDD8は受信側に次のデータブロックの長さが65,016バイトであることを伝えます。 |