chore: add
This commit is contained in:
@@ -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.1的54321端口发送到2.2.2.2的12345端口
|
||||
即,将数据从 1.1.1.1 的 54321 端口发送到 2.2.2.2 的 12345 端口
|
||||
|
||||
可以说这个数据包有以下属性
|
||||
|
||||
- 源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 确认收到,他会不断尝试重发,直到他认为无法送达。
|
||||
|
||||
UDP和TCP虽然经常一起被提起,也确实属于互联网的同一个层,但从他们的复杂度看,他们并不是两个对等的协议。比起TCP有一套非常复杂的算法实现可靠交付流量控制等协议,UDP真的就是单纯发了一个数据包过去,然后什么也不管。
|
||||
UDP 和 TCP 虽然经常一起被提起,也确实属于互联网的同一个层,但从他们的复杂度看,他们并不是两个对等的协议。比起 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 地址(就是上述的IP,v4是版本号)。
|
||||
A 记录是目前互联网上最主要的记录类型,他的记录值是一个 IPv4 地址(就是上述的 IP,v4 是版本号)。
|
||||
|
||||
举个例子,域名`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&
|
||||
|
||||
分别对应查,增,改,删四个动作,这四个动作统称增删查改,英文 CRUD(Create 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 规定。他的格式和请求参数是一致的。
|
||||
|
||||
负载还有很多种不同的格式,比如 json,xml,form-data Web开发那一块应该会讲,这里就不提了。
|
||||
负载还有很多种不同的格式,比如 json,xml,form-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 保留地址,向路由器获取内网地址前会临时使用这个地址,如果你发现你的电脑正在使用这个地址,路由器可能坏了
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# IP协议
|
||||
# IP 协议
|
||||
|
||||
> Author: 柏喵樱
|
||||
>
|
||||
>
|
||||
> copyright reserved
|
||||
|
||||
## IP 协议数据包结构
|
||||
|
||||
IP 协议是网络层最主要的协议,几乎所有的上层数据包都需要IP协议的承载,我们网络层的第一块内容将从 IP 协议讲起。
|
||||
IP 协议是网络层最主要的协议,几乎所有的上层数据包都需要 IP 协议的承载,我们网络层的第一块内容将从 IP 协议讲起。
|
||||
|
||||
下图展示了 IP 协议的报文头部格式,这张图每行代表 32 个 bit,也就是 4 个字节(byte)。如果不计算 Options 这种可选项的话,IP 协议的报头长度为 20 个字节。
|
||||
|
||||
@@ -30,13 +30,14 @@ IP 协议是网络层最主要的协议,几乎所有的上层数据包都需
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
Example Internet Datagram Header
|
||||
</pre>
|
||||
|
||||
## 版本
|
||||
|
||||
第一个字段是IP协议版本号,用于标识IPv4和IPv6两个版本,这两个版本的报文格式是不同的。上图展示的是 IPv4 的报文格式
|
||||
第一个字段是 IP 协议版本号,用于标识 IPv4 和 IPv6 两个版本,这两个版本的报文格式是不同的。上图展示的是 IPv4 的报文格式
|
||||
|
||||
## IHL(Internet Header Length)
|
||||
## IHL (Internet Header Length)
|
||||
|
||||
就是IP协议的头部部分的长度,单位是 4byte,由于 IP 头一般长度为 20byte,所以这个值一般为 5。如果存在Options字段,这个值会相应增加。
|
||||
就是 IP 协议的头部部分的长度,单位是 4byte,由于 IP 头一般长度为 20byte,所以这个值一般为 5。如果存在 Options 字段,这个值会相应增加。
|
||||
|
||||
## Type of Service
|
||||
|
||||
@@ -46,7 +47,7 @@ IP 协议是网络层最主要的协议,几乎所有的上层数据包都需
|
||||
|
||||
Total Length 很好理解就是包括 IP 头在内的 IP 报文的总长度,报文长度上限就是 MTU。
|
||||
|
||||
## Identification & Flags & Fragment Offset
|
||||
## Identification & Flags & Fragment Offset
|
||||
|
||||
这三个字段放在一起讲,他们都是用于控制分片的。
|
||||
|
||||
@@ -61,17 +62,17 @@ Total Length 很好理解就是包括 IP 头在内的 IP 报文的总长度,
|
||||
|
||||
对于第二个问题,引入了 Fragment Offset(分片偏移量),他的单位是 byte,用于标识这一个分片的数据,是从原来超长负载的哪个位置开始的。比如对于一个长度为 5000 bytes 的负载,他的几个分片的 Fragment Offset 依次为 0,1480,2960,4440。在收到数据后,服务器只需要按照这个字段重新组装即可。
|
||||
|
||||
对于第一个问题,引入了 Flags(标志位), Flags 里有三个 Flag,其中最后一位的意义是“后面还有更多分片“,这就相当于告诉服务器,你要继续等待接收其他分片。而当最后的分片抵达时,服务器在知道这是最后的分片的同时,他也能从这个分片的 Fragment Offset里得知前面应该有多少数据,如果缺失,服务器也能继续等待接收。
|
||||
对于第一个问题,引入了 Flags(标志位), Flags 里有三个 Flag,其中最后一位的意义是“后面还有更多分片“,这就相当于告诉服务器,你要继续等待接收其他分片。而当最后的分片抵达时,服务器在知道这是最后的分片的同时,他也能从这个分片的 Fragment Offset 里得知前面应该有多少数据,如果缺失,服务器也能继续等待接收。
|
||||
|
||||
关于Flags的其他两位,最高位是目前保留不使用,永远为0。后面那位的意义是不要分片,这一般是不设置的,他这句话是对传输过程中的路由设备讲的,因为如果途径 MTU 低于当前包长度的链路可能会进行二次分片。如果设置了这个 Flag,转发时再碰到 MTU 低的链路这种包会被直接丢弃同时返回一个 ICMP 包告诉源IP地址的设备发生了什么。
|
||||
关于 Flags 的其他两位,最高位是目前保留不使用,永远为 0。后面那位的意义是不要分片,这一般是不设置的,他这句话是对传输过程中的路由设备讲的,因为如果途径 MTU 低于当前包长度的链路可能会进行二次分片。如果设置了这个 Flag,转发时再碰到 MTU 低的链路这种包会被直接丢弃同时返回一个 ICMP 包告诉源 IP 地址的设备发生了什么。
|
||||
|
||||
## TTL(Time To Live)
|
||||
|
||||
TTL 是一个unsigned int,代表数据包的剩余生存时间,指的是数据包在互联网中还能转发多少时间,单位是秒。
|
||||
TTL 是一个 unsigned int,代表数据包的剩余生存时间,指的是数据包在互联网中还能转发多少时间,单位是秒。
|
||||
|
||||
虽然单位是秒,但是一般情况下转发耗时是远远低于一秒的,根据 IP 协议的规定,无论转发耗时多少,TTL 应当至少 -1,所以在实践中 TTL 往往指的是转发了几次。
|
||||
|
||||
一般发往互联网的数据包初始 TTL 为 64 或 128,你可以试试 ping 命令,他会显示一个TTL,这是对面服务器回复的包到自己的设备的时候的 TTL。
|
||||
一般发往互联网的数据包初始 TTL 为 64 或 128,你可以试试 ping 命令,他会显示一个 TTL,这是对面服务器回复的包到自己的设备的时候的 TTL。
|
||||
|
||||
```powershell
|
||||
PS C:\Users\bs> ping baidu.com
|
||||
@@ -107,7 +108,7 @@ PS C:\Users\bs> ping baidu.com -i 2
|
||||
|
||||
traceroute 就是利用这个性质来实现的,通过从 0 开始遍历 TTL 的方式,可以拿到转发过程中的所有路由器的 ICMP 回复,从这些回复中可以读取到这些路由器的 IP。
|
||||
|
||||
当然 traceroute 不是万能的,真实互联网中广泛存在拦截,不响应 ,改写等等行为,会导致 traceroute 产生丢失或者藏跳等等比较迷惑的结果。
|
||||
当然 traceroute 不是万能的,真实互联网中广泛存在拦截,不响应,改写等等行为,会导致 traceroute 产生丢失或者藏跳等等比较迷惑的结果。
|
||||
|
||||
```powershell
|
||||
PS C:\Users\bs> TRACERT.EXE bilibili.com
|
||||
@@ -164,8 +165,7 @@ PS C:\Users\bs> TRACERT.EXE bilibili.com
|
||||
|
||||
注意,由于 TTL 在每次转发中都会改变,所以实际上,每次转发都会重新计算校验和。
|
||||
|
||||
|
||||
## IP地址
|
||||
## IP 地址
|
||||
|
||||
正如上图的 `Source Address` 和 `Destination Address` 字段所展示的一样,一个 IP 地址占用 4 byte 的存储空间。在书面的写法上,我们用 `.` 将每一个 byte 分割开,例如 `1.1.1.1` 这样更便于人类处理和分类。
|
||||
|
||||
@@ -177,9 +177,8 @@ PS C:\Users\bs> TRACERT.EXE bilibili.com
|
||||
|
||||
可选参数(Options)比较繁琐,一般没啥用,有兴趣的可以看看下面参考资料中 RFC 791 对此的描述。
|
||||
|
||||
|
||||
## 参考资料
|
||||
|
||||
- [RFC 791 - Internet Protocol (ietf.org)](https://datatracker.ietf.org/doc/html/rfc791)
|
||||
- [Reserved IP addresses - Wikipedia](https://en.wikipedia.org/wiki/Reserved_IP_addresses)
|
||||
- [List of IP protocol numbers - Wikipedia](https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers)
|
||||
- [List of IP protocol numbers - Wikipedia](https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
你只需要知道一件事 —— IP 头里有一对 IP 地址,分别分别代表这个数据包从哪里来,到哪里去。
|
||||
|
||||
在组成一个比较大的网络前,我们需要给一个个孤立的IP地址分类。给 IP 分类可以让维护路由表变得更简单,CIDR(无类域间路由)是一种非常良好的分类方法。
|
||||
在组成一个比较大的网络前,我们需要给一个个孤立的 IP 地址分类。给 IP 分类可以让维护路由表变得更简单,CIDR(无类域间路由)是一种非常良好的分类方法。
|
||||
|
||||
## CIDR
|
||||
|
||||
@@ -70,31 +70,31 @@ baimeow@server:~$ ip addr
|
||||
|
||||
严格意义上说,上面提到的子网一部分应该改称呼为网段,简单起见不细究了。
|
||||
|
||||
## 常见保留IP
|
||||
## 常见保留 IP
|
||||
|
||||
了解一下常见的保留IP吧,这些保留 IP 不会出现在公网,而是被用于其他特殊用途。
|
||||
了解一下常见的保留 IP 吧,这些保留 IP 不会出现在公网,而是被用于其他特殊用途。
|
||||
|
||||
让我抄一下Wiki的表格。
|
||||
让我抄一下 Wiki 的表格。
|
||||
|
||||
| 地址块 ([CIDR](https://zh.wikipedia.org/wiki/无类别域间路由)) | 范围 | 地址数 | 效用域 | 用途 |
|
||||
| :----------------------------------------------------------: | :---------------------------: | :---------: | :------: | :----------------------------------------------------------: |
|
||||
| 0.0.0.0/8 | 0.0.0.0 – 0.255.255.255 | 16,777,216 | 软件 | 用于广播信息到当前主机。[[1\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-1) |
|
||||
| 10.0.0.0/8 | 10.0.0.0 – 10.255.255.255 | 16,777,216 | 专用网络 | 用于[专用网络](https://zh.wikipedia.org/wiki/专用网络)中的本地通信。[[2\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc1918-2) |
|
||||
| 100.64.0.0/10 | 100.64.0.0 – 100.127.255.255 | 4,194,304 | 专用网络 | 用于在[电信级NAT](https://zh.wikipedia.org/wiki/电信级NAT)环境中服务提供商与其用户通信。[[3\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-3) |
|
||||
| 127.0.0.0/8 | 127.0.0.0 – 127.255.255.255 | 16,777,216 | 主机 | 用于到本地主机的[环回地址](https://zh.wikipedia.org/wiki/IPv4#环回地址(Loopback_Address))。[[4\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-4) |
|
||||
| 169.254.0.0/16 | 169.254.0.0 – 169.254.255.255 | 65,536 | 链路 | 用于单链路的两个主机之间的[链路本地地址](https://zh.wikipedia.org/wiki/链路本地地址),而没有另外指定IP地址,例如通常从[DHCP](https://zh.wikipedia.org/wiki/动态主机设置协议)服务器所检索到的IP地址。[[5\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-5) |
|
||||
| 172.16.0.0/12 | 172.16.0.0 – 172.31.255.255 | 1,048,576 | 专用网络 | 用于[专用网络](https://zh.wikipedia.org/wiki/专用网络)中的本地通信。[[2\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc1918-2) |
|
||||
| 192.0.0.0/24 | 192.0.0.0 – 192.0.0.255 | 256 | 专用网络 | 用于IANA的IPv4特殊用途地址表。[[6\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc5736-6) |
|
||||
| 192.0.2.0/24 | 192.0.2.0 – 192.0.2.255 | 256 | 文档 | 分配为用于文档和示例中的“TEST-NET”(测试网),它不应该被公开使用。[[7\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc5737-7) |
|
||||
| 192.88.99.0/24 | 192.88.99.0 – 192.88.99.255 | 256 | 互联网 | 用于[6to4](https://zh.wikipedia.org/wiki/6to4)[任播](https://zh.wikipedia.org/wiki/任播)中继。[[8\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-8)(已废弃[[9\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc7526-9)) |
|
||||
| 192.168.0.0/16 | 192.168.0.0 – 192.168.255.255 | 65,536 | 专用网络 | 用于[专用网络](https://zh.wikipedia.org/wiki/专用网络)中的本地通信。[[2\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc1918-2) |
|
||||
| 198.18.0.0/15 | 198.18.0.0 – 198.19.255.255 | 131,072 | 专用网络 | 用于测试两个不同的子网的网间通信。[[10\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-10) |
|
||||
| 198.51.100.0/24 | 198.51.100.0 – 198.51.100.255 | 256 | 文档 | 分配为用于文档和示例中的“TEST-NET-2”(测试-网-2),它不应该被公开使用。[[7\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc5737-7) |
|
||||
| 203.0.113.0/24 | 203.0.113.0 – 203.0.113.255 | 256 | 文档 | 分配为用于文档和示例中的“TEST-NET-3”(测试-网-3),它不应该被公开使用。[[7\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc5737-7) |
|
||||
| 224.0.0.0/4 | 224.0.0.0 – 239.255.255.255 | 268,435,456 | 互联网 | 用于多播。[[11\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc1112-11) |
|
||||
| 0.0.0.0/8 | 0.0.0.0 – 0.255.255.255 | 16,777,216 | 软件 | 用于广播信息到当前主机。[[1]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-1) |
|
||||
| 10.0.0.0/8 | 10.0.0.0 – 10.255.255.255 | 16,777,216 | 专用网络 | 用于[专用网络](https://zh.wikipedia.org/wiki/专用网络)中的本地通信。[[2]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc1918-2) |
|
||||
| 100.64.0.0/10 | 100.64.0.0 – 100.127.255.255 | 4,194,304 | 专用网络 | 用于在[电信级 NAT](https://zh.wikipedia.org/wiki/电信级NAT)环境中服务提供商与其用户通信。[[3]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-3) |
|
||||
| 127.0.0.0/8 | 127.0.0.0 – 127.255.255.255 | 16,777,216 | 主机 | 用于到本地主机的[环回地址](https://zh.wikipedia.org/wiki/IPv4#环回地址(Loopback_Address))。[[4]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-4) |
|
||||
| 169.254.0.0/16 | 169.254.0.0 – 169.254.255.255 | 65,536 | 链路 | 用于单链路的两个主机之间的[链路本地地址](https://zh.wikipedia.org/wiki/链路本地地址),而没有另外指定 IP 地址,例如通常从[DHCP](https://zh.wikipedia.org/wiki/动态主机设置协议)服务器所检索到的 IP 地址。[[5]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-5) |
|
||||
| 172.16.0.0/12 | 172.16.0.0 – 172.31.255.255 | 1,048,576 | 专用网络 | 用于[专用网络](https://zh.wikipedia.org/wiki/专用网络)中的本地通信。[[2]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc1918-2) |
|
||||
| 192.0.0.0/24 | 192.0.0.0 – 192.0.0.255 | 256 | 专用网络 | 用于 IANA 的 IPv4 特殊用途地址表。[[6]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc5736-6) |
|
||||
| 192.0.2.0/24 | 192.0.2.0 – 192.0.2.255 | 256 | 文档 | 分配为用于文档和示例中的“TEST-NET”(测试网),它不应该被公开使用。[[7]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc5737-7) |
|
||||
| 192.88.99.0/24 | 192.88.99.0 – 192.88.99.255 | 256 | 互联网 | 用于[6to4](https://zh.wikipedia.org/wiki/6to4)[任播](https://zh.wikipedia.org/wiki/任播)中继。[[8]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-8)(已废弃[[9]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc7526-9)) |
|
||||
| 192.168.0.0/16 | 192.168.0.0 – 192.168.255.255 | 65,536 | 专用网络 | 用于[专用网络](https://zh.wikipedia.org/wiki/专用网络)中的本地通信。[[2]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc1918-2) |
|
||||
| 198.18.0.0/15 | 198.18.0.0 – 198.19.255.255 | 131,072 | 专用网络 | 用于测试两个不同的子网的网间通信。[[10]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-10) |
|
||||
| 198.51.100.0/24 | 198.51.100.0 – 198.51.100.255 | 256 | 文档 | 分配为用于文档和示例中的“TEST-NET-2”(测试 - 网 -2),它不应该被公开使用。[[7]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc5737-7) |
|
||||
| 203.0.113.0/24 | 203.0.113.0 – 203.0.113.255 | 256 | 文档 | 分配为用于文档和示例中的“TEST-NET-3”(测试 - 网 -3),它不应该被公开使用。[[7]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc5737-7) |
|
||||
| 224.0.0.0/4 | 224.0.0.0 – 239.255.255.255 | 268,435,456 | 互联网 | 用于多播。[[11]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc1112-11) |
|
||||
| 233.252.0.0/24 | 233.252.0.0 - 233.252.0.255 | 256 | 文档 | 分配为用于文档和示例中的“MCAST-TEST-NET”,它不应该被公开使用 |
|
||||
| 240.0.0.0/4 | 240.0.0.0 – 255.255.255.254 | 268,435,455 | 互联网 | 用于将来使用。[[12\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc6890-12) |
|
||||
| 255.255.255.255/32 | 255.255.255.255 | 1 | 子网 | 用于受限广播地址。[[12\]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc6890-12) |
|
||||
| 240.0.0.0/4 | 240.0.0.0 – 255.255.255.254 | 268,435,455 | 互联网 | 用于将来使用。[[12]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc6890-12) |
|
||||
| 255.255.255.255/32 | 255.255.255.255 | 1 | 子网 | 用于受限广播地址。[[12]](https://zh.wikipedia.org/wiki/保留IP地址#cite_note-rfc6890-12) |
|
||||
|
||||
如果需要搭建自己的比如说家庭网络,寝室网络,一般会选择
|
||||
|
||||
@@ -104,7 +104,7 @@ baimeow@server:~$ ip addr
|
||||
|
||||
此外另外了解一下其他的特殊地址,避免冲突吧
|
||||
|
||||
- `169.254.0.0/16` DHCP获取到 IP 前的临时 IP 地址
|
||||
- `169.254.0.0/16` DHCP 获取到 IP 前的临时 IP 地址
|
||||
- `192.18.0.0/16` 一些代理软件的透明代理模式会解析域名到这里
|
||||
- `172.17.0.0/16` Docker 默认网段
|
||||
|
||||
@@ -112,19 +112,19 @@ baimeow@server:~$ ip addr
|
||||
|
||||
很久很久以前,一群自大的人给 IP 随意地划分了 ABCDE 类。很遗憾,我们仍需要了解一下这个历史包袱。
|
||||
|
||||
- A类 0.0.0.0~126.255.255.255 大型网络
|
||||
- A 类 0.0.0.0~126.255.255.255 大型网络
|
||||
|
||||
- B类 128.0.0.0~191.255.255.255中型网络
|
||||
- B 类 128.0.0.0~191.255.255.255 中型网络
|
||||
|
||||
- C类 192.0.0.0~223.255.255.255 小型网络
|
||||
- C 类 192.0.0.0~223.255.255.255 小型网络
|
||||
|
||||
- D类 224.0.0.1-239.255.255.254 多播
|
||||
- D 类 224.0.0.1-239.255.255.254 多播
|
||||
|
||||
- E类 240.0.0.0---255.255.255.255 保留段与广播地址
|
||||
- E 类 240.0.0.0---255.255.255.255 保留段与广播地址
|
||||
|
||||
仅作了解,现今已经不具有实际意义了
|
||||
|
||||
## 正在消失的 —— 点分10进制掩码
|
||||
## 正在消失的 —— 点分 10 进制掩码
|
||||
|
||||
当你在 windows 的 cmd 里执行 `ipconfig /all` 时,你可以看到一个点分十进制的掩码。
|
||||
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
# 9.2.3 网络层
|
||||
|
||||
> Author: 柏喵樱
|
||||
>
|
||||
>
|
||||
> copyright reserved
|
||||
|
||||
本章节是网络层的开篇章节,我们先做两个约定:
|
||||
|
||||
- 没有提及IP协议版本,都是IPv4( IPv6 会单独介绍不详细展开)
|
||||
- 没有提及 IP 协议版本,都是 IPv4(IPv6 会单独介绍不详细展开)
|
||||
|
||||
- 路由表已经配置好了,给IP地址就能发到正确的地方(路由技术参照“路由与交换”章节)
|
||||
- 路由表已经配置好了,给 IP 地址就能发到正确的地方(路由技术参照“路由与交换”章节)
|
||||
|
||||
以上两个约定适用于所有网络层章节。
|
||||
|
||||
在链路层我们已经实现了两个直接相连的设备之间的数据收发,也可以在总线类型的网络上完成数据手法,更成熟一点,可以借助交换机来构建一个具有一定规模的中心化网络。
|
||||
|
||||
但中心化是有极限的,这必然无法承载这个整个互联网,因此,我们需要再往上一层,定义一个新的概念,IP 地址,并完成实现数据包的转发操作,将互联网推向去中心化。
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
# 9.3路由与交换
|
||||
# 9.3 路由与交换
|
||||
|
||||
@@ -1 +1 @@
|
||||
# 9.4隧道和代理
|
||||
# 9.4 隧道和代理
|
||||
|
||||
@@ -1 +1 @@
|
||||
# 9.5路由佬入门指南
|
||||
# 9.5 路由佬入门指南
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
# 9.计算机网络
|
||||
|
||||
> 本模块来自 DN11(Decentralized Network 11)成员倾情奉献,DN11 最初在生活区11号楼群中提出,旨在建立一个跨寝室的大内网。经过一年的发展,已经成为了横跨 11号楼,VidarTeam,杭电助手等群体的中型实验性网络。
|
||||
> 本模块来自 DN11(Decentralized Network 11) 成员倾情奉献,DN11 最初在生活区 11 号楼群中提出,旨在建立一个跨寝室的大内网。经过一年的发展,已经成为了横跨 11 号楼,VidarTeam,杭电助手等群体的中型实验性网络。
|
||||
|
||||
计算机网络无非一句话,将所有计算机设备连起来。
|
||||
|
||||
但,跨越全球的网络是何其的庞大,能够将他们连起来是一项巨大的工程。我可以说:Internet是人类这近50年来最伟大的工程。
|
||||
但,跨越全球的网络是何其的庞大,能够将他们连起来是一项巨大的工程。我可以说:Internet 是人类这近 50 年来最伟大的工程。
|
||||
|
||||
本讲义的计算机网络部分共分为5个章节
|
||||
本讲义的计算机网络部分共分为 5 个章节
|
||||
|
||||
## 计算机网络速通
|
||||
|
||||
虽然名字看起来像是考前抱佛脚的章节,但他速通的并不是计网这一课程,是做简单Web开发所必须具备的计网知识。
|
||||
虽然名字看起来像是考前抱佛脚的章节,但他速通的并不是计网这一课程,是做简单 Web 开发所必须具备的计网知识。
|
||||
|
||||
在这个章节,我们会讨论到计算机网络的应用层和传输层,重点介绍一些应用层协议。对于传输层,我们只讨论他为Web开发提供了怎样的接口或者说功能。
|
||||
在这个章节,我们会讨论到计算机网络的应用层和传输层,重点介绍一些应用层协议。对于传输层,我们只讨论他为 Web 开发提供了怎样的接口或者说功能。
|
||||
|
||||
上面提到“应用层和传输层”,或许你现在还不知道计算机网络的五层结构(也有其他划分,但是该划分利于学习),这也没关系,在本章节,可以暂时也不需要知道。
|
||||
|
||||
@@ -32,9 +32,9 @@
|
||||
|
||||
路由与交换的理论知识,并不涉及实践主要应付考试,但为了追求知识体系完整,会比考试内容稍多,但都是理解性质的。其实大家一般也没这个需求,除非专门做运维或者类似方向的开发,大伙都不需要了解具体怎么搭建网络,不会做过多的原理性讲解了。
|
||||
|
||||
如果你确实有在真实世界中搭建网络的需求,请移步路由佬入门指南或者拿好你的设备并考虑加入DN11。
|
||||
如果你确实有在真实世界中搭建网络的需求,请移步路由佬入门指南或者拿好你的设备并考虑加入 DN11。
|
||||
|
||||
这里主要讨论一下路由器,交换机,各种路由协议和他们工作的位置,还有NAT,最终把这些东西排排好,给大家一个完整的互联网模型(对比真实互联网做了一些简化,但该有的协议类型都会有)
|
||||
这里主要讨论一下路由器,交换机,各种路由协议和他们工作的位置,还有 NAT,最终把这些东西排排好,给大家一个完整的互联网模型(对比真实互联网做了一些简化,但该有的协议类型都会有)
|
||||
|
||||
## 隧道和代理
|
||||
|
||||
@@ -46,23 +46,24 @@
|
||||
|
||||
其实真实互联网上充斥着这样的需求,比如异地组网之类的,隧道便应运而生,我们把原始数据包打包在另一个层次比较高的协议中进行传输,用高层的协议来模拟低层的协议。一条虚假的网线(其实不能和网线等价) —— 隧道便诞生了。
|
||||
|
||||
代理部分会讲解正向和反向代理,正向代理其实就是一种“隧道”外加上访问目标主机的网络资源的能力,反向代理更多是Web开发带来的需求,比如常见的nginx反向代理。
|
||||
代理部分会讲解正向和反向代理,正向代理其实就是一种“隧道”外加上访问目标主机的网络资源的能力,反向代理更多是 Web 开发带来的需求,比如常见的 nginx 反向代理。
|
||||
|
||||
## 路由佬入门指南
|
||||
|
||||
很多人不理解,不理解也罢。
|
||||
|
||||
互联网不是一个很cool的东西吗?
|
||||
互联网不是一个很 cool 的东西吗?
|
||||
|
||||
这是一个遍布全球由无数独立个体一个一个连接起来而形成的一张网,这难道不酷吗?
|
||||
|
||||
在把网络配通的瞬间,所有的ping包返回了正确的响应,这难道不振奋人心吗?
|
||||
在把网络配通的瞬间,所有的 ping 包返回了正确的响应,这难道不振奋人心吗?
|
||||
|
||||
身在此却能设计出方案,访问到无比遥远的地方的资源,是难道没有意思吗?
|
||||
|
||||
有这样的一个群体,我们普遍称呼他们为“路由佬”,他们便是这样一群,沉迷于配网的一群人。
|
||||
|
||||
本章节存在的意义和前面的章节不同,并非是教学,而是劝人快去配网,非常重实践,上面讨论的都是简化模型,理想模型,学习模型,再往下就是实验性网络和真实互联网了,这其实已经脱离了该讲义的宗旨了,所以只会概述概述概述。
|
||||
|
||||
## 画个饼先
|
||||
|
||||
```mermaid
|
||||
|
||||
Reference in New Issue
Block a user