当我们在浏览器中输入 http://www.baidu.com/ 按下回车的时候,浏览器做了哪些事情,大概的流程如下:
1.域名到IP地址的转换,浏览器依次查找:
(1)搜索浏览器自身的DNS缓存
(2)搜索操作系统自身的缓存
(3)查找硬盘中hosts文件中是否有DNS和IP地址的映射
(4)向域名服务器发起DNS请求(复杂的过程)
然后浏览器获得了IP地址。
2.TCP连接(三次握手)
发三次包,TCP报文格式如上,主要关注几个字段:
(1)序号:Seq序号,32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:Ack序号,32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,含义如下:
ACK:确认序号有效。
SYN:发起一个新连接。
FIN: 释放一个连接。
3.发起HTTP请求
请求消息包括:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
4.HTTP响应
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
服务器接受到这个请求后,根据路径参数,经过后台一些处理之后,把处理后的结果返回给浏览器,比如是百度首页,就可以把完整的 HTML 页面代码返回给浏览器。
5.浏览器解析呈现HTML内容
浏览器拿到了百度首页的完整 HTML 页面代码,内核和 JS 引擎就会解析和渲染这个页面,里面的 JS,CSS,图片等静态资源也通过一个个 HTTP 请求进行加载。然后浏览器根据拿到的资源对页面进行渲染,最终把完整的页面呈现给用户。
6.TCP 断开(即四次挥手)
如果浏览器没有后续的请求,那么就会跟服务器端发起 tcp断开。