URL
是统一资源定位符(Uniform Resource Locator),是资源标识最多见的形式。URL
描述了一台特定服务器上某资源的特定位置。它们能够明确说明如何从一个精确、固定的位置获取资源。浏览器
URL
说明了协议、服务器和本地资源。缓存
而浏览器都是基于HTTP
协议,而HTTP
是个应用层的协议。HTTP
无需操心网络通讯的具体细节都交给了TCP/IP
。
TCP
:性能优化
HTTP协议位于TCP的上层。HTTP使用TCP来传输其报文数据。服务器
当用户输入一个完整的URL
以后,浏览器就开始解析URL
的构成,以便于查找资源地址,大多数URL的语法通用格式以下:网络
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
复制代码
基本上没有哪一个URL
包含了全部这些组件。URL
最重要的3个部分是方案scheme
,主机host
和路径path
。
若是URL
中不包含port
,浏览器会默认使用80
端口进行访问。post
DNS
( Domain Name System)是“域名系统”的英文缩写,DNS是应用层协议,事实上他是为其余应用层协议工做的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为ip地址。性能
DNS 查询的过程以下图所示。 优化
在浏览器中输入www.qq.com
域名,操做系统会先检查本身本地的hosts
文件是否有这个网址映射关系,若是有,就先调用这个IP
地址映射,完成域名解析。spa
若是hosts
里没有这个域名的映射,则查找本地DNS
解析器缓存,是否有这个网址映射关系,若是有,直接返回,完成域名解析。操作系统
若是hosts
与本地DNS
解析器缓存都没有相应的网址映射关系,首先会找TCP/ip
参数中设置的首选DNS
服务器,在此咱们叫它本地DNS
服务器,此服务器收到查询时,若是要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具备权威性。
若是要查询的域名,不禁本地DNS
服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP
地址映射,完成域名解析,此解析不具备权威性。
若是本地DNS
服务器本地区域文件与缓存解析都失效,则根据本地DNS
服务器的设置(是否设置转发器)进行查询,若是未用转发模式,本地DNS
就把请求发至13台根DNS
,根DNS
服务器收到请求后会判断这个域名(.com
)是谁来受权管理,并会返回一个负责该顶级域名服务器的一个IP
。本地DNS
服务器收到IP
信息后,将会联系负责.com
域的这台服务器。这台负责.com
域的服务器收到请求后,若是本身没法解析,它就会找一个管理.com
域的下一级DNS
服务器地址(http://qq.com
)给本地DNS
服务器。当本地DNS
服务器收到这个地址后,就会找http://qq.com
域服务器,重复上面的动做,进行查询,直至找到www.qq.com
主机。
若是用的是转发模式,此DNS
服务器就会把请求转发至上一级DNS
服务器,由上一级服务器进行解析,上一级服务器若是不能解析,或找根DNS
或把转请求转至上上级,以此循环。不论是本地DNS
服务器用是是转发,仍是根提示,最后都是把结果返回给本地DNS
服务器,由此DNS
服务器再返回给客户机。
从客户端到本地DNS
服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。
TCP
根据不一样的当前状态(常规或加星)所发送的内容:常规状态 | 说 明 | 发 送 | 加 星 状 态 | 发 送 |
---|---|---|---|---|
CLOSED | 关闭 | RST, ACK | ||
LISTEN | 监听链接请求(被动打开) | |||
SYN_SENT | 已发出SYN (主动打开) | SYN | SYN_SENT* | SYN, FIN |
SYN_RCVD | 已经发出和收到SYN;等待ACK | SYN, ACK | SYN_RCVD* | SYN, FIN, ACK |
ESTABLISHED | 链接已经创建(数据传输) | ACK | ESTABLISHED* | SYN, ACK |
CLOSE_WAIT | 收到FIN,等待应用程序关闭 | ACK | CLOSE_WAIT* | SYN, FIN |
FIN_WAIT_1 | 已经关闭,发出FIN;等待ACK和FIN | FIN, ACK | FIN_WAIT_1 | SYN, FIN, ACK |
CLOSING | 两端同时关闭;等待ACK | FIN, ACK | CLOSING* | SYN, FIN, ACK |
LAST_ACK | 收到FIN已经关闭;等待ACK | FIN, ACK | LAST_ACK* | SYN, FIN, ACK |
FIN_WAIT_2 | 已经关闭;等待FIN | ACK | ||
TIME_WAIT | 主动关闭后长达2 M S L的等待状态 | ACK |
TCP
中定义了7个扩展状态,这些扩展状态都称为加星状态。它们分别是:SYN_SENT*
、 SYN_RCVD*
、ESTABLISHED *
、CLOSE_WAIT *
、LAST_ACK *
、FIN_WAIT_1 *
和CLOSING *
。
TCP
输入的处理顺序TCP
协议收到报文段时,对其中所携带的各类控制信息 ( SYN
、FIN
、ACK
、URG
和RST
标志,还可能有数据和选项 )的处理顺序不是随意的,也不是各类实现能够自行决定的。
从 CLOSED
状态到SYN_SENT
状态的变迁就标明发送了一个SYN
报文段。在图中则没有采用这种标记方法,而是在每一个状态框中标出处于该状态时要发送的报文段类型。例如,当处于SYN_RECV
状态时,要发出一个带有 SYN
的报文段,其中还包括对所收到SYN
的确认( ACK
)。而当处于CLOSE_WAIT
状态时,要发出 对所收到FIN
的确认( ACK
)。
咱们之因此要这样作是由于,在TCP
协议中咱们常常须要处理可能形成屡次状态变迁的 报文段。因而在处理一个报文段时,重要的是处理完报文段后链接所处的最终状态,由于它决定了应答的内容。而若是不使用TCP
协议,每收到一个报文段一般至多只引发一次状态 变迁,只有在收到SYN/ACK
报文段时才是例外。
客户端和服务器之间创建链接须要通过三次确认的阶段,咱们称之为TCP
的三次握手。
客户端发送一个
syn
报文,设置发送序号为X
,客户端进入SYN_SENT
状态,等待服务器回应。
服务端收到
syn
报文,可是服务端必须肯定客户端的syn(ack= X + 1)
, 所以服务端也要发送一个syn=Y
给客户端进行确认,表示服务端已经收到客户端的请求。
服务端须要发送ack+syn
给客户端,此时服务器进入SYN_RECV
状态。
客户端收到服务器的syn+ack
包,向服务器发送确认包ack(ack=Y+1)
,此包发送完毕,客户端和服务器进入ESTABLISHED
(TCP
链接成功)状态,完成三次握手。
好比你走在路上,发现前面有你的朋友向你走过来,你向你朋友挥手(第一次握手)。
你朋友看见了你向他打招呼,可是你朋友由于距离你太远,并不肯定是不是跟他打招呼的,所以,你朋友用手指了下本身,并向你示意(第二次握手)。
你看见了你朋友的表情和动做,你须要给你朋友一个确定,此时,你点头示意(第三次握手)。
此时你和你朋友互相聊天(TCP已链接
)。
因为TCP
链接是全双工的,所以每一个方向都必须单独进行关闭。
这原则是当一方完成它的数据发送任务后就能发送一个FIN
来终止这个方向的链接。收到一个 FIN
只意味着这一方向上没有数据流动,一个TCP
链接在收到一个FIN
后仍能发送数据。
首先进行关闭的一方将执行主动关闭,而另外一方执行被动关闭。
TCP
客户端发送一个FIN
,用来关闭客户到服务器的数据传送。FIN
,它发回一个ACK
,确认序号为收到的序号加1。和SYN
同样,一个FIN
将占用一个序号。FIN
给客户端。ACK
报文确认,并将确认序号设置为收到序号加1。你和你朋友聊天,聊着聊着,忽然想起来女友钥匙丢了,你是回家开门的,如今耽误了半小时了,吓得冷汗都出来了,一想起榴莲。。。
这个时候,你赶忙跟你朋友说了状况,你说你立刻得回去了,下次再聊(第一次挥手)。
你朋友听了,以为也是得赶忙回去,就跟你说你赶忙回去吧。(第二次挥手)。
而后,你朋友走了,并向你挥手作别(第三次挥手)。
你看见你朋友跟你作别,你一样也跟你朋友作别(第四次挥手)。
回去以后,你就须要玩玩你的榴莲了。
查看下篇文章 浏览器渲染原理(性能优化之如何减小重排和重绘)
参考文章:
一、HTTP
权威指南。
三、TCP-IP
详解卷