您的位置:首页 > 理论基础 > 计算机网络

从URL到与服务器断开连接到底发生了什么

2017-04-24 15:48 573 查看

URL是什么

URL的英文全称是Uniform Resource Location,中文名字是统一资源定位符,说白了他就是我们因为某种需求在浏览器中输入的网址,当我们想要与服务器交互时,服务器并不认识我们输入的url,那服务器是怎样识别的呢,其实我们输入的url都绑定一个ip,比如我们主机的ip是127.0.0.1,网络上的计算机ip不是固定的,服务器通过识别这个ip来返回来找到我们想要的东西。

DNS解析过程

服务器是怎么得到这个ip的呢,是通过dns解析url得到的,下面我们说一下这个过程:

1,我们知道URL就是我们输入的网址了,请求一旦发起,浏览器首先要做的事情就是解析这个域名,一般来说,浏览器会首先查看本地硬盘的 hosts
4000
文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用 hosts 文件里面的 ip 地址。

2.如果在本地的 hosts 文件没有能够找到对应的 ip 地址,浏览器会发出一个 DNS请求到本地DNS服务器 。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

3.查询你输入的网址的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,此过程是递归的方式进行查询。如果没有,本地DNS服务器还要向DNS根服务器进行查询。

递归过程图解:





4。根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。这种过程是迭代的过程。

迭代过程图解:






5.本地DNS服务器继续向域服务器发出请求,在www.baidu.com这个列子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。

6.最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

详细图解:






  我想经过上面的步骤联系图解大家对dns解析的过程应该比较清楚了

dns负载均衡

当一个网站有足够多的用户时,每次请求的资源都位于一台机器上,那么这台机器随时都有可能崩掉,如何解决呢?这就需要负载均衡技术了,原理是在dns服务器中为每个访问的用户配置多个ip,这样当很多用户一起访问时,dns服务器首先会根据缓存中用户的不同ip将不同的用户分配到不同的机器上去,这样就不是一台机器在承受巨大的访问量,达到了不同客户端访问不同服务器的目的,从而实现了负载均衡。例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等。

拿到url绑定的ip以后浏览器做了那些事情呢?

浏览器向web服务器发送http请求

以上我们把用户输入url,即客户端向服务器发送请求,dns域名解析看作一个应用层,域名解析完成拿到ip以后就要和服务器建立连接,浏览器会以一个随机端口(1024<端口<65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求(这相当于一个包装的过程,我们把发送的请求当作一个包裹,首先经过传输层,在包裹上写上一个本地端口和目的端口,然后经过ip层,在包裹上写上本地ip和目的ip)。这个连接请求到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。

TCP连接图示:



上面这个图就是tcp连接时著名的三握手过程,seq是每一次握手的随机序列号,如果ack = seq + 1则完成确认,就进行握手,在这里不对其进行过多解释,大家可以自行google。
为什需要三次握手?《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。

下面我们看一下TCP的四次挥手

图示:



为什么建立连接时三握手,断开连接时却需要四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
这个挥手的过程就好像我们打完电话要和对方结束对话的过程,首先客户端相当于你自己,服务器是接听者,当你想要结束通话时,你跟对方说你不想说了(FIN = M)然后对方听到了说了一句我知道了(ACK = FIN + 1)但是对方还有话没说完,然后他又说了一句明天见!说完了以后他又和你说拜拜(FIN = N)然后你说拜拜,四次挥手结束对话

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息