当用户在浏览器上输入一个网址并请求访问,内部发生了什么?
首先,浏览器客户端会根据DNS根域名解析请求的网址,并转换为IP地址,通过解析到的IP地址,浏览器就能与服务器进行TCP连接(三次握手):
客户端向浏览器发送一个同步报文段,控制位:SYN=1,ACK=0;
浏览器接收到客户端的请求,同意连接,控制位:SYN=1,ACK=1;
客户端收到浏览器同意连接的报文段,再向浏览器发送一个报文段,控制位:ACK=1;
在HTTP/1.0版本,建立短连接,每请求一次就建立一次TCP连接,在HTTP/1.1,更改为建立长连接,即只需要建立一次TCP连接就能进行多次HTTP通信。建立TCP连接后,浏览器会生成一个HTTP报文,并发送给目标服务器,HTTP请求报文第一行包含了请求方式,请求路径URL,HTTP协议版本号,例如:
POST http://www.example.com/ HTTP/1.1
服务器收到浏览器的报文后,进行处理,解析,执行对应的操作,然后向浏览器发送一个HTTP响应报文,响应报文头第一行包含协议版本,状态码,响应报文体主要是返回给浏览器的页面源代码,例如:
HTTP/1.1 200 OK
浏览器收到服务器的响应报文后,解析响应报文,并把html源代码渲染呈现到浏览器上,如果要停止访问,那么就在传输层关闭TCP连接(四次挥手):
浏览器向服务器发送关闭连接的请求,控制位:FIN=1,ACK=0;
服务器收到浏览器的请求,此时不关闭连接,继续向浏览器发送还未完成的报文,控制位:FIN=0,ACK=1;
服务器发送完报文后,同意关闭连接,继续向浏览器发送报文,控制位:FIN=1,ACK=1;
浏览器收到服务器同意关闭连接的数据包,向服务器发送确认收到报文,控制位:ACK=1;
这样,一个浏览网站的过程就执行完了。