HTTPプロトコル

1. HTTPプロトコルの概要

1.1インターネットとは

互联网=物理连接介质+互联网协议

インターネットの目的

数据传输打破地域限制;

オンラインになるもの

上网过程也就是浏览器向服务端发送请求,然后将服务端主机的文件下载到本地显示的过程,其中浏览器和服务器之间履行HTTP协议;
1.HTTP协议,全称Hyper Text Transfer Protocol(超文本传输协议)

2.HTTP协议是用于从(WWW:World Wide Web,简万维网 )服务器传输超文本到本地浏览器的传送协议。

3.HTTP协议工作于b/s架构上,浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送请求Request,Web服务器根据接收到的请求后,向客户端发送响应信息Response。

4.HTTP协议是基于TCP/IP通信协议来传递数据的(HTML 文件, 图片文件等),如下图

ここに画像の説明を挿入
HTTPプロトコルの開発は、3つのバージョン(HTTP 0.9、1.0、1.1、2.0、HTTP 1.1が現在の主流のHTTPバージョンです)の進化を遂げてきました。

1.2 HTTP / 1.1の詳細説明

HTTP 1.1は、キープアライブ接続、リクエストパイプライン、チャンクエンコーディング送信、バイト範囲リクエストなど、多くの主要なパフォーマンス最適化を導入しています。

持続的接続(キープアライブ接続)

  1. 長い接続を
    使用すると、HTTPデバイスはトランザクションの終了後もTCP接続を開いたままにできるため、クライアントまたはサーバーが接続を閉じるまで、将来のHTTP要求で現在の接続を再利用できます。

  2. HTTP1.1とHTTP1.0のバージョン
    。HTTP1.0で永続的な接続を使用するには、リクエストヘッダーConnection:Keep-Aliveを追加する必要があります。特別なステートメントがサポートしていない限り、HTTP 1.1のすべての接続はデフォルトで永続的な接続です(HTTPリクエストメッセージヘッダー接続を追加:閉じる)。
    ここに画像の説明を挿入

パイプライン処理(リクエストパイプライン)

持続的接続をサポートするクライアントは、その要求を「パイプライン処理」することができます(つまり、各応答を待たずに複数の要求を送信できます)。サーバーは、これらの要求に対する応答を、それらが受信されたのと同じ順序で送信する必要があります。
ここに画像の説明を挿入
チャンクエンコーディング送信

  1. はじめに
    このコードは、エンティティをブロックで送信し、長さが0ブロックになるまでブロックごとに長さを示します。これは、エンティティの長さが不明な場合(データベースによって動的に生成されるデータなど)に特に役立ちます。

  2. 送信エンコーディングとチャンクエンコーディング。
    レスポンスヘッダーにチャンクエンコーディングを表すTransfer-Encoding:chunkedが含まれている場合、「メッセージ」は既知のサイズのいくつかのチャンクに分割され、チャンクは互いに隣り合って送信されます。送信する前にメッセージ全体のサイズを知る必要はありません。これは、Content-Lengthヘッダーを書き戻す必要がないことも意味します。

  3. ブロック送信の適用
    永続的な接続を使用する場合、サーバーがメインコンテンツを送信する前に、メインコンテンツのサイズを計算してから、応答ヘッダー(Content-Length:本体のバイト数)に入れてクライアントに送信する必要があります。
    サーバーがコンテンツを動的に作成する場合、送信前に本文のサイズを認識できない場合があります。ブロックコーディングはこの状況を解決するためのものです。サーバーは、各ブロックのサイズを示すブロックを本文ごとに送信します。次に、サーバー
    サイズ0のブロックを終了ブロックとして使用して、次の応答を準備します。現時点では、応答ヘッダーでContent-Lengthは不要になりました。チャンクエンコーディングTransfer-Encoding:chunkedを使用しない限り、応答ヘッダーはContent-Lengthヘッダーを使用します。

  4. Content-Lengthヘッダーについて
    リクエストヘッダーにAccept-Encoding ':' gzip 'が含まれている場合、サーバーはコンテンツを圧縮して返します。コンテンツのContent-Lengthの長さは圧縮された長さです。
    リクエストヘッダーにAccept-Encoding'が含まれていない場合: 'gzip'、
    サーバーはgzip圧縮を使用せず、サーバー設定はブロックエンコードを実行しません。したがって、応答ヘッダーのContent-Lengthヘッダーが必要ですが、この値のサイズは、圧縮されていないファイルのサイズでなければなりません。

バイト範囲
は、送信コンテンツの一部をサポートするように HTTP 1.1を要求します。たとえば、クライアントが既にコンテンツの一部を持っている場合、帯域幅を節約するために、サーバーからコンテンツの一部のみを要求できます。この機能は、リクエストメッセージに範囲ヘッダーフィールドを導入することで実装されます。これにより、リソースの特定の部分のみをリクエストできます。応答メッセージのContent-Rangeヘッダーフィールドは、オブジェクトの返される部分のオフセット値と長さを宣言します。サーバーがオブジェクトによって要求されたコンテンツを対応して返す場合、応答コードは206(部分的なコンテンツ)です。

2. HTTPリクエスト

2.1 URL / URI

URIとは
HTTPはUniform Resource Identifier(URI)を使用してデータを送信し、接続を確立します。

URLとはURL
は、特定のリソースを見つけるために使用される情報を含む特別なタイプのURIです。フルネームはUniformResourceLocatorで、中国語ではUniform Resource Locatorと呼ばれます。これは、インターネット上のリソースを識別するために使用されるアドレスです。

URL構成

案例:http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

#1.协议部分:http://
该URL的协议部分为“http:”,在"HTTP"后面的“//”为分隔符。这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等。
===>如果不写,浏览器会自动补全,但必须有;

#2.域名部分:www.aspxfans.com
一个URL中,也可以使用IP地址作为域名使用
===>必须有;

#3.端口部分:8080
跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。
===>端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口80

#4.虚拟目录部分:/news/
从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。
===>虚拟目录也不是一个URL必须的部分。

#5.文件名部分:index.asp
从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。
===>文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

#6.参数部分:boardID=5&ID=24618&page=1
从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
===>参数部分非必须

#7.锚部分:#name
从“#”开始到最后,都是锚部分。
===>锚部分也不是一个URL必须的部分

URLとURIの違い
URI
URIは、リソースを一意に識別するために使用される統一リソース識別子です。

HTMLドキュメント、画像、ビデオクリップ、プログラムなど、Web上で利用可能なすべてのリソースは、
一般に3つの部分で構成されるURIを見つけるためのURIです。

  1. リソースにアクセスするための命名メカニズム
  2. リソースが格納されているホスト名
  3. リソースを強調した、パスによって表されるリソース自体の名前。

URL
URLは、特定のURIであるユニフォームリソースロケータです。つまり、URLはリソースの識別に使用でき、リソースの検索方法も指定します。

URLはインターネット上の情報リソースを説明するために使用される文字列で、主にさまざまなWWWクライアントプログラムやサーバープログラム、特に有名なモザイクで使用されます。

URLを使用すると、ファイル、サーバーアドレス、ディレクトリなど、さまざまな情報リソースを統一された形式で記述できます。URLは通常3つの部分で構成されます。

  1. 契約(またはサービス方法)
  2. リソースが格納されているホストのIPアドレス(ポート番号を含む場合があります)
  3. ホストリソースの特定のアドレス。ディレクトリやファイル名など

URN
URN、ユニフォームリソース名、ユニフォームリソースの命名は、mailto:[email protected]などの名前でリソースを識別するためのものです。

URIは、統一されたリソース識別を定義するための抽象的な高レベルの概念であり、URLとURNは、特定のリソース識別方法です。URLとURNはどちらも一種のURIです。

一般的に言って、すべてのURLはURIですが、すべてのURIがURLであるとは限りません。これは、URIにサブクラスであるUniform Resource Name(URN)も含まれているためです。URNはリソースに名前を付けますが、リソースの検索方法は指定していません。上記のmailto、news、isbn URIはすべてURNの例です。

2.2リクエストフォーマット

クライアントがHTTP要求をサーバーに送信するための要求メッセージ形式は、要求行、要求ヘッダー、空白行、および要求データの4つの部分で構成されています。
ここに画像の説明を挿入

请求行以一个方法GET或POST开头,以空格分开,后面跟着请求的URI和协议的版本。详细解释如下
GET /linhaifeng/p/7278389.html HTTP/1.1
Host: www.cnblogs.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9


#第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.
GET说明请求类型为GET
/linhaifeng/p/7278389.html为要访问的资源
该行的最后一部分说明使用的是HTTP1.1版本

#第二部分:从第二行起为请求头部,紧接着请求行(即第一行)之后,用来说明服务器要使用的附加信息
HOST将指出请求的目的地.
User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等

#第三部分:空行,请求头部后面的空行是必须的
即使第四部分的请求数据为空,也必须有空行。

#第四部分:请求数据也叫主体,可以添加任意的其他数据。
这个例子的请求数据为空。只有POST方法才有请求体,可以用浏览器登录一个网站,输错账号密码来抓取POST请求
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

2.3 HTTPリクエストメソッド

HTTP1.0は
、GET、POST、およびHEADメソッドの3つのリクエストメソッドを定義しています。

HTTP1.1では
、OPTIONS、PUT、DELETE、TRACE、およびCONNECTメソッドの5つの新しいリクエストメソッドが追加されています。

GET     请求指定的页面信息,并返回实体主体。
HEAD     类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST     向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT     从客户端向服务器传送的数据取代指定的文档的内容。
DELETE      请求服务器删除指定的页面。
CONNECT     HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS     允许客户端查看服务器的性能。
TRACE     回显服务器收到的请求,主要用于测试或诊断。

GETとPOSTの違い

#1、区别1: 参数的组织方式不同
GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,
例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

POST方法是把提交的数据放在HTTP包的Body中.
因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

#2、区别2:传输数据大小限制
首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。

而在实际开发中存在的限制主要有:
GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系 统的支持。
因此对于GET提交时,传输数据就会受到URL长度的 限制。

POST:由于不是通过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

