从浏览器输入网址回车到看到页面过程到底经历了什么?-LMLPHP

#前言:从浏览器输入网址到回车看到页面的过程,面试逃不掉的一个问题,我们知道从浏览器输入网址到看到页面主要是涉及DNS解析,TCP三次握手,请求报文,响应报文,TCP4次挥手。

#首先我们先来看一下总体的访问过程

#总体的访问过程:首先会进行DNS解析,然后解析得到地址之后客户端和web服务器会建立一条TCP连接,其中有一个TCP三次握手过程,当完成握手之后客户端就会向浏览器发送一条请求报文,服务器然后进行响应,接着当数据传输完之后,服务器和客户端有一个TCP四次挥手过程,来结束连接。

从浏览器输入网址回车到看到页面过程到底经历了什么?-LMLPHP

#然后我们来将过程分解一下

#dns解析流程

在浏览器中输入网址回车后,首先系统会去找这个域名对应的ip,然后再根据这个ip地址查找web服务器,
这里面有个DNS解析流程
        1、系统首先查找本地的DNS缓存和hosts文件信息,确认是否有www.baidu.com对应的ip地址,如果有就直接访问
        这个ip地址对应的www.baidu.com web服务器
        2、如果没有,那么系统会将解析请求发送给本机网卡指定的DNS服务器,称为LDNS(本地dns),如果本地DNS服务器
        中有域名www.baidu.com所对应的的ip地址,就会去访问这个IP对应的web服务器,如果没有就去请求其他DNS服务器
        3、LDNS服务器会从根域名服务器开始对于域名www.baidu.com的解析,全球有13台根服务器,根域名服务器没有
        www.baidu.com的解析记录,有.com顶级域的解析记录,然后把.com所对应的DNS服务器地址返回给LDNS服务器
        4、LDNS获取到.com的DNS服务器地址之后,就去.com服务器请求www.baidu.com域名的解析,.com里面也没有www
        .baidu.com域名对应的地址,但是有baidu.com域名的解析记录,然后.com服务器将baidu.com对应的DNS服务器地址
        返回给LDNS,
        5、同理LDNS去找baidu.com的DNS服务器请求www.baidu.com的域名解析,然后baidu.com域名DNS服务器将www.baidu.com地址对应的IP解析记录发送回给LDNS
        6、LDNS把解析出的结果www.baidu.com对应的ip地址发送给客户端的浏览器,然后也记录到缓存中

 #浏览器通过解析后得到的ip地址和端口号与web服务器建立一条TCP连接通道

#tcp3次握手过程

 从浏览器输入网址回车到看到页面过程到底经历了什么?-LMLPHP

三次握手指一个TCP连接时,需要客户端和服务器总共发送3个包
    第一次握手:建立连接时,客户端A发送syn包(syn=j)到服务器B,并进入Syn_send状态,等待服务器B确认
    第二次握手:服务器B收到syn包,必须确认客户A的syn(ACK=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,然后服务器B进入SYN_RECV状态
    第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),包发送完毕,客户端A和服务端B进入ESTABLISHED状态,完成三次握手

#建立TCP连接时,浏览器向web服务器发送一条HTTP请求报文

从浏览器输入网址回车到看到页面过程到底经历了什么?-LMLPHP

请求报文包括:请求行,请求头部,空白行,请求报文主体
    请求行:
        用来说明客户端想要做什么,内容包括方法字段(请求方法包括:GET:请求指定资源,HEAD,请求响应报文的首部,
        POST:提交数据到服务器,PUT:传送的数据取代指定的文档内容,DELETE:删除Request-URI所标识的资源,MOVE:
        移动)、URL字段以及HTTP协议版本(最开始的0.9版本,后来又有了1.0,1.1,2.0,其中1.1是主流)

    请求头:
        通过客户端把请求的相关信息发给服务器,内容包括媒体类型,语言类型,主机名等信息

    空行:
        告诉服务器空行以下内容不属于请求头部信息

    请求报文主体:
        用来说明客户端具体想要做的事情

#有请求报文来请求服务器,就会有服务器端去响应,为响应报文

从浏览器输入网址回车到看到页面过程到底经历了什么?-LMLPHP

 响应报文包括:状态行,响应头部,空白行,响应报文主体
    状态行
        用来说明服务器响应客户端的状态,包括一些状态码信息:一些比较重要的状态码信息有:
            200-ok                        访问成功
            301-moved permanently       永久跳转
            403-Forbidden                   禁止访问,服务端设置了相关权限,客户端没有权限去访问
            404-Not Found                    没有找到访问的页面,客户端请求的页面不存在
            500-Internal servr error    内部服务器错误
            502-Bad gateway                坏的网关
            503-Service Unavailble        服务不可用,服务超载或停机
            504-Gateway Timeout            网关超时,没有在特定时间内处理请求

    响应头将服务器响应的相关信息发给客户端

    空行:
        告诉客户端空行一下内容不属于响应头部信息

    响应报文主体:
        将web服务数据资源返回给客户端
            包括静态网页资源,动态网页资源,和伪静态资源
            纯html格式的为静态网页,服务端写的什么就返回什么给客户端
            常见的静态网页后缀有html htm xml

            以.php .js .aspx结尾的为动态网页,以数据库为基础,可以实现很多功能

            伪静态网页是通过一些技术(如rewrite重写)将动态的URL伪装成静态的URL,但实际上还是动态的URL

#当完成数据传输之后,就会有一个四次挥手的过程来进行断开连接

#tcp4次挥手过程

从浏览器输入网址回车到看到页面过程到底经历了什么?-LMLPHP

  第一次挥手
    客户端A发送一个FIN,用来关闭客户端A到服务器B的数据传送
  第二次挥手
    服务器B收到这个FIN,会回一个ACK,确认序号为收到的序号加1
  第三次挥手
    服务器B关闭与客户端A的连接,发送一个FIN给客户端A
  第四次挥手
    客户端A发回ACK报文确认,并将确认序号设置为收到序号加1
08-12 01:03