网络是如何连接的——浏览器生成消息
网络是如何连接的——浏览器生成消息
1. 生成HTTP请求消息
URL的组成:协议,服务器主机地址(ip地址),端口,路径,参数
- 协议:常用的http,https,ftp(文件传输协议),file(读取计算机本地文件),mailto(发送邮件)
- 服务器主机的地址:可以是主机名,可以是域名,或者是ip地址。
- 端口:默认不展示端口号,但是会有默认的端口号,比如http请求的端口号是80,mysql的端口号是3306
- 路径:访问的资源在服务器下的相对路径,不是在服务器的绝对路径,是服务器上的一个目录或者文件地址
- 参数:客户端向服务器端传输的需要查询的参数
浏览器如何解析URL:
-
解析访问数据的协议
-
解析Web服务器名
-
根据路径访问服务器上该资源所在的位置
存在路径为空的情况,省略了文件名的情况(eg:https://www.baidu.com/): 大多数情况默认访问的是 /index.html或者default.html
省略掉"/"的情况(eg:https://www.baidu.com/heyuting),如果前面有该文件(heyuting),则将其作为文件名来处理,如果存在该目录名(heyuting),就将其作为文件名来处理
生成HTTP请求消息:
发送请求以后会收到响应
- 一条请求消息中只能写一个URI,如果要获取多个文件,必须要对每个文件单独发一条消息
2. 向DNS服务器查询Web服务器的ip地址
生成HTTP请求以后,需要委托操作系统将消息发送给WEB服务器;在此之前,要根据域名查询IP地址
IP地址的组成:
1⃣️:10.1. 2. 3 网络号:10.1.2 主机号:3
2⃣️:IP的主机号:
全0:表示整个子网
全1: 表示向子网上所有设备发送包,即"广播"
为什么要使用IP和域名并用
域名可能需要十几个字节,而IP只有4个字节,这增加了路由器了负担
于是我们让人使用名称,让路由器来使用IP地址,解决这一并行问题的就是DNS
Socket库提供查询IP地址的功能
- DNS解析器:可以理解为计算机上的DNS客户端
解析器实际上是一段程序,在操作系统的Socket库(用于调用网络功能的程序组件集合)中
-
调用解析器:解析器的会向DNS服务器发送查询消息,DNS服务器会返回响应消息,包括IP地址,解析器会将IP地址写入指定的浏览器地址中
-
浏览器向服务器发送消息的时候,从内存中取出IP地址,和HTTP消息一块交给操作系统就可以了
-
解析器内部工作原理:
-
DNS的IP地址也需要提前知道,但是DNS的IP地址已经提前设置好了
3.进入DNS的服务器中查询ip地址
DNS的基本工作就是接收来自客户端的查询消息,客户端发来的消息包含:
-
域名
-
Class : 代表互联网IN
-
记录类型:为A的时候,表示域名对应的IP地址;当类型为MX的时候,表示域名对应的邮件服务器
(IP反查域名的类型:CNAME,查询DNS的IP地址类型:NS)1. DNS服务器会从域名与IP地址的对照表中查找相应的记录,并且返回IP地址
2. 一个域是一个不可分割的整体,只能保存在一个DNS服务器中,不过DNS和域并不是总是一对一的。一台DNS服务器中也可以存放多个域的信息
寻找相应DNS服务器并获取IP地址
从根目录开始的找下一层级的DNS,一直到低级别的域,来寻找到DNS服务器
DNS的根域: 在顶级域名后面省略了一个**"."** 全球分配给根域的服务器只有13台,并且只要安装了DNS服务器程序,根域的配置就已经自动配置好了
DNS的缓存,加快响应
无论能否查询到域名,哪怕不存在也会被缓存,当下次查询不存在的域名的时候都可以快速响应
4. 委托协议栈发送消息
-
向操作系统内部的协议栈发出委托的时候,需要按照指定的顺序调用Socket库中的程序组件
-
收发数据的操作:
- 创建套接字:套接字可以描述为两段传输数据的入口
- 将管道连接到服务器端的套接字上(连接阶段)
- 收发数据
- 断开管道并删除套接字(断开阶段)
套接字创建: 调用socket之后,会执行创建套接字的操作
应用程序是通过"描述符"来识别套接字
连接阶段
委托协议栈将客户端创建的套接字与服务器端的套接字连接起来
应用程序通过调用Socket库中名为connect的程序,调用connect时,需要指定描述符、服务器IP地址和端口
号,这3个参数
为什么已经知道了IP还要知道端口号:
因为在实际客户端和服务器端的通讯中,会创建的多个套接字,要通过指定的端口号、IP来区分。
描述符和端口号、IP地址:
描述符的作用,适用于应用程序(本机内部)去识别一个套接字的机制
端口号、IP地址:客户端和服务器端用来识别对方的套接字的机制
通信阶段:
套接字连接起来以后,只要将数据接入套接字,数据就会被发送到对方的套接字中,需要调用socket中的write这个程序组件。指定描述符和发送的数据
服务器接收数据,调用Socket中的read程序组件委托协议栈来完成。read接收的消息存放到响应消息的内存地址,这一内存地址成为接收缓存区,接收缓存区是一块位于应用程内部的内存空间,消息存放到这里,就相当已经给了应用程序
断开阶段
调用Socket库中的close程序组件进入断开阶段,连接在套接字之间的管道会被断开,套接字本身也会被删除
5. http和https的区别
- Https协议需要到ca申请证书,也需要费用
- http是超文本传输协议,是明文传输。https是ssl加密协议
- https和http的连接方式完全不同,用的端口不一样,前者是80,后者是443
- http是无状态连接,https协议是SSL+HTTP协议构建的可加密传输、身份认证的网络协议,比较安全
SSL/TLS协议基本原理
过程:
-
客户端向服务器索要并验证公钥(客户端给出协议的版本号,生成一个的随机数,以及客户端支持的加密方式)
-
双方协商生成"对话**"
-
双方采用"对话**"进行加密通讯
对话**:
-
客户端给出协议的版本号,生成一个的随机数,以及客户端支持的加密方式
-
服务器端确定双方使用的加密方式,给出数字证书(公钥在数字证书中)、以及服务器生成的随机数
-
客户端开始协商SSL/TLS等级,建立会话**,利用公钥将会话**加密,并传送网络
-
服务器用自己私钥进行解密,得到对称**
-
双方都知道了对方**,可以进行进行通讯
-