如何判断HTTP响应结束(何时可关闭HTTP连接)

如何判断一个HTTP连接的结束?

case 1:有Content-Length

依据Content-Length判断接收数据完成,来结束连接。

case2: 请求头带Connection字段

2.1 close

表明客户端或服务器想要关闭该网络连接,这是 HTTP/1.0 请求的默认值。

由server负责主动关闭。

2.2 keep-alive

表明客户端想要保持该网络连接打开,HTTP/1.1 的请求默认使用一个持久连接。

由server负责主动关闭。

case3:chunked响应

3.1 终止块

HTTP/1.1 200 OK

Content-Type: text/plain

Transfer-Encoding: chunked

7\r\n

Mozilla\r\n

9\r\n

Developer\r\n

7\r\n

Network\r\n

0\r\n

\r\n

终止块是一个长度为0的分块,即其是0后面跟着两个CRLF。没有Trailer,则可以认为结束。(但chunk内容可能是二进制,所以不能直接匹配最后的两个CRLF,需要先匹配每个chunk的长度,然后再偏移,逐步找到最后结束。

3.2 有trailer

HTTP/1.1 200 OK

Content-Type: text/plain

Transfer-Encoding: chunked

Trailer: Expires

7\r\n

Mozilla\r\n

9\r\n

Developer\r\n

7\r\n

Network\r\n

0\r\n

Expires: Wed, 21 Oct 2015 07:28:00 GMT\r\n

\r\n

如果携带了trailer(消息头中可以搜索到Trailer字段),则在终止块(此时是单个CRLF)后,还需要再寻找一个结束符(两个CRLF)。处理完Trailer之后,可以认为结束。

Trailer头中绝不能有以下三个字段:

      . Transfer-Encoding

      . Content-Length

      . Trailer

case4:  range请求

4.1 206 Partial Content响应

4.1.1 包含一个区间

有Content-Range,但Content-Type中没有multipart。有Content-Length且是resp的完整长度。可以依据content-length来判断结束并做close。

HTTP/1.1 206 Partial Content

Content-Range: bytes 21010-47021/47022

Content-Length: 26012

Content-Type: image/gif

4.1.2包含多个区间

Content-Type中指明了multipart/byteranges

HTTP/1.1 206 Partial Content

Accept-Ranges: bytes

Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5

Content-Length: 385

--3d6b6a416f9b5

Content-Type: text/html

Content-Range: bytes 100-200/1270

eta http-equiv="Content-type" content="text/html; charset=utf-8" />

    <meta name="vieport" content

--3d6b6a416f9b5

Content-Type: text/html

Content-Range: bytes 300-400/1270

-color: #f0f0f2;

        margin: 0;

        padding: 0;

        font-family: "Open Sans", "Helvetica

--3d6b6a416f9b5--

如何判断结束?

1. 要判断是multipart/byteranges,然后获取到boundary

Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5

2. 利用“--boundary”分割每个部分(每个部分内容还有content-range字段标识长度)

最后一个boundary之后,如何判断结束???

在协议层无法判断结束,只能在业务层(比如数据本身是结构化的,可判断结束的)判断。

问题

1、Transfer-Length和Content-Length不能同时出现?

Transfer-Length不是HTTP头字段?是表达动态长度的?

2、Transfer-Length和Transfer-Encoding一定同时出现?

总结

1、有Transfer-Encoding字段(其值不是identity),则Content-Length字段被忽略。

2、一个HTTP请求,如果有消息体,但没有Content-Length,那么server就应该回复400。

If a request contains a message-body and a Content-Length is not given, the server SHOULD respond with 400 (bad request).

3、Transfer-Encoding vs Content-Encoding

Transfer-Encoding 是一个逐跳传输消息首部,即仅应用于两个节点之间的消息传递,而不是所请求的资源本身。要将压缩后的数据应用于整个连接,要使用端到端传输消息首部 Content-Encoding 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: HTTP协议连接的流程如下: 1. 建立连接:客户端向服务器发送连接请求,服务器接收到请求后返回响应,建立连接。 2. 发送请求:客户端向服务器发送请求,包括请求的资源、请求方式、请求头等信息。 3. 服务器响应:服务器接收到请求后,根据请求的信息进行处理并返回响应,包括响应码、响应头、响应体等信息。 4. 客户端处理响应:客户端接收到服务器的响应后,根据响应的信息进行处理,例如解析响应头、解析响应体等。 5. 关闭连接连接关闭可以由客户端或服务器任意一方发起,一般是在请求和响应结束后进行关闭关闭连接可以释放网络资源并避免资源浪费。 需要注意的是,HTTP协议是无状态的,即每次请求和响应之间没有明确的关联,服务器不会保存客户端的状态信息。为了解决这个问题,可以使用Cookie或Session等机制来维护客户端状态。 ### 回答2: HTTP(超文本传输协议)是一种应用层协议,它用于在网络中传输超文本文档。它是客户端和服务器之间进行通信的基础协议之一。 HTTP协议的连接流程如下: 1. 客户端与服务器建立TCP连接:客户端通过向服务器发送SYN报文请求建立TCP连接。服务器接收到该请求后,发送ACK和SYN报文作为回应。客户端再次发送ACK报文进行确认。 2. 客户端向服务器发送HTTP请求:客户端发送一个HTTP请求报文给服务器。该报文包括请求行(请求方法、请求URL和HTTP协议版本)、请求头(包含各种请求信息)和请求体(可选)。 3. 服务器处理HTTP请求:服务器接收到客户端发送的请求后,根据请求的URL和方法进行处理。服务器会查找请求的资源,并生成一个HTTP响应报文。 4. 服务器向客户端发送HTTP响应:服务器将生成的HTTP响应报文发送给客户端。该报文包括状态行(表示响应的状态码和相应的状态信息)、响应头(包含各种响应信息)和响应体(包含实际的响应内容)。 5. 客户端接收到HTTP响应:客户端接收到服务器发送的HTTP响应后,解析该响应并进行相应的处理。客户端根据响应头中的数据进行逻辑判断,在需要的情况下,可以通过再次发送HTTP请求来获取进一步的资源。 6. 关闭TCP连接:当客户端完成所有的HTTP请求和响应后,可以选择关闭TCP连接。在短连接中,每次请求-响应后都会关闭连接,而在长连接中,可以将连接保持一段时间,以减少连接的建立和关闭所产生的开销。 总结起来,HTTP协议的连接流程可以概括为:建立TCP连接,发送HTTP请求,服务器处理请求并发送HTTP响应,客户端接收响应并处理,关闭TCP连接。通过这样的流程,客户端和服务器可以进行可靠的通信,实现数据的传输和交互。 ### 回答3: HTTP协议是一种用于传输超文本的协议,通常在客户端和服务器之间进行通信。HTTP连接的流程如下: 1. 客户端发起HTTP请求:客户端(如浏览器)发送一个HTTP请求给服务器。该请求包括一个请求方法(例如GET或POST)和请求的URL。 2. 服务器接收请求:服务器收到客户端发送的HTTP请求后进行处理。 3. 服务器处理请求:服务器根据请求的URL和请求方法执行相应的操作。这可以是获取请求的资源、处理数据等。 4. 服务器发送HTTP响应:服务器生成HTTP响应,并将该响应发送给客户端。 5. 客户端接收HTTP响应:客户端(如浏览器)接收到服务器发送的HTTP响应。 6. 客户端处理HTTP响应:客户端根据收到的HTTP响应进行处理。这可以是解析HTML内容、显示数据等。 7. HTTP连接关闭:一旦客户端接收完服务器发送的HTTP响应连接将会被关闭。 需要注意的是,HTTP协议是无状态的,即每个HTTP请求和响应都是独立的,服务器无法根据前一次请求的内容来回溯。因此,每个请求都需要提供足够的信息(如包含身份验证信息)来使服务器正确处理请求。 另外,HTTP协议使用TCP作为传输层协议,通常经过TCP三次握手建立连接,确保数据传输的可靠性和完整性。因此,在HTTP连接的流程中,还包含了TCP连接的建立和断开的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值