【http】http报文是如何在tcp中传送的

最近在用nodejs设计web服务程序,对一些原理需要搞清楚,并做了一些测试。

基础知识:http是基于tcp的,tcp是一个流式传输,tcp是基于ip的,一个ip报文最大为65536个字节,即64k,懂得都懂。

一个get 请求,只包含header信息,header是有长度限制的,nodejs默认16k,当然也可以自己修改这个值,一般不会超过64k,也就是一个ip报文长度。

所以get请求建立连接之后只发一次tcp数据就可以将数据全部发完,服务端也只收一次就能收完,事实也是如此。

post请求就有点不一样,post可能包含body,post需要传输的数据大小可能超出64k,那么问题来了:

1、一个post的数据小于64k是怎么传输的呢。

2、一个post的数据大于64k是怎么传输的呢。

对于这两个问题,我在网上找了不少资料,其中有个回答是,post的数据会分两次发送,第一次只发header部分,第二次发body数据部分,显然这个回答只是针对小于64k的情况,我对这个回答比较怀疑,但又找不到更好的回答,只能自己写程序测试了。

用浏览器 ajax 发 post数据,测试发现,当小于64k,我的tcp服务端只收了一次就全部收完了,收到的数据同时包含header和body部分,这不能说明浏览器是不是先发header后发body,只能说明nodejs tcp服务程序只触发了一次data事件。

当大于64k时,小于128k,发现tcp服务端收了两次,第一次包含header+body部分,总量64k,第二次收到剩余的body部分,浏览器在header里面自动加上了Content-Length,表示body数据有多少字节

程序代码如下:

const net = require('net');
const server = net.createServer(socket => {
    socket.on('data', chunk => {
        let s = chunk.toString();
        let len = s.length;
        console.log(s);
        //socket.end('hello')
    });
    socket.on('end', p => {
        console.log('end');
    });
    socket.on('error', p => {
        console.log('error');
    });
    socket.on('close', p => {
        console.log('close');
    });
});
server.listen(80, () => {console.log('listening');});

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页