Skip to content

3 Web 浏览器

URL 的解析

生成 HTTP 请求之前需要对 URL 进行解析,确定 Web 服务器和文件名 ![[Excalidraw/计算机/四大件/计算机网络 Draw.md#^group=nSIrYw3N|730]]

生成 HTTP 请求信息

![[Excalidraw/计算机/四大件/计算机网络 Draw.md#^group=dzfRQA4Y|900]] 一条请求消息中只能写一条 URI,如果要获取多个文件,必须对每个文件单独发送一条请求 ![[Excalidraw/计算机/四大件/计算机网络 Draw.md#^group=VVmY6Z7i|700]]

方法

GET-- 获取 URI 指定的信息【如果 URI 是文件,则返回文件内容;如果 URI 是 CGI 程序,则返回输出结果】 POST-- 从客户端向服务端发送数据【一般用于发送表单中填写的数据】 HEAD-- 只从服务端返回消息头给客户端【用于获取文件最后更新时间等属性】 OPTIONS-- 用于通知或查询通信选项 PUT-- 替换 URI 指定的服务器上的文件,如果文件不存在,则创建该文件 DELETE-- 删除 URI 指定的服务器上的文件 TRACE-- 将服务器收到的请求行和头部直接返回给客户端【用于在使用代理的环境中检查改写请求】 CONNECT-- 使用代理传输加密消息

消息头

  • 通用头:适用于请求和响应消息的头字段
  • 请求头:给请求消息添加附加消息
  • 响应头:给响应消息添加附加消息
  • 实体头:给消息体添加附加消息

域名解析

[!question] 为什么不直接在 Web 浏览器输入 IP 地址,还要域名干嘛? 如果对方的服务器不使用虚拟主机的话,直接输入 IP 地址也是可以访问网页的。但是对比于一串数字,域名更加好记啊

[!question] 那为什么不直接用域名来确定通信对象呢? IPv4 地址只有 32bit,域名是字符串占用内存太多,增加服务器负担,效率低下

通过解析器向 DNS 服务器发送查询信息

解析器【解析器实际上是一段程序,它包含在操作系统的 Socket库【网络开发的标准库】中】会生成查询消息,之后委托给操作系统内部的协议栈发送查询消息给 DNS 服务器,最后通过网卡发送出去

mermaid
graph LR
	a[应用程序]--调用-->b[解析器]--委托-->c[协议栈]--委托-->d[网卡]--发送消息-->e[DNS服务器]
	
	e--返回响应消息-->d--返回消息-->c--返回消息-->b--返回消息-->a

接收 DNS 服务器返回的响应消息,并解析

解析得到 IP 地址后,将其写入到 Web 浏览器的内存地址中,后续浏览器向 Web 服务器发送消息时,只要从该内存地址取出 IP 地址,并将其和 HTTP 请求消息一起交给操作系统即可

全世界 DNS 服务器的大接力

全世界的每台 DNS 服务器都具有根域服务器的 IP 地址,所以客户端只要能找到一台 DNS 服务器就可以找到根域服务器【但是查询的过程中,最近的 DNS 服务器会一直询问,直到找到 IP 地址】 ![[Excalidraw/计算机/四大件/计算机网络 Draw.md#^group=ROH2XNi4|600]] 有了这些条件,接下来就是应用程序委托 协议栈 发送消息了