子网掩码中网络号和主机号的关系
- 子网掩码表示的是IP地址的内部结构
主机号部分的比特全零或全1代表的含义
- 全零(表示整个子网,而不是子网的某台设备)
- 全1(表示向子网上的所有设备发送包,即广播)
为什么采用域名访问服务器,而不是直接使用IP地址?
- 使用IP地址只需要处理四字节的数字,而域名则需要处理几十个到255个字节的字符,这增加了路由器的负担,传送数据也会花费更长的时间。
什么是DNS?
通俗的讲,就是讲域名和IP地址建立一个映射关系。
什么是Socket库?
Socket库是操作系统提供的一种库,通过这个库,可以让其他应用程序调用操作系统的网络功能。负责执行DNS查询IP地址的解析器就在这个库中。浏览器程序只需调用这个接口,解析器就会向DNS服务器发送查询消息,然后DNS服务器会返回相应的响应消息,响应消息中包含查询到的IP地址,解析器会取出这个IP地址,然后将其放入浏览器指定的内存地址中。
什么是DNS服务器的记录类型?
当类型为A时,表示域名对应的时IP地址,当类型为MX时,表示域名对应的是邮件服务器。对于不同的记录类型,DNS服务器向客户端返回的信息也会不同。
域名的层次结构
寻找相应的DNS服务器并获取IP地址
- 客户端首先会访问最近的一台DNS服务器。(这台最近的DNS服务器是我们设置的DNS服务器)
- 如果对应的DNS服务器没有存放我们要查找的域名信息,就从根域名DNS服务器开始从上往下进行查找,直到找到我们想要的域名信息为止
通过缓存加快DNS服务器的响应
- 现实中一个DNS服务器可能管理着多个域的信息。
- 现实中上级域和下级域可能共享同一台DNS服务器。
- DNS服务器有一个缓存功能,可以记住查询过的域名,如果要查询的域名和相关信息已经在缓存中,那么可以直接返回响应,接下来的查询可以从缓存的位置继续。
- 如果查询结果不存在,这个不存在的情况也会被缓存
- 如果信息被缓存后,原本注册的信息发生了变化,那么这个缓存中的信息就是不正确的。因此DNS服务器缓存中保存的信息具有一个有效期,当缓存中的有效期超过之后,这个信息就会被删除。
什么是套接字?
客户端与服务器进行通信时,通信管道的两端的数据出入口就称为套接字。我们需要先创建套接字,然后将套接字连接起来形成管道。
- 服务器端先创建套接字,然后等待客户端向该套接字连接管道。服务器程序一般会在启动后就创建好套接字等待客户端来接连管道。
- 客户端创建好套接字后延伸出管道,最后管道连接到服务器端的套接字,双方的通信准备就完成了。
- 管道在连接时是由客户端发起的,但在断开时可以由任意一方发起。
- 上面的操作都是操作系统的协议栈完成的,而不是浏览器等应用程序完成的
创建套接字阶段
- 客户端创建套接字的操作非常简单,只需要调用Socket库中的socket程序组件即可。
- 套接字创建完成之后,协议栈会返回一个描述符,应用程序会将收到的描述符存放在内存中,描述符是用来识别不同的套接字的,因为一台计算机可能需要进行多个通信管道的建立,所以需要识别不同的套接字。
连接阶段:把管道接上去
- 接下来,我们需要委托协议栈将客户端创建的套接字和服务器端创建的套接字连接起来,应用程序通过调用Socket库中的connect的程序组件来完成这一操作。
- 当连接成功后,协议栈就会将对方的IP地址和端口号等信息保存在套接字中,这样我们就可以开始收发数据了。
- 描述符:应用程序用来识别套接字的机制。
- IP地址和端口号:客户端和服务器之间用来识别对方套接字的机制。
通信阶段:传递消息
- 应用程序通过调用Socket库中的write程序组件,指定描述符和发送数据,然后委托操作系统的协议栈将数据发送给服务器。
- 由于套接字中已经保存了已连接的通信对象的相关信息,所以只要通过描述符指定套接字,就可以识别出通信对象,并向其发送数据。
- 当服务器返回响应的数据后,应用程序接收消息的操作是通过Socket库中的read程序组件委托协议栈来完成的。
- 调用read时需要指定用于存在接收到的响应消息的内存地址,这一内存地址被称为接收缓冲区。
断开阶段:收发数据结束
- 当浏览器收到数据之后,收发数据的过程就结束了。
- 接下来,我们需要调用Socket库中的close程序组件进入断开阶段,最终链接在套接字之间的管道会被断开,套接字本身也会被删除。
- Web服务器会首先调用close来断开连接,断开操作传达到客户端之后,客户端在调用read执行接收数据操作时,read会告知浏览器收发数据操作已经结束,连接已经断开,浏览器得知后,也会调用close进入断开阶段。
HTTP协议将HTML文档和图片都作为单独的对象来处理,每获取一次数据,就要执行一次连接、发送、断开,如果网页包含多张图片,这时势必会造成服务器的效率降低,因此HTTP1.1版本中当所有的数据都请求完成之后,浏览器才会主动触发断开连接的操作。