笔者昨晚上了另外一节课,讲的是Tomcat处理响应的源码,具体的代码是可能真的完全记下来的,不过还是有几个关键的地方在这里记录一下。
目录
一、Tomcat会直接将响应数据通过socket发送给浏览器么?
答案是不会的,Tomcat自身维护了一个缓冲区,servlet处理完数据后,会将响应存入tomcat自身维护的缓冲区。
二、Tomcat如何开启二级缓冲区?
在server配置文件中可以配置缓冲区大小(Connector元素中的socketBuffer属性),如果配置的缓冲区大小大于500byte的话,tomcat会开启二级缓冲区。如果不满足的话,会直接调用socket.outputstream中的的write方法,将响应数据写入sendbuff中。
三、Tomcat如何选择响应体的发送方式?
使用Transfer-Encoding:chunked的情况:
- 1、如果使用了flush()方法的话;
- 2、响应体的大小大于ByteChunk的默认大小(256byte);
使用Content-Length的情况:
- 1、响应体的数据大小刚好在ByteChunk的大小范围内;
四、如果响应头部同时存在了Transfer-Encoding和Content-Length两个参数,谁的优先级会更高?
如果两个参数同时存在的话,tomcat会自动将Content-Length参数去除,只保留Transfer-Encoding参数。也就是说Transfer-Encoding的优先级会更高。