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

举报
John2021 发表于 2022/05/22 19:09:05 2022/05/22
【摘要】 1.典型HTTP会话在像HTTP这样的CS协议中,会话分为三阶段:客户端建立一条TCP连接(如果传输层不是TCP,也可以是其他连接)。客户端发送请求并等待应答。服务器处理请求并送回应答,回应包括一个状态码和对应的数据。从HTTP/1.1开始,连接在完成第三阶段后不再关闭,客户端可以再次发起新的请求。第二步和第三步可以连续进行数次。 1.1.建立连接在CS协议中,连接是由客户端建立的。在HT...

1.典型HTTP会话

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

  1. 客户端建立一条TCP连接(如果传输层不是TCP,也可以是其他连接)。
  2. 客户端发送请求并等待应答。
  3. 服务器处理请求并送回应答,回应包括一个状态码和对应的数据。

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

1.1.建立连接

在CS协议中,连接是由客户端建立的。在HTTP中打开连接意味着在底层传输层启动连接,通常是TCP。
使用TCP时HTTP服务器默认端口号为80。

1.2.发送客户端请求

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

  1. 第一行包括请求方法及请求参数:
    • 文档路径,不包括协议和域名的绝对路径URL
    • 使用的HTTP协议版本
  2. 接下来每行都表示一个HTTP首部,为服务器提供关于所需数据的信息(语言,MIME类型等)。
  3. 最后一块是可选数据,有更多数据,主要被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分割,它们被划分为三个不同的块:

  1. 第一行是状态行,包括使用的HTTP协议版本,状态码和一个状态描述(可读描述文本)。
  2. 接下来每行表示一个HTTP首部,为客户端提供关于所发送数据的一些信息(类型,数据大小,使用的压缩算法,缓存指示等)。
  3. 最后一块是数据块,包含了响应的数据(如果有的话)。

响应示例

一个成功的网页响应:

响应状态码

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请求和响应具有相似的结构,由以下部分组成:

  1. 一行起始行用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。
  2. 一个可选的HTTP头集合指明请求或描述消息正文。
  3. 一个空行指示所有关于请求的元数据已经发送完毕。
  4. 一个可选的包含请求相关数据的正文(比如HTML表单内容),或者响应相关的文档。正文的大小有起始行的HTTP头来指定。

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

2.1.HTTP请求

起始行

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

  1. HTTP方法,一个动词(GET/PUT/POST)或者一个名词(HEAD/OPTIONS),描述要执行的动作。
  2. 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
  3. HTTP版本(HTTP version),定义了剩余报文的结构,作为对期望的响应版本的指示符。

Headers

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

  1. General headers,例如via,适用于整个报文
  2. Request headers,例如User-Agent,Accept-Type,通过进一步的定义(例如Accept-Language)或者给定上下文(例如Referer),或者进行有条件的限制(例如If-None)来修改请求。
  3. Entity headers,例如Content-Length,适用于请求的body。显然,如果请求中没有任何body,则不会发送这样的头文件。

Body

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

  1. Single-resource bodies,由一个单文件组成。该类型 body 由两个 header 定义: Content-Type 和 Content-Length.
  2. Multiple-resource bodies,由多部分 body 组成,每一部分包含不同的信息位。通常是和 HTML Forms 连系在一起。

2.2.HTTP响应

状态行

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

  1. 协议版本,通常为HTTP/1.1
  2. status code,表明请求是成功或失败。常见状态码为200,404,302
  3. status text,一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。

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

Headers

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

  1. General headers,例如Via,适用于整个报文。
  2. Response headers,例如Vary和Accept-Ranges,提供其它不符合状态行的关于服务器的信息。
  3. Entity headers,例如Content-Length,适用于请求的body。显然,如果请求中没有任何 body,则不会发送这样的头文件。

Body

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

  1. Single-resource bodies,由已知长度的单个文件组成。该类型body由两个header定义:Content-Type和Content-Length。
  2. Single-resource bodies,由未知长度的单个文件组成,通过将Transfer-Encoding设置为chunked来使用chunks编码。
  3. Multiple-resource bodies,由多部分body组成,每部分包含不同的信息段。但这是比较少见的。

2.3.HTTP/2帧

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

  1. Header不像body,它不会被压缩。
  2. 两个报文之间的header通常非常相似,但它们仍然在连接中重复传输。
  3. 无法复用。当在同一个服务器打开几个连接时: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语法和底层传输协议之间增加了一个新的中间层,而没有从根本上修改它,即它是建立在经过验证的机制之上。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。