可以简单总结为:
GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

#3、区别3:安全性
POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击

3. HTTPプロトコルの応答

サーバーは、クライアントから送信された要求を受信して​​処理した後、HTTP応答メッセージResponseを返します。

HTTP応答も、ステータス行、メッセージヘッダー、空白行、応答本文の4つの部分で構成されます。
ここに画像の説明を挿入

#第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

#第二部分:消息报头,用来说明客户端要使用的一些附加信息,
Date:生成响应的日期和时间;
Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

#第三部分:空行,消息报头后面的空行是必须的

#第四部分:响应正文,服务器返回给客户端的文本信息。
空行后面的html部分为响应正文。

HTTP応答ステータスコード

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:

200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求,但是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
更多状态码http://www.runoob.com/http/http-status-codes.html

4番目に、HTTPプロトコルの完全なワークフロー

HTTPプロトコルは、WebクライアントがWebサーバーにWebページを要求する方法と、サーバーがWebページをクライアントに送信する方法を定義します。HTTPプロトコルは、要求/応答モデルを使用します。クライアントはサーバーにリクエストメッセージを送信します。リクエストメッセージには、リクエストされたメソッド、URL、プロトコルバージョン、リクエストヘッダー、リクエストデータが含まれます。サーバーはステータス行で応答します。応答の内容には、プロトコルバージョン、成功またはエラーコード、サーバー情報、応答ヘッダー、および応答データが含まれます。

HTTP要求/応答の手順は次のとおりです。

  1. クライアントがWebサーバーに接続
    するHTTPクライアント(通常はブラウザー)は、WebサーバーのHTTPポート(デフォルトでは80)とのTCPソケット接続を確立します。たとえば、http://www.oakcms.cnです。

  2. HTTPリクエストの送信
    クライアントは、TCPソケットを介してWebサーバーにテキストリクエストメッセージを送信します。リクエストメッセージは、リクエストライン、リクエストヘッダー、空白行、リクエストデータの4つの部分で構成されます。

  3. サーバーは要求を受け入れ、HTTP応答を
    Webサーバーに返し、要求を解析して要求されたリソースを見つけます。サーバーはリソースのコピーをTCPソケットに書き込みます。TCPソケットはクライアントによって読み取られます。応答は、ステータス行、応答ヘッダー、空白行、応答データの4つの部分で構成されます。

  4. 接続のTCP接続の解放
    接続モードが閉じている場合、サーバーはTCP接続をアクティブに閉じ、クライアントは接続をパッシブに閉じてTCP接続を解放します。接続モードがキープアライブの場合、接続は一定期間維持され、その間要求を受信し続けることができます。

  5. クライアントブラウザーはHTMLコンテンツを解析します。
    クライアントブラウザーは最初にステータス行を解析して、リクエストが成功したかどうかを示すステータスコードを確認します。次に、各応答ヘッダーが解析され、応答ヘッダーは、以下がHTMLドキュメントの数バイトとドキュメントの文字セットであることを通知します。クライアントブラウザーは、応答データHTMLを読み取り、HTML構文に従ってフォーマットし、ブラウザーウィンドウに表示します。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5、释放 TCP连接;
6、浏览器将该 html 文本并显示内容;   

V. HTTPプロトコルの主要な要約

#1、简单快速
客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。


#2、灵活
HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。


#3、无连接
HTTP无连接说的是:当某个客户机在短时间多次次请求同一个资源,服务器并不能区别是否已经响应过用户的请求。
于是我们每次发送http请求,都需要事先发起一个到服务器的TCP请求,经历“三次握手”的过程。这针对大流量的的服务器来说,开销是相当大的。这是http无链接带来的缺点

   针对http无连接,人们设计了非持久连接和持久连接。实际上关于http协议非持久连接和持久连接是针对tcp协议的。当客户机/服务器的交互运行于TCP协议上时,应用程序的每个请求/响应对是经不同的TCP连接时,则该应用程序使用非持久连接,而当应用程序的每个请求/响应对是经相同的TCP连接发送,则该应用程序使用持久连接。

    非持久连接
    请求一个HTTP请求/响应需要的总时间=客户端发出建立连接+发生请求报文+服务器传输HTML文件的时间

    持久连接
    服务器在发送响应后,保持该TCP连接打开。在相同的客户机与服务器之间的后续请求和响应报文通过相同的连接进行传送。不需要再次建立tcp连接 


#4、无状态
所谓http是无状态协议,言外之意是说http协议没法保存客户机信息,
无状态的优点是:
    在服务器不需要先前信息时它的应答就较快。
无状态的缺点是:
    缺少状态意味着如果后续处理需要前面的信息,则它必须重传。这样可能导致每次连接传送的数据量增大

关于http无状态阻碍了交互式应用程序的实现。比如记录用户浏览哪些网页、判断用户是否拥有权限访问等。于是,两种用于保持HTTP状态的技术就应运而生了,一个是Cookie,而另一个则是Session。


#5、支持B/S及C/S模式。

6、Pythonカスタムソケット分析HTTPプロトコル

おすすめ

転載: blog.csdn.net/msmso/article/details/108536010