稍微了解过Web开发相关技术的人都对于HTTP协议都不会陌生,HTTP是个简单易上手的文本协议,以至于可能很多人做了很久web开发,依然对于很多HTTP协议的知识点不慎了解,本文就讨论下那些关于HTTP协议的出镜率不那么高的一些知识点。
关于URL,可以把网站的网址URL分为三部分:
以 http://marvinio.com/2018/03/ubuntu-init-config/ 为例
Scheme:大家现在都对http习以为常,但是在更遥远的年代,比如我的大学时代,大家更喜欢使用ftp协议去服务器down各种资源,ftp也是类似http一种scheme,scheme会告知web客户端怎样访问服务器资源。
域名:域名是告诉客户端服务器在哪里,域名经过DNS服务器转换为IP,IP定位到服务器,80端口定位到Web应用。
资源路径:/2018/03/ubuntu-init-config/,找到了服务器之后,还有具体定位到资源的详细位置,这个由资源路径来指明,当然通过web服务器的重写(rewrite),用户客户端上看到的资源路径可能未必是真实的。
HTTP的性能聚焦区域:TCP协议
TCP连接建立握手;
TCP慢启动拥塞控制;
数据聚集的Nagle算法;
用于捎带确认的TCP延迟确认算法;
TIME_WAIT时延和端口耗尽。
Web服务器都做了什么
建立连接——接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭。
接收请求——从网络中读取一条HTTP请求报文。
处理请求——对请求报文进行解释,并采取行动。
访问资源——访问报文中指定的资源。
构建响应——创建带有正确首部的HTTP响应报文。
发送响应——将响应回送给客户端。
记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中。
代理与网关的对比
严格来说,代理连接的是两个或多个使用相同协议的应用程序。
网关连接的则是两个或多个使用不同协议的端点。网关扮演的是“协议转换器”的角色,即使客户端和服务器使用的是不同的协议,客户端也可以通过它完成与服务器之间的事务处理。
HTTP缓存的处理步骤(以一个GET报文的基本缓存处理过程为例)
接收——缓存从网络中读取抵达的请求报文。
解析——缓存对报文进行解析,提取出URL和各种首部。
查询——缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存在本地)。
新鲜度检测——缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。
创建响应——缓存会用新的首部和已缓存的主体来构建一条响应报文。
发送——缓存通过网络将响应发回给客户端。
日志——缓存可选地创建一个日志文件条目来描述这个事务。
Content-Length与持久连接
Content-Length首部对于持久连接是必不可少的。如果响应通过持久连接传送,就可能有另一条HTTP响应紧随其后。客户端通过Content-Length首部就可以知道报文在何处结束,下一条报文从何处开始。因为连接是持久的,客户端无法依赖连接关闭来判别报文的结束。
如果主体进行了内容编码,Content-Length首部说明的就是编码后(encoded)的主体的字节长度,而不是未编码的原始主体的长度。
领取专属 10元无门槛券
私享最新 技术干货