核心问题:
在浏览器中输⼊URL并按下回⻋之后会发⽣什么:
- 解析URL
输⼊ URL 后,浏览器会解析出协议、主机、端⼝、路径等信息,并构造⼀个HTTP请求
- DNS域名解析
在发送HTTP请求之前,浏览器需要知道想要访问⽹⻚(url)对应的IP地址
- 建立TCP三次握手
(这⾥是重中之重,可以扩展很多问题,⽐如为什么是三次,不是两次、四次?如果第⼀次握⼿丢失了会发⽣什么?三次握⼿过程中可以携带数据吗?)
- 浏览器发送HTTP/HTTPS请求到web服务器
(⽐如HTTP/HTTPS的区别?请求的⽅式?请求的状态码)
- 服务器处理HTTP请求并返回HTTP报文
服务器会接受请求并将其传递给请求处理程序并发送HTTP响应,⼀般响应报⽂包含:请求的⽹⻚以及状态码,压缩类型,如何缓存的⻚⾯,设置的cookie
- 浏览器渲染⻚⾯
- 断开连接之TCP四次挥⼿
DNS
DNS(Domain Name System) 是⼀种⽤于将域名(www.baidu.com)转换为IP地址(220.181.111.188 )的分布式系统。
DNS解析过程:
- 查询浏览器缓存是否已有对应记录
- 若无,前往计算机本地的Host文件中查询对应缓存
- 若依然没有,则向本地DNS服务器(通常由你的互联⽹服务提供商(ISP)提供, ⽐如中国移动)发送⼀个DNS查询请求
- 若没有该域名的解析记录,向根DNS服务器发送查询请求,告知本地DNS解析器向哪个顶级域(.com/.net/.org)的DNS服务器继续查询。
- 本地DNS解析器接着向指定的顶级域名DNS服务器发出查询请求,同样的告知本地DNS去哪个权威DNS服务器查
- 最后向权威DNS服务器发送查询请求。 权威DNS服务器是负责存储特定域名和IP地址映射的服务器。
- 本地DNS解析器将收到的IP地址返回给浏览器,并且还会将域名解析结果缓存在本地
- 浏览器使用IP地址与目标服务器建立连接
递归查询:DNS客户端(通常是本地DNS解析器)向上层DNS服务器(如根域名服务器、顶级域名服务器)发起查询请求。只需要发送一个请求,等待完整的解析结果。上层DNS服务器会⾃⾏查询下⼀级的服务器,并将最终结果返回给DNS客户端
迭代查询:DNS客户端向上层DNS服务器发起查询请求,不要求直接提供完整的解析结果。DNS客户端只是询问上层服务器⼀个更高级的域名服务器的地址,然后再自己发起查询请求
HTTP(明文直接传输,不安全)
WWW构建的技术包括:
- HTML:作为页面的⽂本标记语⾔
- HTTP:文档传输协议
- URL:指定文档所在地址
http1.1:长连接,tcp建立连接后,只要没有明确要求断开,就一直保存连接。
对头阻塞:普通的需要请求——响应然后再发出下一个请求。1.1提出请求可以直接发,不管它响应回来没。但响应顺序依然需要与请求一致,所以它只解决了请求的对头阻塞。
HTTP1.1 基于请求-响应模型。同⼀个连接中, HTTP完成⼀个事务(请求与响应),才能处理下⼀个事务
HTTP2通过Stream(多个Stream复⽤⼀条TCP连接,达到并发的效果),解决队头阻塞的问题
但客户端发起请求时,必须使用奇数号Stream,服务器主动推送必须使用偶数号Stream。
但http2依然逃不脱请求的队头堵塞问题,这是它通过TCP传输,TCP是字节流协议,TCP层必须保证收到的请求数据是完整的,所以后续的请求必须先存放再缓冲区,这造成堵塞问题。
所以http3选用UDP代替TCP。使用QUIC协议握手,直接通过连接ID来标记通信双方,客户端与服务器各选一组ID,即使切换网络导致IP地址变化,只要保有上下文信息(连接ID,TLS密钥)就可以直接切换。