@
DuckJK 网卡收到的数据通过中断的方式通知内核处理,数据的传递一般是 DMA
(不可能 CPU 直接读不然负载太高了)
( DMA 直接拷贝数据到系统内存,当然也有可能是网卡上的缓冲区,这个说不准)
(通知或许除了中断还有别的处理方式,这个不了解,因为频繁的中断会非常耗费 CPU 资源)
所有的 Socket 都是内核分配管理的,网卡在通知内核收到包以后,内核就去获取这一个包然后解析
(可以理解成中间有个缓冲区,内核从缓冲区取数据)
内核处理包的过程会验证包是否合法,然后路由到合适的地方
(这个路由包含多种意思,一个是数据包的路由另一个是转发到合适的处理程序[的缓冲区])
如果是 TCP ,底层的会进行拥塞控制处理(组包、验证、依据情况发回 ACK 信息各种各样)
(驱动能在拥塞控制之前接管所有 TCP 处理,这也是锐速的原理)
组成合法的流数据以后再发往给上层应用的缓冲区,通知上层应用
“如果 zlib 支持流解压缩,那就是跟压缩数据大小没关系,只要是合法压缩数据,都可以解压缩,只是从 readbuffer 到 zlib 的 buffer ,是不是可以这么理解。 ”
就是这么回事,我并不知道 zlib 是否支持流解压,也没查。。这个依据实际情况判断
(推广到别的编码方式也一样)
“ reponse.content 在未提供长度的情况下阻塞到链接断开,这个链接断开是跟 read 的长度有关系么?还是到什么样的情况下链接断开?谢谢啦”
这个原因是 HTTP 头未提供数据长度的情况下客户端并不知道数据有多大
只能阻塞到 TCP 链路主动断开才能获知已经收完数据
(如果有防火墙的地方,这个数据很可能是损坏的,因为防火墙有可能提前掐断这个链路)