HTTP协议中的Content-Length

Content-Length是什么

Content-Length 是一个实体消息首部,用来指明发送给接受方的消息主体的大小。Content-Length如果存在并且有效地话,则必须和消息内容的传输长度完全一致。否则就会导致异常 (特别地, HTTP1.0中这个字段可有可无)

Content-Length首部指示出报文中实体主体的字节大小。这个大小是包含了所有内容编码的, 比如,对文本文件进行了gzip压缩的话,Content-Length首部指的就是压缩后的大小而不是原始大小。

看下以下几种情况:

Content-Length == 实际长度

const http = require('http');
const server = http.createServer();
server.on('request', (req, res) => {
  if(req.url === '/') {
    res.setHeader('Content-Type', 'text/plain');
    res.setHeader('Content-Length', 10);
    res.write("helloworld");
  }
});
server.listen(8081, () => {
  console.log("成功启动");
});

Content-Length < 实际长度

res.setHeader('Content-Length', 8);

此时输出结果为 hellowor

那后面的字符哪里去了?实际上在http的响应体中直接被截取了。

Content-Length > 实际长度

如果Content-Length 比 实际长度大,服务端/客户端读取到消息结尾后,会等待下一个字节,自然会无响应直到超时。

res.setHeader('Content-Length', 12);

此时浏览器显示结果:

不确定Content-Length的值怎么办

如果不确定Content-Length的值怎么办,此时我们应该使用Transfer-Encoding:chunked

该字段表示分块传输数据,设置这个字段会自动产生两个效果:

  • Content-Length 字段会被忽略
  • 基于长连接持续推送动态内容

参考资料:

  • 20
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HTTP Content-Length是指HTTP请求或响应消息体的长度,以字节为单位。它通常用于指示服务器或客户端在读取或发送消息体时需要读取或发送多少字节。在HTTP协议Content-Length是一个必需的头部字段。 ### 回答2: HTTP Content-Length是指HTTP报文的实体(Entity)部分的长度,通常用于传输请求体(request body)和响应体(response body)的长度信息。它是在发送HTTP请求时或接收HTTP响应时,由服务器返回的一个头文件(Header)的一个属性。Content-Length告诉浏览器、服务器或者代理服务器要接收或传递实体的长度。如果content-length偏大,就会影响接收或传递数据的速度,而且有时还会导致一些不必要的错误。 Content-Length可以有效地提高HTTP数据传输的效率。当服务器确定要发送的实体长度时,将Content-Length包含在HTTP响应头,这样接收方(客户端、代理服务器)就可以事先根据Content-Length准确地计算出接收的实体字节数,避免出现数据不完整或者超时等异常情况。同样地,当客户端发送HTTP请求时,Content-Length也可以告知服务器完整的请求体长度,以便服务器可以准确地读取请求体并进行处理。 值得注意的是,HTTP报文不一定都会包含Content-Length,如果没有Content-Length,那么应该使用 Transfer-Encoding。Transfer-Encoding是一种传输编码机制,可以在请求头或者响应头指定。通常使用的值是chunked,表示使用分块传输编码。在chunked传输编码HTTP报文的实体被分割成多个块,每个块都包含一个长度字段和实体数据,最后加入一个长度为0的块作为消息结束标志。这种传输编码机制可以有效地处理长度未知或者长度不确定的实体,比如视频、音频等媒体文件。 ### 回答3: HTTP Content-Length 是一个 HTTP 头字段,用于指定 HTTP 请求或响应体的数据长度。当客户端发送一个 HTTP 请求时,如果包含了 Content-Length 字段,则服务器端的处理程序会根据 Content-Length 的数值读取和解析请求体内容,而不是读取整个客户端连接。同理,当服务器发送一个 HTTP 响应时,如果包含了 Content-Length 字段,则客户端会根据 Content-Length 来判断响应体的数据是否完整。 HTTP Content-Length 消息头的作用非常重要,尤其是在处理二进制数据(如文件下载)和分块传输编码时更是必不可少。通过 Content-Length 字段,可以确保数据传输的完整性和准确性,同时也能防止一些安全攻击,例如缓冲区溢出攻击等。 由于 Content-Length 字段的存在,大多数的基于 HTTP 的协议都需要在消息头包含 Content-Length 字段。例如 HTTP、WebSocket、SMTP、SCP、SSH、POP3 等。而在某些协议Content-Length 字段并不是必须的,例如在传输文件时可以通过文件大小来判断文件传输的完整性。 总之,HTTP Content-Length 是一个非常重要的消息头字段,它能够保证客户端和服务器之间的数据传输的正确性,同时也能避免一些安全风险。因此,开发者需要注意在自己的程序正确使用 Content-Length 字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值