1、理解下从 域名 -> DNS -> IP -> TCP -> HTTP 的过程 步骤: 1、在浏览器输入URL,URL解析; 2、DNS解析这个域名,并返回IP; 3、根据IP建立TCP连接(三次握手); 4、HTTP发起请求; 5、服务器处理请求,浏览器接收HTTP的响应; 6、关闭TCP连接(四次挥手),浏览器解析文档; 7、渲染页面; 详细描述: 1、URL解析 通过URL解析出主机名 2、域名解析 1)首先浏览器会先查找本地hosts文件是否有这个网址映射关系,如果有就调用这个IP地址映射,完成域名解析。 2)如果没有找到则会查找本地的DNS解析器缓存,如果找到则返回。 3)如果还是没有找到则会查找本地DNS服务器,如果找到则返回。 4)最后迭代查询,按根域服务器->顶级域名.cn->第二层域名->子域名的顺序找到IP地址。 以chrome为例查看缓存,使用chrome://net-internals/#dns进行查看。 3、TCP的三次握手 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认; 第二层握手:服务器接收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN_ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 4、发起http请求 完整的HTTP请求包含请求行,请求头部,请求主体三个部分。 5、服务器响应请求,浏览器接收响应 服务器在收到浏览器发送的HTTP请求之后,会收到HTTP报文封装成HTTP的Request对象,并通过不同的web服务器进行处理,处理完的结果以HTTP的Response对象返回,主要包括状态码,响应头,响应报文三个部分。 状态码主要包括以下部分: 1xx:指示信息-表示请求已接收,继续处理 2xx:成功-表示请求已被成功接收,理解,接收 3xx:重定向-要完成请求必须进行更进一步的操作 4xx:客户端错误-请求语法错误或请求无法实现 5xx:服务器端错误:服务器未能合法实现请求 响应头主要由:cache-control、connection、date、pragma等组成。 6、关闭TCP连接 7、渲染页面
以Chrome为例,分析域名是如何解析的(譬如输入www.): 1.Chrome浏览器会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有一分钟,且只能容纳1000条缓存),看自身的缓存中有没有www.对应的条目,而且有没有过期,如果有且没有过期则解析到此结束。 注:可以使用chrome://net-internals/#dns 来进行查看 2.如果第一步没成功,那么Chrome会搜索操作系统自身的DNS缓存,如果找到且没有过期则解析到此结束。 注:以Windows为例查看操作系统自身DNS缓存,在命令行下使用ipconfig /displaydns进行查看。 3.如果第二步没成功,那么尝试读取host文件(位于C:\Windows\System32\drivers\etc),查看有没有该域名对应的额IP地址,如果有则解析成功。 4.如果第三步没成功,浏览器会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器(一般是电信运营商提供,也可以是Google提供的DNS服务器)发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址),运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。如果没有找到对应的条目,则有运营商的DNS代我们的浏览器发起迭代DNS解析请求,它首先是会找根域的DNS的IP地址(这个DNS服务器都内置13台根域的DNS的IP地址),就会向其发起请求,根域发现这是一个顶级域com域的一个域名,于是就告诉运营商的DNS我不知道这个域名的IP地址,但是我知道com域的IP地址,你去找它去,于是运营商的DNNS又向这个域名的DNS地址(这个一般就是由域名注册商提供的,像万网,新网等)发起请求,这个时候域的DNS服务器一查,诶,果真在我这里,于是就把找到的结果发送给运营商的DNS服务器,这个时候运营商的DNS服务器就拿到了www.这个域名对应的IP地址,并返回给Windows系统内核,内核又把结果返回给浏览器,终于浏览器拿到了www.对应的IP地址。 注:一般情况下是不会进行以下步骤的 5. 操作系统就会查找NetBIOS name Cache(NetBIOS名称缓存,就存在客户端电脑中的),那这个缓存有什么东西呢?凡是最近一段时间内和我成功通讯的计算机的计算机名和Ip地址,就都会存在这个缓存里面。什么情况下该步能解析成功呢?就是该名称正好是几分钟前和我成功通信过,那么这一步就可以成功解析。 6. 如果第5步也没有成功,那会查询WINS 服务器(是NETBIOS名称和IP地址对应的服务器)。 7. 如果第6步也没有查询成功,那么客户端就要进行广播查找。 8. 如果第7也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下,写法也一样)。 2、 HTTP1.0 HTTP1.1 HTTP2.0的性能区别 HTTP1.0
HTTP1.1
增加connection字段,通过设置Keep-Alive可以保持HTTP连接不断开。
管道化使得请求能够“并行”传输。 也就是说,管道化可以把先进先出的队列从客户端(请求队列)迁移到服务端(响应队列)。
强缓存和协商缓存
使得服务器能够创建多个Web站点 HTTP2.0
在应用层和传输层增加一个二进制分帧层,改进传输性能。
实现真正的并行传输,能够在一个TCP上进行任意数量的HTTP请求。
使用encoder来减少传输的header大小,搞笑的压缩算法很大的压缩了header。
服务器除了对最初请求的响应外,服务器还可以额外的向客户端推送资源,而无需客户端明确的请求。 3、 websocket连接的建立过程 websocket 基于TCP传输协议,并复用HTTP的握手通道。 (1)客户端发送请求报文 发送请求的要求:
(2)服务器发送响应报文
|
|