当我们在浏览器中输入一个URL后,发生了什么?
在输入网址后回车或者刷新页面的时候,渲染出页面,计算机和浏览器要做的:
首先是域名解析:
通过DNS(domain name system域名系统)获取IP地址,DNS查询步骤,其中一步成功则直接跳到建立连接部分:
- 浏览器搜索自身的DNS缓存
-
搜索操作系统自身的DNS缓存
-
读取本地的HOST文件
-
向域名服务器发送请求
建立TCP连接(TCP三次握手):
浏览器获得域名对应的IP地址后,建立TCP连接,TCP协议通过“三次握手”等方法保证传输的安全可靠:
-
发送方:SYN(synchronize),客户端发送SYN包(SYN=j)到服务器
-
接收方:SYN/ACK:在接收到客户端的syn包后,服务器也要发送一个SYN包给客户端,即SYN+ACK包,(确认信息传达)
-
发送方:ACK:客户端收到SYN+ACK包后,向服务器发送ACK包(确认接收方在线可收消息,握手结束)
-
Accept:完成三次握手,客户端与服务器开始传送数据
发送HTTP请求:
TCP/IP连接建立起来后,浏览器就可以向服务器发送HTTP请求了。使用了比如HTTP的get方法请求一个根域里的一个域名,协议可以采用HTTP1.0的一个协议。
-
请求行(如:GET /index.html HTTP/1.0用来说明请求类型,要访问的资源以及所使用的HTTP版本.)
-
请求头(用来说明服务器要使用的附加信息)
-
空行(CR+LF)
-
报文主体
服务器发送HTML响应:
服务器端接收到了这个请求,根据路径参数,经过后端的一些处理之后,把处理后的一个结果的数据返回给浏览器
-
状态行(如:HTTP/1.1 200 OK,HTTP协议版本号、响应状态码、状态码信息)
-
响应首部(用来说明客户端需要使用的一些附加信息)
-
空行(CR+LF)
-
报文主体(响应正文)
浏览器解析HTML页面代码
浏览器拿到了拿到了完整的HTML页面代码,在解析和渲染这个页面的时候,里面的JS、CSS、图片静态资源,他们同样也是一个个HTTP请求,都需要经过上面的步骤
浏览器渲染
浏览器根据拿到的资源对页面进行渲染
TCP连接的释放(四次挥手)
数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
-
客户端:FIN:客户端进程发出连接释放报文,并且停止发送数据;
-
服务器:ACK:服务器收到连接释放报文,发出确认报文;
-
服务器:FIN+ACK:将最后的数据发送完毕后,就向客户端发送连接释放报文
-
客户端:ACK:收到服务器的连接释放报文后,发出确认报文(服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接)