作者回复: 队头阻塞在http和tcp层次都有,原因不同。
你说的是tcp队头阻塞,而http的队头阻塞是因为它的请求-应答模式,当然它运行在tcp上,就有两种队头阻塞。
作者回复: 总结的不错。
作者回复: 一个来回就是1rtt,三次回收准确来说是1.5个rtt,四次挥手是两个来回,所以是2rtt。
作者回复: 域名分片解决的是客户端并发的问题,可以创建更多的连接。
比如浏览器限制一个域名最多6个连接,域名分3片,那么浏览器就可以同时建立18个连接,显然就能够并发更多请求,获取数据也就快了。
作者回复: “高并发请求”是服务器端的概念,意思是同时有多个客户端连接服务器。
课程里的“并发连接”是客户端的概念,意思是一个浏览器并发多个连接,访问服务器。
负载均衡是服务器端的概念,就是把大量的客户端连接均匀分散到集群里的多台服务器。
作者回复: http里的连接通常就是tcp连接,也就是调用socket api打开的一个套接字,可以理解成一个流式文件的句柄,可读可写,但数据都是在网络上。
想要理解清楚应该去看一下tcp/ip相关的资料。
作者回复: 1.是的,http是“半双工”,只能一来一回收发数据,这就是队头阻塞的根源。
2.域名分片其实很简单,就是申请多个域名,但这些域名最后都映射到同一个网站服务器,这样就可以突破浏览器的限制,让连接数是8*域名的个数。
3.最后我说的不太确切,应该是shard1、shard2的域名都指向www.xxx.com域名对应的ip地址。
4.域名也可以解析成别名(cname),用于cdn负载均衡,后面会讲到。
作者回复: tcp握手是1个rtt,挥手是2个rtt,这就是3个没有数据传输的时间,实际的数据传输是2个rtt。
一次短连接总共5个rtt,所以浪费的就是tcp握手挥手的3个,除以总共的5个。
作者回复: 感谢指正。
作者回复: √
作者回复: 也挺好,多用不同的比喻可以加强理解。
作者回复: 9=长连接握手挥手的3+长连接三次http请求响应的6,所以浪费率是3÷9。
作者回复: 在tcp层次,发出一个包会返回一个确认收到的ack包,这就是一个rtt。
如果在http层次,那么看不到ack,所以一个请求一个响应是一个rtt。
层次不同,对rtt的理解就不一样,这里说的是tcp层次。
作者回复: 非常完整详细,good。
作者回复: 这就要看QUIC和HTTP/3了,请参考飞翔篇。
作者回复:
1.通常超时时间都是服务器设置的,应该是在自定义服务里。
2.方法很多,比如使用一个定时器,当超时后检查连接,没有数据收发就关闭。
3.服务器实现长连接管理,客户端不需要关心,连接关闭客户端会收到通知。
作者回复:
1.长连接就是在服务器里保存连接的状态不关闭,也就是不调用close关闭,就实现了长连接,其实很简单。
2.第8讲应该是一个完整的请求响应吧,不知道有没有满足你的要求。而且这些例子都是请求响应对应的,哪里还要再讲解,可以再说清楚一点。
作者回复: 默认是长连接,可以省略。
作者回复: 前半句对,后半句不一定,也可能是镜像集群。
作者回复: “约束力不强”意思是“不是所有的浏览器、客户端、服务器都会遵守”,也就是有的客户端、服务器会忽略这个字段。
因为http协议很灵活,文本格式很松散,所以很多字段即使缺少浏览器、服务器也可以尝试着去处理,或者即使存在也可以忽略。
在http/1.1里唯一强制要求的就是host字段,其他都不是必须的。