|
| 1 | +# 《网络是怎么连接的》总结 |
| 2 | + |
| 3 | +书中从输入网址到显示页面信息这个一个流程做了很细节的分析,先列一个提纲: |
| 4 | + |
| 5 | +- 客户端 |
| 6 | + - 浏览器 |
| 7 | + - socket 库 |
| 8 | + - tcp 协议栈 |
| 9 | + - ip 协议栈 |
| 10 | + - 网卡 |
| 11 | +- 客户端局域网 |
| 12 | + - 双绞线 |
| 13 | + - 集线器 |
| 14 | + - 交换机 |
| 15 | + - 路由器 |
| 16 | +- 运营商网络 |
| 17 | + - 待总结 |
| 18 | +- 服务器 |
| 19 | + - 防火墙 |
| 20 | + - 缓存服务器 |
| 21 | + - 网卡 |
| 22 | + - ip 协议栈 |
| 23 | + - tcp 协议栈 |
| 24 | + - socket 库 |
| 25 | + - web 服务器 |
| 26 | + |
| 27 | +## 客户端 |
| 28 | + |
| 29 | +客户端发起一个请求,会经过一下几个过程: |
| 30 | + |
| 31 | +- 解析 url ,获取需要请求的文件。 |
| 32 | +- dns 解析域名,获取 ip 地址(从跟域名开始查找,例如:a.b.com,先找 com,再找 b,再找 a)。 |
| 33 | +- 浏览器生成 http 消息,并转交给 socket 库。 |
| 34 | +- **进入 tcp 协议栈** |
| 35 | + - 创建 tcp 头(包括发送方,接收方端口号,ip 等信息)。 |
| 36 | + - 根据 tcp 头部信息,找到需要连接的套接字。 |
| 37 | + - 连接套接字(3 次握手)。 |
| 38 | + - 将大的数据包拆分成小的数据包。 |
| 39 | + - 通过传递 ACK 和序号,验证双方收到的信息是否可靠。 |
| 40 | + - **滑动窗口**,管理 ACK,协商服务器端处理能力。(每一次请求都会返回服务器端剩余的带宽,当服务器带宽很小时,发送方也会减慢上传数据)。 |
| 41 | + - 每一个请求响应都会返回服务带宽和 ACK,如果请求很快,则会传输大量的验证信息,tcp 会进行合并处理(即:每次发送带宽信息时,会等待一段时间,如果时间内有其他的链接占用了带宽,也会合并后,发送给客户端)。 |
| 42 | + - **拥塞处理**,慢开始算法,拥塞避免算法等,在传输开始时将发送窗口慢慢指数级扩大。(避免网络负载过大)。 |
| 43 | +- **进入 ip 协议栈** |
| 44 | + - 根据服务器 ip,包裹 ip 头部。 |
| 45 | + - 根据网卡的唯一 mac 地址,包裹 mac 头部。 |
| 46 | +- **进入网卡** |
| 47 | + - 收到 ip 包裹的包,检查以太网可发送状态。 |
| 48 | + - 将数据信号的包转换成电信号,通过双绞线发送出去。 |
| 49 | + |
| 50 | +## 客户端局域网 |
| 51 | + |
| 52 | +- 信号通过**双绞线**,到达集线器。 |
| 53 | + - 双绞线的作用是为了抑制噪音,防止其他信号干扰。 |
| 54 | +- **集线器**将信号广播到所有端口,这样信号便能到达交换机。 |
| 55 | + - 集线器:将一些机器连接起来组成一个局域网。(OSI 第一层,物理层) |
| 56 | +- **交换机** |
| 57 | + - 交换机又叫交换式集线器:根据 mac 地址表,查找 mac 地址,然后将信号发送到 mac 地址上(**mac 地址对应的就是路由器**)。 |
| 58 | +- **路由器** |
| 59 | + - 根据收到的包的接收方 ip 地址查询自身的路由表找到输出端口,并将包转发到输出端口(可能是目的地,也可能是下一个路由器)。 |
| 60 | + - 地址转换,可以在转发时,对 ip 和端口号进行改写(解决公网 ip 有限问题) |
| 61 | + - 包过滤,可以根据 mac 头,ip 头等,选择转发 or 丢弃包。 |
| 62 | + |
| 63 | +::: tip 路由器和交换机的关系 |
| 64 | + |
| 65 | +路由器:将 ip 转发到目标地址的过程。 |
| 66 | + |
| 67 | +交换机:将包传给下一个路由器时,需要交换机转发。 |
| 68 | + |
| 69 | +路由器是在 ip 层,而交换机在 mac 层。当进行数据传递时,会经过 mac 层,在到 ip 层,如果当前 ip 没有找到目标地址,则会被转发到下一个路由器,仍然是先通过 mac 层,再到 ip 层,直到找到为止。 |
| 70 | + |
| 71 | +::: |
| 72 | + |
| 73 | +## 运营商网络 |
| 74 | + |
| 75 | +这一部分设计到了很多硬件知识,我也没有完全理解,以后待完善。 |
| 76 | + |
| 77 | +## 服务器 |
| 78 | + |
| 79 | +- **防火墙**,对进入的包进行检查,判断是否允许通过。 |
| 80 | + - 通过接收方 ip 地址和发送方 ip 地址,进行过滤。 |
| 81 | + - 通过接收方端口号和发送方的端口号,进行过滤。 |
| 82 | + - 通过三次握手的方向,控制单向连接,例如只允许 web 端->服务器,或者只允许服务器->web 端发起请求。 |
| 83 | + - 控制内网 ip,禁止指定 ip 不能访问外网。 |
| 84 | + - 控制外网 ip,禁止指定 ip 外网不能访问内网。 |
| 85 | +- **缓存服务器**,如果用户请求的页面已经缓存在服务器上,则代替服务器想用户返回页面数据。 |
| 86 | +- **网卡**将电信号,转换成数字信息,交给协议栈。 |
| 87 | +- **ip 协议栈** |
| 88 | + - 判断是不是发给自己的包。 |
| 89 | + - 判断网络包是否经过分片。 |
| 90 | + - 检查 ip 头部,取出对应的 tcp 数据包。并转交给 tcp 模块。 |
| 91 | +- **tcp 协议栈** |
| 92 | + - 根据收到的包的发送方 ip 地址,发送方端口号,接收方 ip 地址,接收方端口号找到相应的套接字。 |
| 93 | + - 根据 tcp 头部,取出对应的 http 数据包。 |
| 94 | + - 将数据拼合起来并保存在接收缓冲区中。 |
| 95 | +- 通过 socket 库将原始的 http 数据包转交给 web 服务器。 |
| 96 | +- web 服务器分析 http 消息的内容。 |
| 97 | + - 读取 url,转换为实际文件名。 |
| 98 | + - 检查文件访问控制,确保有权限访问文件。 |
| 99 | + - 将文件经过处理后,返回给客户端。 |
| 100 | + - 客户端根据 content-type 字段来渲染不同的内容。 |
0 commit comments