chore: add

This commit is contained in:
FallenYing
2023-10-11 23:24:20 +08:00
parent d5b500e8d9
commit c810fd1647
18 changed files with 277 additions and 264 deletions

View File

@@ -1,12 +1,12 @@
# 9.1计网速通
# 9.1 计网速通
> Author: 柏喵樱
>
>
> copyright reserved
计算机网络是一个非常复杂的系统。在这一章节中,系统的底层实现将被隐去,只留下暴露给用户的内容。
这一章节为 Web 开发入门设计,用于速通 Web 开发和计网的交叉知识,故命名为 “计网速通”。
这一章节为 Web 开发入门设计,用于速通 Web 开发和计网的交叉知识,故命名为“计网速通”。
## IP 地址与端口
@@ -14,15 +14,15 @@
如你所见,上面一串字符表示一个 IP 和端口,他的格式是 `IP:端口`
IP 是一个由小数点分割成四段的序列,每段数字的取值为 $[0,255]$ , 在上面的示例中IP是`1.1.1.1`
IP 是一个由小数点分割成四段的序列,每段数字的取值为 $[0,255]$ , 在上面的示例中IP `1.1.1.1`
而端口是一个数字,取值范围是$[0,65535]$ , 在上面的示例中,端口是`80`
所有在互联网上的计算机都会被分配到一个IP用于标识自己。
所有在互联网上的计算机都会被分配到一个 IP用于标识自己。
现在先抛开具体的实现方式不提,给你一个既定的事实: 互联网能够将数据从一个IP地址传递到另一个任意的IP地址。
现在先抛开具体的实现方式不提,给你一个既定的事实互联网能够将数据从一个 IP 地址传递到另一个任意的 IP 地址。
现在你已经知道了怎样使用互联网传送数据,先不讨论怎么说,**理论上说只需要知道对方的IP给他发数据就可以了**。
现在你已经知道了怎样使用互联网传送数据,先不讨论怎么说,**理论上说只需要知道对方的 IP给他发数据就可以了**。
### 那么端口是干什么用的呢?
@@ -38,33 +38,33 @@ IP 是一个由小数点分割成四段的序列,每段数字的取值为 $[0,
`1.1.1.1:54321 -> 2.2.2.2:12345`
将数据从1.1.1.154321端口发送到2.2.2.212345端口
即,将数据从 1.1.1.154321 端口发送到 2.2.2.212345 端口
可以说这个数据包有以下属性
- 源IP 1.1.1.1
- IP 1.1.1.1
- 源端口 54321
- 目的IP 2.2.2.2
- 目的 IP 2.2.2.2
- 目的端口 12345
## TCP 与 UDP
TCP 和 UDP 两个协议的具体实现都是由操作系统提供的应用程序发送TCP包和UDP包一般都是使用操作系统的API发送的所以我们无需关系这两个协议的具体实现细节。
TCP 和 UDP 两个协议的具体实现都是由操作系统提供的,应用程序发送 TCP 包和 UDP 包一般都是使用操作系统的 API 发送的,所以我们无需关系这两个协议的具体实现细节。
下面通过表格对比两个协议来告诉大家如何选择去使用哪一个协议。
||TCP|UDP|
|---|---|---|
|可靠性|有|无|
|速度|慢|快|
|可靠性 | 有 | 无 |
|速度 | 慢 | 快|
表格很小,但是最本质的区别就是这些了。
TCP的最大特点就是**可靠交付**他有一个ACK确认机制简单来说就是对于发送的数据如果没有收到对方的ACK确认收到他会不断尝试重发直到他认为无法送达。
TCP 的最大特点就是**可靠交付**,他有一个 ACK 确认机制,简单来说就是对于发送的数据,如果没有收到对方的 ACK 确认收到,他会不断尝试重发,直到他认为无法送达。
UDPTCP虽然经常一起被提起也确实属于互联网的同一个层但从他们的复杂度看他们并不是两个对等的协议。比起TCP有一套非常复杂的算法实现可靠交付流量控制等协议UDP真的就是单纯发了一个数据包过去然后什么也不管。
UDPTCP 虽然经常一起被提起,也确实属于互联网的同一个层,但从他们的复杂度看,他们并不是两个对等的协议。比起 TCP 有一套非常复杂的算法实现可靠交付流量控制等协议UDP 真的就是单纯发了一个数据包过去,然后什么也不管。
不过不用担心大家也没多少机会直接接触这两个协议还是接触HTTP居多。如果真的需要做出选择除非你知道你在做什么选TCP。
不过不用担心,大家也没多少机会直接接触这两个协议,还是接触 HTTP 居多。如果真的需要做出选择,除非你知道你在做什么,选 TCP。
现在,你应该知道,虽然你不知道具体怎么做,但是从理论上说,你可以选择其中一种协议发送数据到另一台联网的计算机的某个端口上。
@@ -78,7 +78,7 @@ DNS(Domain Name System) 域名系统
对于日常使用,如果我要打开一个网页,我会选择使用比如`bilibili.com`这样的东西,这一串字符叫做**域名**
域名的最直观用途是代替你记忆 IP 地址,当你访问 `bilibili.com` 这个网址的时候一般首先会调用操作系统API操作系统会代替你发送域名解析请求到 DNS 服务器最后DNS服务器会返回给你域名对应的IP地址。
域名的最直观用途是代替你记忆 IP 地址,当你访问 `bilibili.com` 这个网址的时候,一般首先会调用操作系统 API操作系统会代替你发送域名解析请求到 DNS 服务器,最后 DNS 服务器会返回给你域名对应的 IP 地址。
其实你也可以拥有自己的域名这很简单。如果你要搭建你自己的网站,购买域名是逃不掉的,在国内的话还需要备案。
@@ -86,9 +86,9 @@ DNS(Domain Name System) 域名系统
如上图所示,一个域名有很多不同的解析类型,但是目前你只需要知道 A 记录是什么。
A 记录是目前互联网上最主要的记录类型,他的记录值是一个 IPv4 地址就是上述的IPv4是版本号
A 记录是目前互联网上最主要的记录类型,他的记录值是一个 IPv4 地址(就是上述的 IPv4 是版本号)。
举个例子,域名`aaa.bbb.cn`做 A 解析到 `1.1.1.1`,我们需要设置:
举个例子,域名`aaa.bbb.cn`做 A 解析到 `1.1.1.1`,我们需要设置
- 主机记录 aaa
- 记录类型 A
@@ -99,16 +99,15 @@ A 记录是目前互联网上最主要的记录类型,他的记录值是一个
## HTTP
HTTP 协议用于 WEB 服务器,一般多见于浏览器获取网页内容。浏览器会用 HTTP 协议发送 HTTP 请求到服务器,服务器处理 HTTP 请求并返回 HTTP 响应。很多的APP小程序和电脑上的应用程序都在广泛地使用HTTP
HTTP 协议用于 WEB 服务器,一般多见于浏览器获取网页内容。浏览器会用 HTTP 协议发送 HTTP 请求到服务器,服务器处理 HTTP 请求并返回 HTTP 响应。很多的 APP小程序和电脑上的应用程序都在广泛地使用 HTTP
HTTP 协议有不少版本,现在互联网上最流行的是 HTTP/1.1 版本,浏览器一般最高支持 HTTP/2.0,最新版本是 HTTP/3.0,下面只讨论 HTTP/1.1
HTTP 的底层是 TCP ,他基于此规定了一套文本格式,用于表达一些信息
HTTP 的底层是 TCP他基于此规定了一套文本格式用于表达一些信息
单纯说说是说不明白的HTTP 报文分请求和响应两种格式,下面给出实例
> 如果你有兴趣做 HTTP 抓包,推荐用 Yakit 本人实习正在做这个产品也欢迎反馈bug
> 如果你有兴趣做 HTTP 抓包,推荐用 Yakit本人实习正在做这个产品也欢迎反馈 bug
### 请求
@@ -151,13 +150,13 @@ start_ts=1690809334&mid=74145050&aid=998480789&cid=1195467370&type=3&sub_type=0&
分别对应查,增,改,删四个动作,这四个动作统称增删查改,英文 CRUDCreate Read Update Delete
其中,一般来说 GET 和 DELETE 两个请求方法是不带负载(后面有讲什么是负载)的,但这也不是硬性规定。
其中,一般来说 GET 和 DELETE 两个请求方法是不带负载 (后面有讲什么是负载) 的,但这也不是硬性规定。
如果你从浏览器地址栏打开一个网页,那么他首先会向对面服务器发送一个 GET 请求而其他类型的请求往往是网页加载过程中js脚本向服务器获取数据所带来的的。
如果你从浏览器地址栏打开一个网页,那么他首先会向对面服务器发送一个 GET 请求,而其他类型的请求往往是网页加载过程中 js 脚本向服务器获取数据所带来的的。
#### 请求路径 HTTP版本号
#### 请求路径 HTTP 版本号
早期的 Web 服务器采用纯静态+文件目录结构,这其实相当于说暴露一个文件夹在互联网上,然后大家使用文件路径获取这个文件夹中的一个特定的文件。
早期的 Web 服务器采用纯静态 + 文件目录结构,这其实相当于说暴露一个文件夹在互联网上,然后大家使用文件路径获取这个文件夹中的一个特定的文件。
这个格式一直以来都得到了沿用,现代的路径早已经失去了这个固定意义,成为了一种分类和标识。
@@ -165,19 +164,19 @@ start_ts=1690809334&mid=74145050&aid=998480789&cid=1195467370&type=3&sub_type=0&
`/shell?cmd=ls&a=b`
这种写法只是一种所有人都遵循的格式,这样的路径带2个参数,第一个名字叫`cmd`,参数的值是`ls`,第二个名字叫`a`,参数的值是`b`。
这种写法只是一种所有人都遵循的格式,这样的路径带 2 个参数,第一个名字叫`cmd`,参数的值是`ls`,第二个名字叫`a`,参数的值是`b`。
如果出现字符冲突,比如你需要一个参数值为`&`的参数可以使用URL编码写成`%26`,这是`%+16进制ascii码`的格式。
如果出现字符冲突,比如你需要一个参数值为`&`的参数,可以使用 URL 编码,写成`%26`,这是`%+16进制ascii码`的格式。
这一行最后跟一个 HTTP 版本号
#### 请求头header
紧接着的是请求头,其固定格式为`Key: Value`
紧接着的是请求头,其固定格式为`Key: Value`
一行一个请求头,不同的请求头有不用的用途,广泛认可的请求头有
- Host 主机名,也就是域名如果使用IP访问这里会写成IP
- Host 主机名也就是域名,如果使用 IP 访问,这里会写成 IP
- Content-Type 表示 Payload 的内容格式
- User-Agent 发 HTTP 包的人用的浏览器类型和版本号
- Cookie 用于存储认证信息等,由服务器设置,浏览器每次请求都会携带
@@ -188,9 +187,9 @@ start_ts=1690809334&mid=74145050&aid=998480789&cid=1195467370&type=3&sub_type=0&
#### 负载payload
上面的实例是一个 application/x-www-form-urlencoded 类型的 payload ,这由 Content-Type 规定。他的格式和请求参数是一致的。
上面的实例是一个 application/x-www-form-urlencoded 类型的 payload这由 Content-Type 规定。他的格式和请求参数是一致的。
负载还有很多种不同的格式,比如 jsonxmlform-data Web开发那一块应该会讲这里就不提了。
负载还有很多种不同的格式,比如 jsonxmlform-data Web 开发那一块应该会讲,这里就不提了。
### 响应
@@ -242,15 +241,15 @@ Content-Length: 51
其他和请求头基本一致不做讲解
#### 负载(payload)
#### 负载 (payload)
这是一个 json 格式的负载,具体参考 Web开发章节
这是一个 json 格式的负载,具体参考 Web 开发章节
## TLS
现在大多数的网址都会使用 HTTPS 协议而不是 HTTP其区别在于HTTP 是把上面提到的报文直接放在 TCP 里传输此时如果有人抓包获取了你的报文他是可以看到完整内容的。为了安全TLS诞生了。
现在大多数的网址都会使用 HTTPS 协议而不是 HTTP其区别在于HTTP 是把上面提到的报文直接放在 TCP 里传输此时如果有人抓包获取了你的报文他是可以看到完整内容的。为了安全TLS 诞生了。
HTTPS 的本质就是在将 HTTP 报文通过 TLS 进行发送而不是直接通过TCP发送。
HTTPS 的本质就是在将 HTTP 报文通过 TLS 进行发送,而不是直接通过 TCP 发送。
TLS 建立在 TCP 的基础上,他会通过加密来确保传输过程中数据的安全。
@@ -274,14 +273,14 @@ TLS 建立在 TCP 的基础上,他会通过加密来确保传输过程中数
| POP3 | 110 | TCP |
| HTTPS | 443 | TCP |
| Mysql | 3306 | TCP |
| RDP | 3389 | 默认UDP |
| RDP | 3389 | 默认 UDP |
| Redis | 6379 | TCP |
## 公网与内网 --- 真实环境分析
基本的内容介绍的差不多了,下面分析一个简单的网络案例,顺带介绍公网和内网的概念。
相信在看这篇文章的大家都正在使用互联网如果你正在使用windows设备你可以先按 `win`+`R` ,输入 `cmd`,在弹出的窗口输入 `ipconfig` 你可以看到里面有一串类似于下文的内容:
相信在看这篇文章的大家都正在使用互联网,如果你正在使用 windows 设备,你可以先按 `win`+`R` ,输入 `cmd`,在弹出的窗口输入 `ipconfig` 你可以看到里面有一串类似于下文的内容:
```powershell
无线局域网适配器 WLAN:
@@ -309,15 +308,15 @@ IPv4 地址一栏有一个形似 `192.168.XXX.XXX`的地址,这是一个典型
- 家庭和寝室网络子网掩码默认 `255.255.255.0`
- 默认网关是路由器在内网的 IP你的设备需要路由器的帮助将数据包从内网转发到公网
此刻你可能会有一个疑问作为一台联网的计算机设备我可以把数据发送到公网的服务器上因为我知道他的公网IP而且这是独一无二的只要我联网互联网上的路由设备会尽力帮我把数据送到地方。
此刻你可能会有一个疑问,作为一台联网的计算机设备,我可以把数据发送到公网的服务器上,因为我知道他的公网 IP而且这是独一无二的只要我联网互联网上的路由设备会尽力帮我把数据送到地方。
### 但是,返回的数据该怎么办?
显然,对面不可能把数据包发给一个内网地址,他只有发给一个公网地址,互联网上的路由设备才知道他要去哪,才能帮他将数据送到地方。
问题的答案很简单,我们的路由器,他通过 PPPoE 拨号的方式向运营商拿到了一个公网IP。他在把数据包转发到互联网上前做了一个网络地址转换的操作把数据包的源地址替换成了他的公网IP再找了一个随机端口号在那里将修改后的数据发送到公网**这个转换的操作会被路由器记录**。
问题的答案很简单,我们的路由器,他通过 PPPoE 拨号的方式向运营商拿到了一个公网 IP。他在把数据包转发到互联网上前做了一个网络地址转换的操作把数据包的源地址替换成了他的公网 IP再找了一个随机端口号在那里将修改后的数据发送到公网**这个转换的操作会被路由器记录**。
这样公网上的服务器在收到数据包后也能知道这个包来自于哪个公网IP的哪个端口回复的时候就知道发到什么地方了。
这样,公网上的服务器在收到数据包后也能知道,这个包来自于哪个公网 IP 的哪个端口,回复的时候就知道发到什么地方了。
路由器拿到公网上的服务器回复的数据包后,可以根据做网络地址转换时的记录,逆向推导出他应该将包发送到内网的哪台机器的哪个端口,就完成了数据的收发。
@@ -330,7 +329,7 @@ IPv4 地址一栏有一个形似 `192.168.XXX.XXX`的地址,这是一个典型
- 安全,只有你主动连接才能拿到回复,互联网上的设备无法主动访问你的设备
- IPv4 不够用啦
### 其他特殊IP地址
### 其他特殊 IP 地址
- 127.0.0.1 本机,用于自己的设备给自己的设备另一个端口发送数据
- 169.254.x.x 保留地址,向路由器获取内网地址前会临时使用这个地址,如果你发现你的电脑正在使用这个地址,路由器可能坏了