访问一个url的全过程
前言
当我们在浏览器上键入www.baidu.com,并按下回车时,发生了哪些事?
过程
大致有这几个流程
1:DNS解析,得到IP地址
2:浏览器根据IP地址,访问服务器,建立TCP连接
3:建立完TCP连接后,浏览器向服务器发送http请求
4:服务器返回http响应给浏览器
5:浏览器根据响应渲染页面呈现给用户
6:浏览器关闭TCP连接
DNS解析
浏览器得到是一个域名,需要把这个域名转化成IP地址才能找到服务器。DNS解析就是将域名转化为IP地址的过程。
解析的过程总的来说,是先在本地缓存里寻找域名对应的IP地址,没有找到就去域服务器递归寻找,找到后返回给浏览器并存到本地缓存。
具体过程
①先在浏览器缓存里寻找DNS记录。谷歌浏览器能够缓存1000条DNS记录,缓存的时间是1分钟
②接着在host文件和系统缓存里寻找。
③本地缓存都没有的话向域服务器发送请求,没找到的话递归到下一级的域服务器继续查找。直到找到返回
建立TCP连接
得到ip地址后,浏览器通过ip地址找到服务器,并通过三次握手建立tcp连接。
TCP连接,全名Transmission Control Protocol,传输控制协议。是一种面向连接确保数据在端之间可靠传输的协议。
TCP报文格式
TCP有六个标志位,分别是SYN,ACK,FIN,URG,PSH,RST。
这里主要讲下SYN,ACK和FIN
SYN(Synchronize Sequence Numbers):用于建立连接的同步信号
ACK(Acknowledgement):用于对收到的数据进行确认
FIN(Finish):表示后面没有数据要发送了,一般是值需要关闭连接了
标志位都是置为1表示有效
三次握手
浏览器需要和服务器进行三次握手才能建立连接,三次握手的图如下
①浏览器向服务器发送一个报文,报文里标志位是SYN,被置为1,表示希望建立连接,序列号seq为x,
②服务器收到数据包后,知道浏览器希望建立连接,返回一个SYN为1,ACK为1,序列号seq为y,确认序列号ack为x+1的报文
③浏览器收到报文后,知道服务器确认收到报文,于是对服务器的响应进行确认,发送一个ACK为1,序列号seq为x+1,确认序列号ack为y+1的报文。
三次握手的目的是为了信息对等和防止超时。
信息对等指的是双方需要确认自己和对方都能发送和接收请求。
信息对等:
三次握手能够确保两台机器都能确认自己和对方能够发送和接收请求
防止超时:
如果只有两次握手,那么假设A机器第一次握手请求超时,然后重新发送请求,这时B机器收到重新发送的那个请求,然后返回报文,AB两次握手建立连接。假设这时候A机器第一次的报文终于到达B机器了,然后B机器收到后又发送报文给A,那么又建立起连接。这时AB之间有两个连接,脏连接建立
如果是三次握手,那么B机器返回的报文给A,A因为不是SYN_SENT状态,会直接丢弃。
浏览器发送Http请求
建立完TCP连接后,浏览器就可以向服务器发送Http请求了。
一个Http请求包括请求行,请求报头,请求文
Http报文格式
请求行:包括 请求方法 请求地址 Http版本协议
请求方法:
GET,POST,PUT,DELETE,HEAD,OPTION,SPATCH,TRACE
常用的是
GET(获取一个完整的资源)
POST(提交一个表单)
PUT(上传一个文件)
DELETE(删除)
请求报头
由名/值对组成,是请求报文的附加信息,每行一对,中间用冒号隔开
常见的报文头:
名 | 说明 |
---|---|
Host | 接收请求的服务器地址 |
User-Agent | 发送请求的应用程序名 |
Connection | 连接的相关属性 |
服务器返回Http响应
服务器收到浏览器发送的Http请求,进行处理,然后返回http响应给浏览器
Http响应由状态行,响应头部,响应数据构成
状态行包括状态码,http协议版本
常见的状态码
200 客户端请求成功
403 服务器拒绝执行此请求
404 请求资源不存在,输入了错误的URL
500 服务器发生不可预期的错误
503 服务器暂时的无法处理客户端的请求。一段时间后可能恢复正常
响应头部:和请求报文头一样,都是名/值对产生
浏览器根据响应进行解析渲染,呈现给用户
返回回来的响应可能有Html,css,js等等。
可能会再去发送http请求去把其他资源拿回来。一般来说,访问一个页面,页面最终呈现在用户面前,会需要经历多次的http请求。
浏览器根据响应回来的资源进行解析渲染。如果是js文件那么会用js的解析器进行解析,如果是其他语言其他的文件,那么也会用对应的方式进行解析
浏览器关闭TCP连接
Connection: keep-alive
在早期http1.0版本里,每创建一个http请求都需要创建tcp连接。这就导致tcp连接每次都要创建,关闭。性能十分低下。为此,在请求头中引入Connection: keep-alive。意在告诉服务端完成本次http请求后不要关闭tcp连接,直到空闲时间超过keep-alive(超时时间)。在1.1版本中,默认是Connection: keep-alive。
四次挥手关闭TCP连接
浏览器通过四次挥手关闭TCP连接,过程如下
①:浏览器向服务器发送FiN为1的报文,表示想要关闭连接,同时序列号seq为x
②:服务器收到报文后,知道浏览器想要关闭连接,返回一个ACK为1,表示确认收到,序列号req为y,确认序列号ack为x+1的报文。
服务器发完ACK报文后,做好释放连接的准备
③:服务器再发送一个标志位ACK和FIN为1,表示已经准备好释放连接,序列号seq为z,确认序列号为ack为x+1的报文
④:浏览器收到收,知道服务器已经做好全部的准备,就发送一个ACK为1,表示确认收到,序列号seq为x+1,确认序列号ack为z+1的报文。