[HTTP][会话与消息][三][学习笔记]

网友投稿 682 2022-05-30

1.典型HTTP会话

在像HTTP这样的CS协议中,会话分为三阶段:

客户端建立一条TCP连接(如果传输层不是TCP,也可以是其他连接)。

客户端发送请求并等待应答。

服务器处理请求并送回应答,回应包括一个状态码和对应的数据。

从HTTP/1.1开始,连接在完成第三阶段后不再关闭,客户端可以再次发起新的请求。第二步和第三步可以连续进行数次。

1.1.建立连接

在CS协议中,连接是由客户端建立的。在HTTP中打开连接意味着在底层传输层启动连接,通常是TCP。

使用TCP时HTTP服务器默认端口号为80。

1.2.发送客户端请求

一旦连接建立,用户代理可以发送请求。客户端请求由一系列文本指令组成,并使用CRLF分割,被划分为三个块:

第一行包括请求方法及请求参数:

文档路径,不包括协议和域名的绝对路径URL

使用的HTTP协议版本

接下来每行都表示一个HTTP首部,为服务器提供关于所需数据的信息(语言,MIME类型等)。

最后一块是可选数据,有更多数据,主要被POST方法所使用

请求示例

import java.net.HttpURLConnection; import java.net.URL; public class HttpGetTest { public static void main(String[] args) { HttpURLConnection httpURLConnection = null; try { //1,获取要访问的地址 URL url = new URL("http://example.org/"); //2,得到HttpURLConnection对象 httpURLConnection = (HttpURLConnection) url.openConnection(); //3,设置请求参数 //设置是否从httpurlconnection输出 httpURLConnection.setDoOutput(false); //设置是否从httpurlconnection读入 httpURLConnection.setDoInput(true); //设置请求方式,默认为get httpURLConnection.setRequestMethod("GET"); //设置是否使用缓存 httpURLConnection.setUseCaches(false); //设置httpurlconnection是否应该自动执行http重定向 httpURLConnection.setInstanceFollowRedirects(false); //设置超时时间(毫秒) httpURLConnection.setConnectTimeout(3000); //连接 httpURLConnection.connect(); //4,获取响应状态码返回值responseCode int responseCode = httpURLConnection.getResponseCode(); //5,设置响应显示 if (responseCode == 200) { //响应正常 System.out.println("状态码为:" + responseCode + "。响应正常"); } } catch (Exception e) { e.printStackTrace(); }finally { //6,断开连接释放资源 if (null != httpURLConnection) { try { httpURLConnection.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } } }

请求方法

HTTP定义一组请求方法用来指对目标资源的行为。一般是名词,但有时会叫HTTP动词。最常用的请求方法是GET和POST:

GET方法请求指定的资源。GET请求应该只被用于获取数据。

POST方法向服务器发送数据,因此会改变服务器状态。这个方法常在HTML表单中使用。

1.3.服务器响应结构

当收到用户代理发送的请求后,Web服务器会处理并送回响应。服务器响应也是由一系列文本组成,并使用CRLF分割,它们被划分为三个不同的块:

第一行是状态行,包括使用的HTTP协议版本,状态码和一个状态描述(可读描述文本)。

接下来每行表示一个HTTP首部,为客户端提供关于所发送数据的一些信息(类型,数据大小,使用的压缩算法,缓存指示等)。

最后一块是数据块,包含了响应的数据(如果有的话)。

响应示例

一个成功的网页响应:

响应状态码

HTTP响应状态码用来表示一个HTTP请求是否成功完成。响应分五种类型:信息型响应,成功响应,重定向,客户端错误和服务端错误。其中最常见的是以下三个状态码:

200:OK,请求成功。

301:Moved Permanently。请求资源的URI已被改变。

404:Not Found。服务器无法找到请求的资源。

2.HTTP消息

HTTP消息是服务器和客户端之间交换数据的方式。有两种类型的消息:请求(requests),由客户端发送用来触发一个服务器上的动作;响应(responses),来自服务器的应答。

HTTP消息由采用ASCII编码的多行文本构成。在HTTP/1.1及早期版本中,这些消息通过连接公开地发送。在HTTP/2中,为了优化和性能方面的改进,曾经可人工阅读的消息被分到多个HTTP帧中。

HTTP/2二进制框架机制被设计为不需要改动任何API或配置文件即可应用:大体上对用户是透明的。

HTTP请求和响应具有相似的结构,由以下部分组成:

一行起始行用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。

一个可选的HTTP头集合指明请求或描述消息正文。

一个空行指示所有关于请求的元数据已经发送完毕。

一个可选的包含请求相关数据的正文(比如HTML表单内容),或者响应相关的文档。正文的大小有起始行的HTTP头来指定。

起始行和HTTP消息中的HTTP头统称为请求头,而其有效负载被称为消息正文。

2.1.HTTP请求

起始行

HTTP请求是由客户端发出的消息,用来使服务器执行动作。start-line包含三个元素:

HTTP方法,一个动词(GET/PUT/POST)或者一个名词(HEAD/OPTIONS),描述要执行的动作。

request target,通常是一个URL,或者是协议、端口和域名的绝对路径,通常以请求的环境为特征。请求的格式因不同的HTTP方法而异。可以是:

绝对路径,末尾跟上一个?和查询字符串。这是最常见的,称为origin form,被GET/POST/HEAD/OPTIONS方法所使用。

POST / HTTP/1.1

GET /background.png HTTP/1.0

HEAD /test.html?query=hello HTTP/1.1

OPTIONS /test1.html HTTP/1.0

一个完整的URL,称为absolute form,主要在使用GET方法连接到代理时使用。

GET https://www.huawei.com HTTP/1.1

由域名和可选端口(以’:'为前缀)组成的URL的authority component,称为authority form。仅在使用CONNECT建立HTTP隧道时才使用。

CONNECT example.org:80 HTTP/1.1

星号形式(asterisk form),一个简单的*,配合OPTIONS方法使用,代表整个服务器。OPTIONS * HTTP/1.1

HTTP版本(HTTP version),定义了剩余报文的结构,作为对期望的响应版本的指示符。

Headers

来自请求的HTTP headers遵循和HTTP header相同的基本结构:不区分大小写的字符串,紧跟着的冒号:和一个结构取决于header的值。整个header(包括值)由一行组成。

请求头可以分为几组:

General headers,例如via,适用于整个报文

Request headers,例如User-Agent,Accept-Type,通过进一步的定义(例如Accept-Language)或者给定上下文(例如Referer),或者进行有条件的限制(例如If-None)来修改请求。

Entity headers,例如Content-Length,适用于请求的body。显然,如果请求中没有任何body,则不会发送这样的头文件。

Body

请求的最后一部分是它的body。不是所有的请求都有一个body:例如获取资源的请求,GET,HEAD,DELETE和OPTIONS,通常它们不需要body。 有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据)。

body可以分两类:

Single-resource bodies,由一个单文件组成。该类型 body 由两个 header 定义: Content-Type 和 Content-Length.

Multiple-resource bodies,由多部分 body 组成,每一部分包含不同的信息位。通常是和 HTML Forms 连系在一起。

2.2.HTTP响应

状态行

HTTP响应的起始行被称为status line,包含以下信息:

协议版本,通常为HTTP/1.1

status code,表明请求是成功或失败。常见状态码为200,404,302

status text,一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。

一个典型的状态行看起来像这样:HTTP/1.1 404 Not Found。

Headers

响应的HTTP headers遵循和任何其它header相同的结构:不区分大小写的字符串,紧跟着的冒号:和一个结构取决于header类型的值。整个header(包括其值)表现为单行形式。

有许多响应头可用,这些响应头可以分为几组:

[HTTP][会话与消息][三][学习笔记]

General headers,例如Via,适用于整个报文。

Response headers,例如Vary和Accept-Ranges,提供其它不符合状态行的关于服务器的信息。

Entity headers,例如Content-Length,适用于请求的body。显然,如果请求中没有任何 body,则不会发送这样的头文件。

Body

响应的最后一部分是body。不是所有的响应都有body:具有状态码(如 201 或 204)的响应,通常不会有body。

body大致可分为三类:

Single-resource bodies,由已知长度的单个文件组成。该类型body由两个header定义:Content-Type和Content-Length。

Single-resource bodies,由未知长度的单个文件组成,通过将Transfer-Encoding设置为chunked来使用chunks编码。

Multiple-resource bodies,由多部分body组成,每部分包含不同的信息段。但这是比较少见的。

2.3.HTTP/2帧

HTTP/1.x报文有一些性能上的缺点:

Header不像body,它不会被压缩。

两个报文之间的header通常非常相似,但它们仍然在连接中重复传输。

无法复用。当在同一个服务器打开几个连接时:TCP热连接比冷连接更加有效。

HTTP/2引入了一个额外的步骤:它将HTTP/1.x消息分成帧并嵌入到流(stream)中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为多路复用(multiplexing)的过程,它允许更有效的底层TCP连接。

HTTP帧现在对Web开发人员是透明的。在HTTP/2中,这是一个在HTTP/1.1和底层传输协议之间附加的步骤。Web开发人员不需要在其使用的API中做任何更改来利用HTTP帧;当浏览器和服务器都可用时,HTTP/2将被打开并使用。

2.4.结论

HTTP报文是使用HTTP的关键;它们的结构简单,并且具有高可扩展性。HTTP/2帧机制是在HTTP/1.x语法和底层传输协议之间增加了一个新的中间层,而没有从根本上修改它,即它是建立在经过验证的机制之上。

HTTP TCP/IP

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Flutter】StatefulWidget 组件 ( Image 组件 | TextField 组件 )
下一篇:Python 并发编程之线程锁
相关文章