大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟,刚开始写文章。 如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~
阅读本文 📖
1.您将了解到输入URL到浏览器展示内容的网络全貌
2.对计算机网络有个宏观的认识
3.用宏观的角度去了解计算机网络,构建计算机网络知识体系,鱼鱼将会一章章跟新
4.对基础知识充满了兴趣和爱好,培养自己对计算机的兴趣
前言 🌵
学习了很长时间的计算机网络,我发现计算机网络是非常有意思的一个课题,但是它的知识面广而深,通过学习我发现,很多书都是深入某一部分去讲解,未免让人失去兴趣,从URL到浏览器展示画面能够让我们全面的了解到网络的从零到一
知识点 📒
生成HTTP请求消息
- 当我们输入网址(URL)就要展示页面的话,那么第一步当然是生成HTTP请求消息
HTTP就是超文本传输协议,用于在互联网中传递网页数据的一个应用层的协议,就好比我们平时讲话用的中文,这就是协议。
协议即使约定,按照什么要的套路,来交流。
- 输入网址开始浏览器第一步先解析URL(统一资源标识符)表示资源在网络中的位置。就像这样: www.baidu.com/dir/a.jpghttp:表示传输协议类似的还有file协议、ftp协议等等.。这部分表示浏览器应到使用的访问方法。比如访问WEB服务器,应该使用 http协议,访问FTP服务器应该使用FTP协议。www.baidu.com:这部分表示域名,就是给这个资源所在ip地址取了一个小名,方便记忆而已。/dir/a.jpg: 这部分就表示访问目标计算机的哪层目录要访问哪个文件,像 /dir/ 这种就是省略了文件名的情况,默认为index.html
- 总的来说URL就是由 访问协议+服务器域名+数据源的路径名 组合而来的,目的就是为了表示某个资源在网络中的具体位置,该已什么方式去访问。
- 当浏览器解析完URL后,就知道我们要访问哪个网络中的计算机的哪个目标资源了
- http协议定义了客户端和服务器之间交互的消息内容和步骤。
- 请求消息大致就是“对什么”,进行什么样的“操作”
- http本质就是应用层协议,我们使用这个协议就可以向web服务器放松请求,服务器也同样会使用http协议响应我们的请求,就好比我用中文和你交流,你当然也用中文回我话,我们才知道说的啥,意思一样的。
- CGI程序式对web服务器程序调用其他程序的规则所做的定义,我们可以发送请求获取资源,也可以执行web服务器上的程序
- HTTP的主要方法 GET:拿 POST:客服端向服务端发送数据 HEAD:和GET大致相同,只不过它只返回HTTP的消息头,不返回数据内容,用于获取文件最后更新时间等属性信息。
OPTIONS:用于通知或者查询通信的选项
PUT:替换URL指定的服务器上的文件,不存在则创建 DELETE:删除 TRACE:将服务器收到的请求行和请求头返回给客户端,用于在使用代理的环境中检查改写请求的情况。 CONNETCT:使用代理传输加密消息时使用的方法
对URL进行解析后,知道了去哪执行什么操作,接下来就是生成HTTP请求消息了,HTTP请求消息是有严格规范的。
可以大致参照这幅图,按照这种格式,也就是我们HTTP的请求/响应消息
就好像我们打仗的时候我们得约定一个什么摩斯密码,按照这种规定去要表达我们想要表达的意思是一样的,必须得遵守这个规范,不然我们双方都不知道在说什么。
生成好了HTTP请求消息之后,我们就需要将我们的消息发送出去了,那么就是接下来的向DNS服务器查询Web服务器的IP地址了。
向DNS服务器查询Web服务器的IP地址
有了HTTP请求消息,当然我们需要将我们的消息发送出去了。首先我们需要的就是像DNS服务器去查询我们目标Web服务器的IP的地址
- IP地址就是在互联网中,我们表示一台接入了网络,就是联网的一台机器,它在互联网中的地址。就好比我们的小区楼房的门牌号,可以通过这个地址找到你。
- DNS服务器就是一台电脑,上面有一张表,保存了域名和ip地址的对应关系
- 为什么又了IP地址还需要域名呢,因为方便人记忆,域名通常都是具有语意的,IP地址没有语意又很长,为了方便人的记忆,所以我们使用域名,通过域名我们可以映射出目标的IP地址,从而通信,这个机制就叫DNS
- 谁去查询域名所对应的IP地址呢,浏览器是不具备这个功能的,但是它可以调用操作系统中的Socket里面的DNS模块去帮助我们查询域名所对应的IP地址
- 我们只需要将域名委托给操作系统,然后它就会去帮助我们查询ip地址并保存到指定的内存地址中,我们只需要从对应的内存地址中取出IP地址就完成了DNS解析
- 操作系统中的解析器会调用操作系统内部的协议栈发送UDP消息去获取ip地址
- 协议栈:操作系统内部的网络控制软件,也叫“协议驱动”“TCP/IP”驱动等。
- 那么协议栈从哪个服务器去查找域名所对应的ip地址呢,一般是先从浏览器内部的缓存中获取,如果没有则从操作系统缓存中获取,如果还是没有则从我们上面设置的默认DNS服务器上面去获取相应的信息
全世界DNS服务器的大接力
DNS服务器的基本工作
dns服务器里面有张表
发送给DNS的消息包含三种信息
- 域名
- Class 现在都是IN
- 记录类型 A代表域名对应的是IP地址,MX表示域名对应的是邮件服务器,CNAME表示域名别名,根据IP地址反查域名的PTR类型,查询DNS服务器IP地址的NS类型
总的来说DNS服务器的基本工作就是根据需要查询的域名和记录类型查找相关的记录,并向客户端返回响应消息
由于一台DNS服务器无法保存所有的记录,所以DNS服务器需要分层
当我们查询域名对应的IP地址时,一般是先访问最近的DNS服务器(客户端TPC/IP设置中填写的DNS服务器地址),如果服务器上没有我们要查找的记录,那么就会访问根域名服务器,根域名服务器会根据ip地址返回它下一层域名服务器ip给最近的DNS服务器,如此往复,我们就能查到了,但是这样效率太低了。
实际上一台DNS服务器是可以管理多个域的信息的,DNS服务器具有缓存功能,可以记住之前查询过的域名。
委托协议栈发送消息
现在有了HTTP请求消息,有了域名所对应的IP地址,接下来我们需要委托我们的协议栈将我们的消息发送出去。
当协议栈收到委托后,会按照指定的顺序来调用程序组件,来完成消息的发送。这就是我们的TCP/IP协议栈
首先我们需要建立TCP连接,也就是创建套接字,套接字就相当于日常生活中的插座,在网络的两端分别安装好插座,然后进行TCP连接,也就是将一个虚拟的管道连接到两端的插座上,这样是不是就可以通信了。
建立管道的关键在于管道两端的 数据出入口,这些出入口称为套接字。我们需要先创建套接字,然后再将 套接字连接起来形成管道。
一般来说服务器会先创建好一个套接字等待连接,当客户端需要发送消息时,客户端会创造套接字,然后去连接服务器端的套接字,一旦连接建立,我们就可以收发数据了,数据收发完成,我们就可以断开连接,一般由,套接字也会被删除掉。
大致流程为
1.创建套接字
2.将管道连接到服务器的套接字上 (连接阶段)
3.收发数据 (通信阶段)
4.断开管道并删除套接字(断开阶段)
在每个阶段Socket库都会调用不同的程序组件来执行不同的功能。
创建套接字
创建套接字就是协议栈根据在当前计算机创建一个套接字,将这个套接字的描述符保存在内存中,这个描述符就是计算机内部来识别套接字的东西
建立连接
使用创建好的套接字,然后调用程序组件connet去建立连接,我们需要告诉connet几个参数,服务器端的IP地址和端口号(IP地址和端口号是用于服务器和客户端之间识别套接字的机制)
传递消息
建立好连接,调用程序组件中的write来发送数据,read来接受数据
断开连接
最后断开连接,删除套接字
总结 🍁
- 解析URL
- 生成HTTP请求消息
- DNS解析
- 创建套接字
- 建立连接
- 收发消息
- 断开连接