问题提出:
相信大多数人都对我们在浏览器的地址栏中输入完成之后的一系列作用过程都很好奇,题主和大家一样,一次浏览知乎无意间看见此问题,看完之后恍然大悟,接下来题主将根据自己的理解谈谈此问题:
1:域名的解析?
其实我们在浏览器中输入的是一个网站(网页)的域名,如果我们想要获取该域名下的资源,我们必须知道该域名的地址;(一个ip地址可以对应多个域名);所以我们要做的第一步就是解析我们的域名;将其翻译成ip地址:具体的解析过程如图:
关于DNS具体的解析过程这里再详细解述以下:如上图所示浏览器接收到你输入的域名之后会现在浏览器本地的缓存里面查询看是否有该域名,然后依次访问系统缓存,路由缓存,由这里便开始我们的递归搜索;向DNS服务器发起查询请求:
补充知识点:服务器分类:
具体的递归过程如下图:
拿到服务器ip地址之后我们便可以通过TCP/IP协议向服务端发起连接请求了并传输数据了:
2:建立连接
由于TCP协议是面向连接的,我们在传输数据之前,我们首先要和服务器建立好连接;具体建立连接的过程如下:
首先,客户端先发送一个创建连接的SYN请求,告诉服务器主机“我想和你创建一条TCP连接”。当服务器主机收到SYN请求后,如果其所请求的端口号正在等待连接,则会为这一条TCP连接分配资源,并发送一个SYNACK报文段作为应答。客户主机收到SYNACK报文段后,客户机也为该连接分配资源。此时,连接已经建立起来了。客户主机还会向服务器主机发送另一个报文段,对允许连接的报文段进行确认。这就是有名的“三次握手”。
3:客户端向服务器发送响应的请求,
4:服务器处理请求,并返回一个HTML页面
5:浏览器开始显示HTML页面
6:如果网页中间包含其他资源:如图片,CSS样式,Javascript文件等,这些资源所在地址都要经历一个和HTML读取类似的过程。所以浏览器会在DNS中查找这些域名,发送请求等等…
7:浏览器可以向服务器发送异步请求(ajax)
8:断开连接:
(1)此时TCP连接两端都还处于ESTABLISHED(established)状态,客户端停止发送数据,并发出一个FIN报文段。首部FIN=1,序号seq=u(u等于客户端传输数据最后一字节的序号加1)客户端进入FIN-WAIT-1(终止等待1)状态。
(2)服务端回复确认报文段,确认号ack=u+1,序号seq=v(v等于服务端传输数据最后一字节的序号加1),服务端进入CLOSE-WAIT(关闭等待)状态。现在TCP连接处于半开半闭状态,服务端如果继续发送数据,客户端依然接收。
(3)客户端收到确认报文,进入FIN-WAIT-2状态,服务端发送完数据后,发出FIN报文段,FIN=1,确认号ack=u+1,然后进入LAST-ACK(最后确认)状态。
(4)客户端回复确认确认报文段,ACK=1,确认号ack=w+1(w为半开半闭状态时,收到的最后一个字节数据的编号),序号seq=u+1,然后进入TIME-WAIT(时间等待)状态。
注意此时连接还没有释放,需要时间等待状态结束后(4分钟)连接两端才会CLOSED。设置时间等待是因为,有可能最后一个确认报文丢失而需要重传。