文章目录
一.浏览器首先要解析URL(确定协议,要进行通信的主机,要访问的文件)
- 假设我们要访问 http:// www.baidu.com:80:/dir/index.html
- 使用的协议为http协议
- 要访问的web服务器的名称为www.baidu.com
- 其端口为80(这里端口号可以省略)
- 要访问的文件为其dir目录下的index.html文件
- 当我们打开百度的时候其URL为 https://www.baidu.com/
- 协议使用的是https协议,web服务器名称为www.baidu.com
- 访问的目录名字为 / ,结果就是访问/目录下的默认文件
- 这里就是index.html文件
注:服务器上的文件夹都有一个根目录,这个根目录叫/。
1.1 URI和URL
- URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。(www.baidu.com/dir/index.html)
- URL(Uniform Resource Location) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。(www.baidu.com)
- URL是URI的子集
二.生成HTTP消息
- 进行了URL解析之后,就确定了服务器的名字和想要访问的文件。
- HTTP消息就是包括了要对什么进行操作和要怎么做这两个部分
- 其中对什么进行操作称之为URI,这个上面说了
- 要怎么做的意思就方法,是要获取服务器上的资源(GET方法),还是要给服务器传输一组数据然后得到结果(POST方法)
- 下边这个就是HTTP的请求消息
GET /cache/fpid/chromelib_1_1.js?_=1626504801441 HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: https://www.baidu.com/
X-Requested-With: XMLHttpRequest
Connection: keep-alive
2.1 GET方法和POST方法
2.1.1 GET方法
- 一般我们要想在服务器上获取网页数据的时候会用到GET方法
- 其操作的过程是,在请求消息中写上GET方法,在URI中有想要访问文件的名字
- 服务器收到消息后,按照URI找到对应的文件,并将其放到响应消息中,返回给客户端
- 最后,文件显示到浏览器上
2.1.2 POST方法
- 一般我们在表单中填写数据并将其发送给Web服务器的时候会用到POST方法。
- 例如我们要登陆淘宝网,我们肯定要填写用户名和密码,这就是表单,最后通过服务器把我们的淘宝信息显示出来,比如购物车信息,订单信息什么的,这时就要用到POST方法
- 过程是,首先URI会指定Web服务器上运行中的一个程序
- 然后把我们输入的表单中的数据传进去
- 最后Web服务器接收输出结果,将他存到响应消息中返回。
三.找到想要访问的服务器的ip
- 这里到了这里其实还没有和服务器建立连接。
- 从这里开始就要建立连接
- 首先要明确一点:浏览器不具备将消息发送到网络中的功能,他只能解析/生成HTTP消息,要将HTTP消息发送到网络中,只有通过操作系统才能实现。
- 在委托操作系统发送消息的时候,必须要提供服务器的ip地址,而不是服务器的名称。
- 但是,我们输入到浏览器里面的就是服务器的名称,现在要连接却要ip,这就需要DNS解析了。
3.1 DNS解析
- 查找ip地址的方法非常简单,只需要找到最近DNS服务器,问他我想要访问的服务器的ip是多少就行了。
- 当然,要想找到DNS服务器,就必须要有DNS客户端,这DNS客户端就包含在操作系统的Socket库里面,这里就需要操作系统了,之前也说了找ip需要操作系统,一旦程序需要服务器(比如百度)的ip地址之后,这段程序就阻塞
- 然后,解析器(DNS客户端)就开始工作,去找服务器的ip,找到之后,把ip放到内存里面,把内存的地址给当前程序,然后程序根据地址找到ip,之后在运行。
- 这里解析部分下面写,这里简化了,下面详细写。
3.1.1 DNS解析过程
3.1.1.1 根据什么确定ip
- 因为一台DNS服务器上不可能只有一个ip,他是有很多ip的,那么我们要根据什么来找到我们想要的ip呢。
- 域名,就是服务器的名称,如果是邮件服务器的话就是@后面的名称(比如gzh48692020@163.com),@后面的就是163.com。
- class ,这个现在没啥用了,之前是不只有互联网这一种网络,现在只有互联网,所以其名称都是 IN。
- 记录类型, 记录类型为A,就是对应的ip,其他的没记。
- URL来了,就在DNS服务器里面找,找到了对应的,就返回其ip。
3.1.1.2 DNS递归查询
- 因为不可能所有的ip都保存在一台服务器上,所以肯定有查不到的时候
- 所以,这时候就需要DNS服务器之间相互配合,从而找到要查询的信息
3.1.1.3 DNS分层
- DNS服务器中,所有的信息都是按照域名,以层次的结构来保存的。
- 越靠右边,等级越高
- 比如:www.baidu.com中.com就是最高的层级,类似与com学校baidu专业的www学生。
- 一个域只能完整的保存到一个DNS服务器上,不能拆分保存到多台服务器上。
- 比如baidu.com只能完整的保存到DNS服务器上,不能baidu保存到一个DNS服务器上,com保存到另一个服务器上。
- 根域的存在,比如.com这种最高级别的域的上面一层就是根域,根域DNS全世界只有13台。
- 如果找不到就找根域DNS服务器,然后再慢慢找ip。
- 一个DNS服务器上不止有一个域,可能有很多域,可能下一级的域和这一级的域在同一个DNS服务器上。
- 比如 .com 和baidu.com,要是在一个DNS服务器上就省事很多,少了一环找DNS服务器的环节。
注:ip是最近的DNS服务器告诉客户端的
四. 连接
TCP/IP的三次握手
- 在连接的过程中分TCP模块和IP模块,TCP模块负责给数据包加上TCP头部,然后将数据包委托给IP模块进行发送。
- IP模块中会将从TCP模块中得到的数据包在添加上一个IP头部和MAC头部,IP头部中比较关键的信息是发送方和接收放的IP地址。当然,MAC头部中也有接收方和发送方的MAC地址。
五.发送请求
- 是网卡进行请求的发送的
GET /cache/fpid/chromelib_1_1.js?_=1626504801441 HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: https://www.baidu.com/
X-Requested-With: XMLHttpRequest
Connection: keep-alive
- 就是把之前生成的HTTP消息传过去
六.服务器处理请求并返回HTTP报文(响应)
https://sp3.baidu.com/-0U_dTmfKgQFm2e88IuM_a/ps_fp.htm?pid=ps&fp=undefined&im=undefined&wf=undefined&br=3&qid=ff0f8c6c00072737&bi=8B10BB4EA00ABD1F20DCB134E3E9CB15:FG=1&psid=8B10BB4EA00ABD1F2C9ECA4AF5C24DF6
- 这就是响应头
- 浏览器解析渲染页面
七.断开连接
四次挥手