美文网首页
从输入URL到页面展示

从输入URL到页面展示

作者: 那个汉堡在对我笑 | 来源:发表于2018-05-09 19:42 被阅读0次

首先,输入URL(统一资源定位符)

比如,打开浏览器,输入baidu.com

1:域名解析

从浏览器缓存中查找

从系统Hosts文件中查找是否有该域名和对应IP

从路由器缓存中查找

从 DNS缓存中查找

DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)本条引用自百度百科

如果都没有找到,那么就会向根域名服务器查找域名对应ip.根域名服务器把请求转发到下一级,直到找到ip

2:得到IP后,服务器处理

拿到域名对应的IP地址之后,浏览器会以一个随机端口(1024<端口<65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。

建立了TCP连接之后,发起一个http请求。一个典型的 http request header 一般需要包括请求的方法,例如 GET 或者 POST 等,不常用的还有 PUT 和 DELETE 、HEAD、OPTION以及 TRACE 方法,一般的浏览器只能发起 GET 或者 POST 请求。

客户端向服务器发起http请求的时候,会有一些请求信息,请求信息包含三个部分:

| 请求方法URI协议/版本

| 请求头(Request Header)

| 请求正文

TCP三次握手

第一次握手:客户端A将标志位SYN置为1,随机产生一个值为seq=J(J的取值范围为=1234567)的数据包到服务器,客户端A进入SYN_SENT状态,等待服务端B确认;

第二次握手:服务端B收到数据包后由标志位SYN=1知道客户端A请求建立连接,服务端B将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端A以确认连接请求,服务端B进入SYN_RCVD状态。

第三次握手:客户端A收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务端B,服务端B检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端A和服务端B进入ESTABLISHED状态,完成三次握手,随后客户端A与服务端B之间可以开始传输数据了。

为什需要三次握手?

 《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”

  书中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。

  假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”。主要目的防止server端一直等待,浪费资源。

TCP四次挥手

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

3:服务器的永久重定向响应

   服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.google.com/” 而非“http://google.com/”。

  为什么服务器一定要重定向而不是直接发送用户想看的网页内容呢?其中一个原因跟搜索引擎排名有关。如果一个页面有两个地址,就像http://www.yy.com/和http://yy.com/,搜索引擎会认为它们是两个网站,结果造成每个搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有就是用不同的地址会造成缓存友好性变差,当一个页面有好几个名字时,它可能会在缓存里出现好几次。

4:服务器处理请求

  经过前面的重重步骤,我们终于将我们的http请求发送到了服务器这里,其实前面的重定向已经是到达服务器了,那么,服务器是如何处理我们的请求的呢?

  后端从在固定的端口接收到TCP报文开始,它会对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用。

  一些大一点的网站会将你的请求到反向代理服务器中,因为当网站访问量非常大,网站越来越慢,一台服务器已经不够用了。于是将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。此时,客户端不是直接通过HTTP协议访问某网站应用服务器,而是先请求到Nginx,Nginx再请求应用服务器,然后将结果返回给客户端,这里Nginx的作用是反向代理服务器。同时也带来了一个好处,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。

什么是反向代理?

客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。

5:服务器返回一个 HTTP 响应 

  经过前面的6个步骤,服务器收到了我们的请求,也处理我们的请求,到这一步,它会把它的处理结果返回,也就是返回一个HTPP响应。

HTTP响应与HTTP请求相似,HTTP响应也由3个部分构成,分别是:

l  状态行

l  响应头(Response Header)

l  响应正文

状态代码:状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

1xx:信息性状态码,表示服务器已接收了客户端请求,客户端可继续发送请求。

    100 Continue

    101 Switching Protocols

 2xx:成功状态码,表示服务器已成功接收到请求并进行处理。

    200 OK 表示客户端请求成功

    204 No Content 成功,但不返回任何实体的主体部分

    206 Partial Content 成功执行了一个范围(Range)请求

3xx:重定向状态码,表示服务器要求客户端重定向。

    301 Moved Permanently 永久性重定向,响应报文的Location首部应该有该资源的新URL

    302 Found 临时性重定向,响应报文的Location首部给出的URL用来临时定位资源

    303 See Other 请求的资源存在着另一个URI,客户端应使用GET方法定向获取请求的资源

    304 Not Modified 服务器内容没有更新,可以直接读取浏览器缓存

     307 Temporary Redirect 临时重定向。与302 Found含义一样。302禁止POST变换为GET,但实际使用时并不一定,307则更多浏览器可能会遵循这一标准,但也依赖于浏览器具体实现

 4xx:客户端错误状态码,表示客户端的请求有非法内容。

       400 Bad Request 表示客户端请求有语法错误,不能被服务器所理解

       401 Unauthonzed 表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用

       403 Forbidden 表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因

       404 Not Found 请求的资源不存在,例如,输入了错误的URL

5xx:服务器错误状态码,表示服务器未能正常处理客户端的请求而出现意外错误。

        500 Internel Server Error 表示服务器发生不可预期的错误,导致无法完成客户端的请求

        503 Service Unavailable 表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常

6:浏览器处理

服务器通过路由提交信息到控制器,交由controller处理。

controller提交信息,交由model处理。

model向数据库请求信息,数据库返回信息给model。

model返回用户信息给controller,controller提交用户信息到view。

view返回页面信息给controller,controller返回页面信息给服务器。

服务器返回页面信息到浏览器,浏览器通过页面信息加载出百度页面

HTML字符串被浏览器接受后被一句句读取解析

解析到link标签后重新发送请求获取css

解析到script标签后发送请求获取js并执行代码

解析到img标签后发送请求获取图片资源

相关文章

  • 从输入url到页面展示到底发生了什么

    从输入url到页面展示到底发生了什么

  • 从url输入到页面展示

    当网址输入到网址栏中,我们敲下回车,到底发生了什么我们获得了一个漂亮的页面呢? 网上的太笼统,太官方,看完太蒙蔽,...

  • 从输入URL到页面展示

    首先,输入URL(统一资源定位符) 比如,打开浏览器,输入baidu.com 1:域名解析 从浏览器缓存中查找 从...

  • 从URL输入到页面展示

    请求&响应 客户端发请求 服务器响应 一、HTTP 请求包括哪些部分 命令行命令: curl -s -v -H "...

  • 一个前端小白的第一篇博客

    #从URL输入到图形页面展示发生了什么 1. 输入URL 用户浏览器输入URL(www.baidu.com) 2....

  • 从URL的输入到页面展示

    用户打开浏览器,输入 baidu.com,页面展示百度首页。整个过程发生了什么? 一、在浏览器输入URL 在开始讲...

  • 无标题文章

    从url输入到页面展示发生了什么 举个例子,我们在浏览器上输入baidu.com输入,页面展示百度首页。整个过程发...

  • 百度首页在页面的展示过程

    从百度URL的输入到页面展示大概分为以下几个环节: 输入百度的URL地址——对URL中域名( baidu.com)...

  • 从URL输入到页面展示发生了什么

    从URL输入到页面展示大体经过了以下几个流程 1 . 输入URL URL:统一资源定位符,是对可以从互联网上得到的...

  • 从URL的输入到页面的展示

    最近一直在思考从url到页面展示这个问题的具体答案,查询了相当多的资料,也看了看关于《图解HTTP》这本书,对于这...

网友评论

      本文标题:从输入URL到页面展示

      本文链接:https://www.haomeiwen.com/subject/gnrerftx.html