HTTP消息、DNS服务与协议栈消息发送
网络是如何连接的
前言
网络是怎样连接的,来自于日本的一位作者,本书主要以web交互,从客户端访问服务器以及服务器应答的过程来讲解的。接下来一段时间将以书本上涉及知识的总结以供后期自行查阅。
网络连接的流程:
- 浏览器委托数据的发送,传递消息的是搬运数字(消息对应着就是数据,数据是0和1组成的);
- 协议栈:给消息打包,添加地址等接着交给网卡最后通过电信号转发出去;
- 通过交换机到达路由器,路由器的后面就是互联网部分,接下来属于网络运营商所需要解决的;
- 由接入网到接入点(接入点后面是互联网的骨*分) 到达web服务器大体需要经过
- web 服务器所在的局域网
- 防火墙
- 缓存服务
- WEB服务
1关于HTTP
1.1 HTTP 消息
① 关于访问web服务器格式:用户名\密码\服务器域名\端口号\文件路径名;
② 端口是识别服务器中要连接服务的编号,即我与那个程序进行连接;
③ 省略默认文件很多比如 index.html 等;
④ 因为不能产生同名的文件/目录,所以在浏览的时候如果没有扩展名默认的先按目录来处理,目录找不到就按文件来查找,文件也查找不到就返回 404;
⑤ 基本思路
- 客户端发送请求消息(URL 和 方法)到服务器;
- 服务器返回状态码到客户端
⑥ 在消息体中,URL是域名的部分,方法是 post
、get
、delete
、head
、trace
等;
⑦ 请求消息格式:
- 第1行是请求行;
<方法> <空> < URL> <空> <HTTP版本>
- 第 2-N 行是消息头;
- 空行;
- 消息体(发送的数据);
⑧ 响应消息格式
- 第一行 状态行;
<HTTP> <状态码> <空> <响应短语>
- 第 2-N 行是消息头;
- 空行;
- 消息体(二进制);
⑨ GET 不能发送几百个字节; 对于表单数据过长时候使用post,表单中的数据存在消息体中
⑩ 服务端响应状态码,第一位表示的是类型 1-5分别表示:
- 告知请求的进度
- 成功
-
200
请求成功
-
- 需要进一步操作
-
304
存在缓存,即本次请求之前已经发生,而且请求的文件也并没有改变
-
- 发生客户端错误
-
404
资源找不到
-
- 发生服务端错误
-
503
服务器不可用
-
1.2 DNS服务器查询web服务的IP地址
① 从客户端到服务端中间有很多个路由,客户端不停地寻找下一个目标地址(根据消息的目的IP地址判断下一个路由器的位置)。
② IPv4 地址的内部结构: 192.168.1.100/24
- 192.168.1.0 代表着整个子网
- 192.168.1.255 代表着广播地址
- 24 代表着子网掩码的个数
③ DNS 为何存在?
- IP 地址相当于电话号码,但实在是太多了不容易记住;
- 那为何不直接把域名当作IP地址。
- 域名十几个字节到 255 个字节,IP 仅有 四个字节
- 域名的长度不固定,但IP 的长度是固定的
④ DNS请求的大体过程
- 浏览器输入 URL;
- 发送到DNS服务器中查询对应的IP;
- 将服务器中查询的结果返回到本地;
- 本地生成消息体委托给操作系统。
⑤ DNS 客户端主要是 DNS 解析器,有提供查询IP的功能;解析器在 Socket 库里,库中有大量的网络组件(发送、接收、解析器等)。
⑥ DNS客户端解析过程
- 调用解析器
- DNS 服务响应
- 返回地址到内存
- 浏览器读取内存
- 将地址和请求消息发送给操作系统
⑦ 那DNS 服务器是怎么知道的? 最开始上网的时候就配置好了。(检测是否配置成功?打不开网页还照样挂着QQ )
⑧ 整体过程:
-
应用程序发送给
Socket
套接字请求操作系统 -
根据内部协议栈到网卡把对应的
host
传递给 DNS Server ,返回IP地址
到网卡 -
网卡到内部协议栈 返给操作系统
-
操作系统返给 Socket
-
Socket 最后给相对应的应用程序。
1.3 域名 DNS 基本服务
大体过程: ① 查找消息;② 从保存的记录中查找;③返回
① 域名对应响应数据类型:
- A
- MX
- PTR
- CNAME
② 域名的层次结构,13个IP地址组成根域名,其下有很多的域。
③ 根据域名寻找IP的时候
-
先找最先接近的DNS服务器;
-
如果没有找到就直接到根域名查找
-
如果还未找到就返回域名的下级域到客户端
-
客户端再次根据返回的新的域IP继续查找,直到找到为止。
每一次找不到的时候不是直接向下级域查找而是先返回到客户端然后客户端再次到指定新的DNS服务器。
1.4 委托协议栈发送消息
① 向操作系统的协议栈中发送消息会调用Socket库中的组件;大体过程是:
- 服务端创建套接字;
- 客户端创建套接字;
- 客户端连接到服务端的套接字;
- 开始进行收发数据;
- 断开管道并且删除套接字。
② 创建套接字阶段,服务端会直接调用网络组件Socket。为了区别不同的套接字,会返回一个描述符到内存中。 此时的大体过程如下:
- 准备 Socket;
- 连接 Connect;
- 发送 write 和接收 read;
- 断开 close
③ 连接所需要的准备:
- 描述符:与本地计算机相关;
- 端口: 与服务端相关;
- IP地址:与网卡有关(一台电脑多个网卡,就有多个IP地址,所以IP地址是与网卡有关,
IP
是网卡的逻辑地址
。MAC
地址是网卡的物理地址
)
④ 通信阶段:客户端与服务端互传数据的阶段。调用 read 和 write 方法。同时把消息保存到缓冲区中。
⑤ 断开阶段:服务器先调用close 方法。(web时默认,客户端主动请求,服务器发送完数据的时候直接关闭,所以最好是一次连接收发请求和响应。)
上一篇: MFC 模拟发送控件消息
下一篇: Unity Http 消息发送与接受