最近在用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数据有多少字节
程序代码如下: