#前言:从浏览器输入网址到回车看到页面的过程,面试逃不掉的一个问题,我们知道从浏览器输入网址到看到页面主要是涉及DNS解析,TCP三次握手,请求报文,响应报文,TCP4次挥手。
#首先我们先来看一下总体的访问过程
#总体的访问过程:首先会进行DNS解析,然后解析得到地址之后客户端和web服务器会建立一条TCP连接,其中有一个TCP三次握手过程,当完成握手之后客户端就会向浏览器发送一条请求报文,服务器然后进行响应,接着当数据传输完之后,服务器和客户端有一个TCP四次挥手过程,来结束连接。
#然后我们来将过程分解一下
#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次握手过程
三次握手指一个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请求报文
请求报文包括:请求行,请求头部,空白行,请求报文主体 请求行: 用来说明客户端想要做什么,内容包括方法字段(请求方法包括:GET:请求指定资源,HEAD,请求响应报文的首部, POST:提交数据到服务器,PUT:传送的数据取代指定的文档内容,DELETE:删除Request-URI所标识的资源,MOVE: 移动)、URL字段以及HTTP协议版本(最开始的0.9版本,后来又有了1.0,1.1,2.0,其中1.1是主流) 请求头: 通过客户端把请求的相关信息发给服务器,内容包括媒体类型,语言类型,主机名等信息 空行: 告诉服务器空行以下内容不属于请求头部信息 请求报文主体: 用来说明客户端具体想要做的事情
#有请求报文来请求服务器,就会有服务器端去响应,为响应报文
响应报文包括:状态行,响应头部,空白行,响应报文主体 状态行 用来说明服务器响应客户端的状态,包括一些状态码信息:一些比较重要的状态码信息有: 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次挥手过程
第一次挥手
客户端A发送一个FIN,用来关闭客户端A到服务器B的数据传送
第二次挥手
服务器B收到这个FIN,会回一个ACK,确认序号为收到的序号加1
第三次挥手
服务器B关闭与客户端A的连接,发送一个FIN给客户端A
第四次挥手
客户端A发回ACK报文确认,并将确认序号设置为收到序号加1