计算机网络.md 54.9 KB
Newer Older
C
CyC2018 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
<!-- GFM-TOC -->
* [一、概述](#一概述)
    * [网络的网络](#网络的网络)
    * [ISP](#isp)
    * [主机之间的通信方式](#主机之间的通信方式)
    * [电路交换与分组交换](#电路交换与分组交换)
    * [时延](#时延)
    * [计算机网络体系结构](#计算机网络体系结构)
* [二、物理层](#二物理层)
    * [通信方式](#通信方式)
    * [带通调制](#带通调制)
* [三、数据链路层](#三数据链路层)
    * [基本问题](#基本问题)
    * [信道分类](#信道分类)
    * [信道复用技术](#信道复用技术)
    * [CSMA/CD 协议](#csmacd-协议)
    * [PPP 协议](#ppp-协议)
    * [MAC 地址](#mac-地址)
    * [局域网](#局域网)
    * [以太网](#以太网)
    * [交换机](#交换机)
    * [虚拟局域网](#虚拟局域网)
* [四、网络层](#四网络层)
    * [概述](#概述)
    * [IP 数据报格式](#ip-数据报格式)
    * [IP 地址编址方式](#ip-地址编址方式)
    * [地址解析协议 ARP](#地址解析协议-arp)
    * [网际控制报文协议 ICMP](#网际控制报文协议-icmp)
    * [虚拟专用网 VPN](#虚拟专用网-vpn)
    * [网络地址转换 NAT](#网络地址转换-nat)
    * [路由器的结构](#路由器的结构)
    * [路由器分组转发流程](#路由器分组转发流程)
    * [路由选择协议](#路由选择协议)
* [五、传输层](#五传输层)
    * [UDP 和 TCP 的特点](#udp-和-tcp-的特点)
    * [UDP 首部格式](#udp-首部格式)
    * [TCP 首部格式](#tcp-首部格式)
    * [TCP 的三次握手](#tcp-的三次握手)
    * [TCP 的四次挥手](#tcp-的四次挥手)
    * [TCP 可靠传输](#tcp-可靠传输)
    * [TCP 滑动窗口](#tcp-滑动窗口)
    * [TCP 流量控制](#tcp-流量控制)
    * [TCP 拥塞控制](#tcp-拥塞控制)
* [六、应用层](#六应用层)
    * [域名系统](#域名系统)
    * [文件传送协议](#文件传送协议)
    * [动态主机配置协议](#动态主机配置协议)
    * [远程登录协议](#远程登录协议)
    * [电子邮件协议](#电子邮件协议)
    * [常用端口](#常用端口)
    * [Web 页面请求过程](#web-页面请求过程)
* [参考资料](#参考资料)
<!-- GFM-TOC -->


# 一、概述

## 网络的网络
C
CyC2018 已提交
59 60 61

网络把主机连接起来,而互联网是把多种不同的网络连接起来,因此互联网是网络的网络。

C
CyC2018 已提交
62
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/network-of-networks.gif" width="450"/> </div><br>
C
CyC2018 已提交
63

C
CyC2018 已提交
64
## ISP
C
CyC2018 已提交
65

C
CyC2018 已提交
66
互联网服务提供商 ISP 可以从互联网管理机构获得许多 IP 地址,同时拥有通信线路以及路由器等联网设备,个人或机构向 ISP 缴纳一定的费用就可以接入互联网。
C
CyC2018 已提交
67

C
CyC2018 已提交
68
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/68d76d01-f11f-4f6e-85ae-b9db4368d544_200.png" width="500"/> </div><br>
C
CyC2018 已提交
69

C
CyC2018 已提交
70
目前的互联网是一种多层次 ISP 结构,ISP 根据覆盖面积的大小分为第一层 ISP、区域 ISP 和接入 ISP。互联网交换点 IXP 允许两个 ISP 直接相连而不用经过第三个 ISP。
C
CyC2018 已提交
71

C
CyC2018 已提交
72
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/8_2001550812038190.png" width="500"/> </div><br>
C
CyC2018 已提交
73

C
CyC2018 已提交
74
## 主机之间的通信方式
C
CyC2018 已提交
75

C
CyC2018 已提交
76
- 客户-服务器(C/S):客户是服务的请求方,服务器是服务的提供方。
C
CyC2018 已提交
77

C
CyC2018 已提交
78
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/2_2001550810366269.png"/> </div><br>
C
CyC2018 已提交
79

C
CyC2018 已提交
80
- 对等(P2P):不区分客户和服务器。
C
CyC2018 已提交
81

C
CyC2018 已提交
82
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/3_2001550810442775.png"/> </div><br>
C
CyC2018 已提交
83

C
CyC2018 已提交
84
## 电路交换与分组交换
C
CyC2018 已提交
85

C
CyC2018 已提交
86
### 1. 电路交换
C
CyC2018 已提交
87

C
CyC2018 已提交
88
电路交换用于电话通信系统,两个用户要通信之前需要建立一条专用的物理链路,并且在整个通信过程中始终占用该链路。由于通信的过程中不可能一直在使用传输线路,因此电路交换对线路的利用率很低,往往不到 10%。
C
CyC2018 已提交
89

C
CyC2018 已提交
90
### 2. 分组交换
C
CyC2018 已提交
91 92 93 94 95

每个分组都有首部和尾部,包含了源地址和目的地址等控制信息,在同一个传输线路上同时传输多个分组互相不会影响,因此在同一条传输线路上允许同时传输多个分组,也就是说分组交换不需要占用传输线路。

在一个邮局通信系统中,邮局收到一份邮件之后,先存储下来,然后把相同目的地的邮件一起转发到下一个目的地,这个过程就是存储转发过程,分组交换也使用了存储转发过程。

C
CyC2018 已提交
96
## 时延
C
CyC2018 已提交
97

C
CyC2018 已提交
98
总时延 = 排队时延 + 处理时延 + 传输时延 + 传播时延
C
CyC2018 已提交
99

C
CyC2018 已提交
100
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/4_2001550810732828.png" width="600"/> </div><br>
C
CyC2018 已提交
101

C
CyC2018 已提交
102
### 1. 排队时延
C
CyC2018 已提交
103 104 105

分组在路由器的输入队列和输出队列中排队等待的时间,取决于网络当前的通信量。

C
CyC2018 已提交
106
### 2. 处理时延
C
CyC2018 已提交
107 108 109

主机或路由器收到分组时进行处理所需要的时间,例如分析首部、从分组中提取数据、进行差错检验或查找适当的路由等。

C
CyC2018 已提交
110
### 3. 传输时延
C
CyC2018 已提交
111 112 113

主机或路由器传输数据帧所需要的时间。

C
CyC2018 已提交
114
<div align="center"><img src="https://latex.codecogs.com/gif.latex?delay=\frac{l(bit)}{v(bit/s)}"/></div> <br>
C
CyC2018 已提交
115

C
CyC2018 已提交
116
其中 l 表示数据帧的长度,v 表示传输速率。
C
CyC2018 已提交
117

C
CyC2018 已提交
118
### 4. 传播时延
C
CyC2018 已提交
119 120 121

电磁波在信道中传播所需要花费的时间,电磁波传播的速度接近光速。

C
CyC2018 已提交
122
<div align="center"><img src="https://latex.codecogs.com/gif.latex?delay=\frac{l(m)}{v(m/s)}"/></div> <br>
C
CyC2018 已提交
123

C
CyC2018 已提交
124
其中 l 表示信道长度,v 表示电磁波在信道上的传播速度。
C
CyC2018 已提交
125

C
CyC2018 已提交
126
## 计算机网络体系结构
C
CyC2018 已提交
127

C
CyC2018 已提交
128
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/f5d40b01-abf2-435e-9ce7-7889c41b2fa6.jpg" width="500"/> </div><br>
C
CyC2018 已提交
129 130


C
CyC2018 已提交
131
### 1. 五层协议
C
CyC2018 已提交
132

C
CyC2018 已提交
133
-  **应用层** :为特定应用程序提供数据传输服务,例如 HTTP、DNS 等协议。数据单位为报文。
C
CyC2018 已提交
134

C
CyC2018 已提交
135
-  **传输层** :为进程提供通用数据传输服务。由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。运输层包括两种协议:传输控制协议 TCP,提供面向连接、可靠的数据传输服务,数据单位为报文段;用户数据报协议 UDP,提供无连接、尽最大努力的数据传输服务,数据单位为用户数据报。TCP 主要提供完整性服务,UDP 主要提供及时性服务。
C
CyC2018 已提交
136

C
CyC2018 已提交
137
-  **网络层** :为主机提供数据传输服务。而传输层协议是为主机中的进程提供数据传输服务。网络层把传输层传递下来的报文段或者用户数据报封装成分组。
C
CyC2018 已提交
138

C
CyC2018 已提交
139
-  **数据链路层** :网络层针对的还是主机之间的数据传输服务,而主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务。数据链路层把网络层传下来的分组封装成帧。
C
CyC2018 已提交
140

C
CyC2018 已提交
141
-  **物理层** :考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。
C
CyC2018 已提交
142

C
CyC2018 已提交
143
### 2. OSI
C
CyC2018 已提交
144 145 146

其中表示层和会话层用途如下:

C
CyC2018 已提交
147
-  **表示层** :数据压缩和解压缩、加密和解密以及数据格式变化等,这使得应用程序不必关心在各台主机中数据内部格式不同的问题。
C
CyC2018 已提交
148

C
CyC2018 已提交
149
-  **会话层** :建立及管理和终止会话。
C
CyC2018 已提交
150 151 152

五层协议没有表示层和会话层,而是将这些功能留给应用程序开发者处理。

C
CyC2018 已提交
153
### 3. TCP/IP
C
CyC2018 已提交
154 155 156

它只有四层,相当于五层协议中数据链路层和物理层合并为网络接口层。

C
CyC2018 已提交
157
TCP/IP 体系结构不严格遵循 OSI 分层概念,应用层可能会直接使用 IP 层或者网络接口层。
C
CyC2018 已提交
158

C
CyC2018 已提交
159
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/6_2001550811175246.png" width="250"/> </div><br>
C
CyC2018 已提交
160

C
CyC2018 已提交
161
### 4. 数据在各层之间的传递过程
C
CyC2018 已提交
162 163 164 165 166

在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。

路由器只有下面三层协议,因为路由器位于网络核心中,不需要为进程或者应用程序提供服务,因此也就不需要传输层和应用层。

C
CyC2018 已提交
167
# 二、物理层
C
CyC2018 已提交
168

C
CyC2018 已提交
169
## 通信方式
C
CyC2018 已提交
170 171 172

根据信息在传输线上的传送方向,分为以下三种通信方式:

C
CyC2018 已提交
173 174 175
- 单工通信:单向传输
- 半双工通信:双向交替传输
- 全双工通信:双向同时传输
C
CyC2018 已提交
176

C
CyC2018 已提交
177
## 带通调制
C
CyC2018 已提交
178 179 180

模拟信号是连续的信号,数字信号是离散的信号。带通调制把数字信号转换为模拟信号。

C
CyC2018 已提交
181
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/c34f4503-f62c-4043-9dc6-3e03288657df.jpg" width="500"/> </div><br>
C
CyC2018 已提交
182

C
CyC2018 已提交
183
# 三、数据链路层
C
CyC2018 已提交
184

C
CyC2018 已提交
185
## 基本问题
C
CyC2018 已提交
186

C
CyC2018 已提交
187
### 1. 封装成帧
C
CyC2018 已提交
188 189 190

将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束。

C
CyC2018 已提交
191
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/9c60793f-5e7f-453b-8413-35890c24abc4.png" width="500"/> </div><br>
C
CyC2018 已提交
192

C
CyC2018 已提交
193
### 2. 透明传输
C
CyC2018 已提交
194 195 196 197 198

透明表示一个实际存在的事物看起来好像不存在一样。

帧使用首部和尾部进行定界,如果帧的数据部分含有和首部尾部相同的内容,那么帧的开始和结束位置就会被错误的判定。需要在数据部分出现首部尾部相同的内容前面插入转义字符。如果数据部分出现转义字符,那么就在转义字符前面再加个转义字符。在接收端进行处理之后可以还原出原始数据。这个过程透明传输的内容是转义字符,用户察觉不到转义字符的存在。

C
CyC2018 已提交
199
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/839207f5-52fd-4516-9370-956dcdf2c2b5.png" width="600"/> </div><br>
C
CyC2018 已提交
200

C
CyC2018 已提交
201
### 3. 差错检测
C
CyC2018 已提交
202 203 204

目前数据链路层广泛使用了循环冗余检验(CRC)来检查比特差错。

C
CyC2018 已提交
205
## 信道分类
C
CyC2018 已提交
206

C
CyC2018 已提交
207
### 1. 广播信道
C
CyC2018 已提交
208 209 210 211 212

一对多通信,一个节点发送的数据能够被广播信道上所有的节点接收到。

所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞)。

C
CyC2018 已提交
213
主要有两种控制方法进行协调,一个是使用信道复用技术,一是使用 CSMA/CD 协议。
C
CyC2018 已提交
214

C
CyC2018 已提交
215
### 2. 点对点信道
C
CyC2018 已提交
216 217 218

一对一通信。

C
CyC2018 已提交
219
因为不会发生碰撞,因此也比较简单,使用 PPP 协议进行控制。
C
CyC2018 已提交
220

C
CyC2018 已提交
221
## 信道复用技术
C
CyC2018 已提交
222

C
CyC2018 已提交
223
### 1. 频分复用
C
CyC2018 已提交
224 225 226

频分复用的所有主机在相同的时间占用不同的频率带宽资源。

C
CyC2018 已提交
227
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/7e6cb8fc-1b82-4135-8b03-ebcfc546d94c.png" width="450"/> </div><br>
C
CyC2018 已提交
228

C
CyC2018 已提交
229
### 2. 时分复用
C
CyC2018 已提交
230 231 232

时分复用的所有主机在不同的时间占用相同的频率带宽资源。

C
CyC2018 已提交
233
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/49e53613-46f8-4308-9ee5-c09d62367577.png" width="450"/> </div><br>
C
CyC2018 已提交
234 235 236

使用频分复用和时分复用进行通信,在通信的过程中主机会一直占用一部分信道资源。但是由于计算机数据的突发性质,通信过程没必要一直占用信道资源而不让出给其它用户使用,因此这两种方式对信道的利用率都不高。

C
CyC2018 已提交
237
### 3. 统计时分复用
C
CyC2018 已提交
238 239 240

是对时分复用的一种改进,不固定每个用户在时分复用帧中的位置,只要有数据就集中起来组成统计时分复用帧然后发送。

C
CyC2018 已提交
241
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/e3360fa0-680e-486b-945f-09ff5d8612e4.png" width="450"/> </div><br>
C
CyC2018 已提交
242

C
CyC2018 已提交
243
### 4. 波分复用
C
CyC2018 已提交
244 245 246

光的频分复用。由于光的频率很高,因此习惯上用波长而不是频率来表示所使用的光载波。

C
CyC2018 已提交
247
### 5. 码分复用
C
CyC2018 已提交
248

C
CyC2018 已提交
249
为每个用户分配 m bit 的码片,并且所有的码片正交,对于任意两个码片 <img src="https://latex.codecogs.com/gif.latex?\vec{S}"/><img src="https://latex.codecogs.com/gif.latex?\vec{T}"/>
C
CyC2018 已提交
250

C
CyC2018 已提交
251
<div align="center"><img src="https://latex.codecogs.com/gif.latex?\frac{1}{m}\vec{S}\cdot\vec{T}=0"/></div> <br>
C
CyC2018 已提交
252

C
CyC2018 已提交
253
为了讨论方便,取 m=8,设码片 <img src="https://latex.codecogs.com/gif.latex?\vec{S}"/> 为 00011011。在拥有该码片的用户发送比特 1 时就发送该码片,发送比特 0 时就发送该码片的反码 11100100。
C
CyC2018 已提交
254

C
CyC2018 已提交
255
在计算时将 00011011 记作 (-1 -1 -1 +1 +1 -1 +1 +1),可以得到
C
CyC2018 已提交
256

C
CyC2018 已提交
257
<div align="center"><img src="https://latex.codecogs.com/gif.latex?\frac{1}{m}\vec{S}\cdot\vec{S}=1"/></div> <br>
C
CyC2018 已提交
258

C
CyC2018 已提交
259
<div align="center"><img src="https://latex.codecogs.com/gif.latex?\frac{1}{m}\vec{S}\cdot\vec{S'}=-1"/></div> <br>
C
CyC2018 已提交
260

C
CyC2018 已提交
261
其中 <img src="https://latex.codecogs.com/gif.latex?\vec{S'}"/><img src="https://latex.codecogs.com/gif.latex?\vec{S}"/> 的反码。
C
CyC2018 已提交
262

C
CyC2018 已提交
263
利用上面的式子我们知道,当接收端使用码片 <img src="https://latex.codecogs.com/gif.latex?\vec{S}"/> 对接收到的数据进行内积运算时,结果为 0 的是其它用户发送的数据,结果为 1 的是用户发送的比特 1,结果为 -1 的是用户发送的比特 0。
C
CyC2018 已提交
264

C
CyC2018 已提交
265
码分复用需要发送的数据量为原先的 m 倍。
C
CyC2018 已提交
266

C
CyC2018 已提交
267
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/c7875be7-fce5-43c7-ac77-d8dbe6c0ae1b.png" width="600"/> </div><br>
C
CyC2018 已提交
268

C
CyC2018 已提交
269
## CSMA/CD 协议
C
CyC2018 已提交
270

C
CyC2018 已提交
271
CSMA/CD 表示载波监听多点接入 / 碰撞检测。
C
CyC2018 已提交
272

C
CyC2018 已提交
273 274 275
-  **多点接入** :说明这是总线型网络,许多主机以多点的方式连接到总线上。
-  **载波监听** :每个主机都必须不停地监听信道。在发送前,如果监听到信道正在使用,就必须等待。
-  **碰撞检测** :在发送中,如果监听到信道已有其它主机正在发送数据,就表示发生了碰撞。虽然每个主机在发送数据之前都已经监听到信道为空闲,但是由于电磁波的传播时延的存在,还是有可能会发生碰撞。
C
CyC2018 已提交
276

C
CyC2018 已提交
277
记端到端的传播时延为 τ,最先发送的站点最多经过 2τ 就可以知道是否发生了碰撞,称 2τ 为  **争用期** 。只有经过争用期之后还没有检测到碰撞,才能肯定这次发送不会发生碰撞。
C
CyC2018 已提交
278

C
CyC2018 已提交
279
当发生碰撞时,站点要停止发送,等待一段时间再发送。这个时间采用  **截断二进制指数退避算法**  来确定。从离散的整数集合 {0, 1, .., (2<sup>k</sup>-1)} 中随机取出一个数,记作 r,然后取 r 倍的争用期作为重传等待时间。
C
CyC2018 已提交
280

C
CyC2018 已提交
281
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/9bd12b89-f99c-49f4-ae45-410f76a713d6.png" width="500"/> </div><br>
C
CyC2018 已提交
282

C
CyC2018 已提交
283
## PPP 协议
C
CyC2018 已提交
284

C
CyC2018 已提交
285
互联网用户通常需要连接到某个 ISP 之后才能接入到互联网,PPP 协议是用户计算机和 ISP 进行通信时所使用的数据链路层协议。
C
CyC2018 已提交
286

C
CyC2018 已提交
287
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/2f237854-bb35-4c57-a7fe-ab2ab144f56e.jpg" width="300"/> </div><br>
C
CyC2018 已提交
288

C
CyC2018 已提交
289
PPP 的帧格式:
C
CyC2018 已提交
290

C
CyC2018 已提交
291 292 293 294
- F 字段为帧的定界符
- A 和 C 字段暂时没有意义
- FCS 字段是使用 CRC 的检验序列
- 信息部分的长度不超过 1500
C
CyC2018 已提交
295

C
CyC2018 已提交
296
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/63010737-2cb4-48f3-999f-09194481b227.png" width="500"/> </div><br>
C
CyC2018 已提交
297

C
CyC2018 已提交
298
## MAC 地址
C
CyC2018 已提交
299

C
CyC2018 已提交
300
MAC 地址是链路层地址,长度为 6 字节(48 位),用于唯一标识网络适配器(网卡)。
C
CyC2018 已提交
301

C
CyC2018 已提交
302
一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因此就有两个 MAC 地址。
C
CyC2018 已提交
303

C
CyC2018 已提交
304
## 局域网
C
CyC2018 已提交
305 306 307

局域网是一种典型的广播信道,主要特点是网络为一个单位所拥有,且地理范围和站点数目均有限。

C
CyC2018 已提交
308
主要有以太网、令牌环网、FDDI 和 ATM 等局域网技术,目前以太网占领着有线局域网市场。
C
CyC2018 已提交
309 310 311

可以按照网络拓扑结构对局域网进行分类:

C
CyC2018 已提交
312
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/df01dbcd-4a3c-4877-86e8-5590d7589788.jpg" width="800"/> </div><br>
C
CyC2018 已提交
313

C
CyC2018 已提交
314
## 以太网
C
CyC2018 已提交
315 316 317

以太网是一种星型拓扑结构局域网。

C
CyC2018 已提交
318
早期使用集线器进行连接,集线器是一种物理层设备, 作用于比特而不是帧,当一个比特到达接口时,集线器重新生成这个比特,并将其能量强度放大,从而扩大网络的传输距离,之后再将这个比特发送到其它所有接口。如果集线器同时收到两个不同接口的帧,那么就发生了碰撞。
C
CyC2018 已提交
319

C
CyC2018 已提交
320
目前以太网使用交换机替代了集线器,交换机是一种链路层设备,它不会发生碰撞,能根据 MAC 地址进行存储转发。
C
CyC2018 已提交
321 322 323

以太网帧格式:

C
CyC2018 已提交
324 325 326
-  **类型** :标记上层使用的协议;
-  **数据** :长度在 46-1500 之间,如果太小则需要填充;
-  **FCS** :帧检验序列,使用的是 CRC 检验方法;
C
CyC2018 已提交
327

C
CyC2018 已提交
328
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/420f4dc0-6c4b-486c-afea-274299014462.png" width="550"/> </div><br>
C
CyC2018 已提交
329

C
CyC2018 已提交
330
## 交换机
C
CyC2018 已提交
331

C
CyC2018 已提交
332
交换机具有自学习能力,学习的是交换表的内容,交换表中存储着 MAC 地址到接口的映射。
C
CyC2018 已提交
333 334 335

正是由于这种自学习能力,因此交换机是一种即插即用设备,不需要网络管理员手动配置交换表内容。

C
CyC2018 已提交
336
下图中,交换机有 4 个接口,主机 A 向主机 B 发送数据帧时,交换机把主机 A 到接口 1 的映射写入交换表中。为了发送数据帧到 B,先查交换表,此时没有主机 B 的表项,那么主机 A 就发送广播帧,主机 C 和主机 D 会丢弃该帧,主机 B 回应该帧向主机 A 发送数据包时,交换机查找交换表得到主机 A 映射的接口为 1,就发送数据帧到接口 1,同时交换机添加主机 B 到接口 2 的映射。
C
CyC2018 已提交
337

C
CyC2018 已提交
338
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/80646c77-1f32-484c-810e-af80ce00f902.png" width="800"/> </div><br>
C
CyC2018 已提交
339

C
CyC2018 已提交
340
## 虚拟局域网
C
CyC2018 已提交
341 342 343

虚拟局域网可以建立与物理位置无关的逻辑组,只有在同一个虚拟局域网中的成员才会收到链路层广播信息。

C
CyC2018 已提交
344
例如下图中 (A1, A2, A3, A4) 属于一个虚拟局域网,A1 发送的广播会被 A2、A3、A4 收到,而其它站点收不到。
C
CyC2018 已提交
345

C
CyC2018 已提交
346
使用 VLAN 干线连接来建立虚拟局域网,每台交换机上的一个特殊接口被设置为干线接口,以互连 VLAN 交换机。IEEE 定义了一种扩展的以太网帧格式 802.1Q,它在标准以太网帧上加进了 4 字节首部 VLAN 标签,用于表示该帧属于哪一个虚拟局域网。
C
CyC2018 已提交
347

C
CyC2018 已提交
348
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/99208bd0-1454-4618-9969-0c2deb8bba0f.png" width="500"/> </div><br>
C
CyC2018 已提交
349

C
CyC2018 已提交
350
# 四、网络层
C
CyC2018 已提交
351

C
CyC2018 已提交
352
## 概述
C
CyC2018 已提交
353 354 355

因为网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。

C
CyC2018 已提交
356
使用 IP 协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络。
C
CyC2018 已提交
357

C
CyC2018 已提交
358
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/e3b53605-0c10-4a7e-be02-a9064778f8a5.png" width="800"/> </div><br>
C
CyC2018 已提交
359

C
CyC2018 已提交
360
与 IP 协议配套使用的还有三个协议:
C
CyC2018 已提交
361

C
CyC2018 已提交
362 363 364
- 地址解析协议 ARP(Address Resolution Protocol)
- 网际控制报文协议 ICMP(Internet Control Message Protocol)
- 网际组管理协议 IGMP(Internet Group Management Protocol)
C
CyC2018 已提交
365

C
CyC2018 已提交
366
## IP 数据报格式
C
CyC2018 已提交
367

C
CyC2018 已提交
368
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/85c05fb1-5546-4c50-9221-21f231cdc8c5.jpg" width="700"/> </div><br>
C
CyC2018 已提交
369

C
CyC2018 已提交
370
-  **版本**  : 有 4(IPv4)和 6(IPv6)两个值;
C
CyC2018 已提交
371

C
CyC2018 已提交
372
-  **首部长度**  : 占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为首部固定长度为 20 字节,因此该值最小为 5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。
C
CyC2018 已提交
373

C
CyC2018 已提交
374
-  **区分服务**  : 用来获得更好的服务,一般情况下不使用。
C
CyC2018 已提交
375

C
CyC2018 已提交
376
-  **总长度**  : 包括首部长度和数据部分长度。
C
CyC2018 已提交
377

C
CyC2018 已提交
378
-  **生存时间**  :TTL,它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报。
C
CyC2018 已提交
379

C
CyC2018 已提交
380
-  **协议** :指出携带的数据应该上交给哪个协议进行处理,例如 ICMP、TCP、UDP 等。
C
CyC2018 已提交
381

C
CyC2018 已提交
382
-  **首部检验和** :因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。
C
CyC2018 已提交
383

C
CyC2018 已提交
384
-  **标识**  : 在数据报长度过长从而发生分片的情况下,相同数据报的不同分片具有相同的标识符。
C
CyC2018 已提交
385

C
CyC2018 已提交
386
-  **片偏移**  : 和标识符一起,用于发生分片的情况。片偏移的单位为 8 字节。
C
CyC2018 已提交
387

C
CyC2018 已提交
388
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/23ba890e-e11c-45e2-a20c-64d217f83430.png" width="700"/> </div><br>
C
CyC2018 已提交
389

C
CyC2018 已提交
390
## IP 地址编址方式
C
CyC2018 已提交
391

C
CyC2018 已提交
392
IP 地址的编址方式经历了三个历史阶段:
C
CyC2018 已提交
393

C
CyC2018 已提交
394 395 396
- 分类
- 子网划分
- 无分类
C
CyC2018 已提交
397

C
CyC2018 已提交
398
### 1. 分类
C
CyC2018 已提交
399 400 401

由两部分组成,网络号和主机号,其中不同分类具有不同的网络号长度,并且是固定的。

C
CyC2018 已提交
402
IP 地址 ::= {< 网络号 >, < 主机号 >}
C
CyC2018 已提交
403

C
CyC2018 已提交
404
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/cbf50eb8-22b4-4528-a2e7-d187143d57f7.png" width="500"/> </div><br>
C
CyC2018 已提交
405

C
CyC2018 已提交
406
### 2. 子网划分
C
CyC2018 已提交
407

C
CyC2018 已提交
408
通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址。
C
CyC2018 已提交
409

C
CyC2018 已提交
410
IP 地址 ::= {< 网络号 >, < 子网号 >, < 主机号 >}
C
CyC2018 已提交
411

C
CyC2018 已提交
412
要使用子网,必须配置子网掩码。一个 B 类地址的默认子网掩码为 255.255.0.0,如果 B 类地址的子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0。
C
CyC2018 已提交
413 414 415

注意,外部网络看不到子网的存在。

C
CyC2018 已提交
416
### 3. 无分类
C
CyC2018 已提交
417

C
CyC2018 已提交
418
无分类编址 CIDR 消除了传统 A 类、B 类和 C 类地址以及划分子网的概念,使用网络前缀和主机号来对 IP 地址进行编码,网络前缀的长度可以根据需要变化。
C
CyC2018 已提交
419

C
CyC2018 已提交
420
IP 地址 ::= {< 网络前缀号 >, < 主机号 >}
C
CyC2018 已提交
421

C
CyC2018 已提交
422
CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。
C
CyC2018 已提交
423

C
CyC2018 已提交
424
CIDR 的地址掩码可以继续称为子网掩码,子网掩码首 1 长度为网络前缀的长度。
C
CyC2018 已提交
425

C
CyC2018 已提交
426
一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为  **构成超网**
C
CyC2018 已提交
427 428 429

在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。

C
CyC2018 已提交
430
## 地址解析协议 ARP
C
CyC2018 已提交
431

C
CyC2018 已提交
432
网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。
C
CyC2018 已提交
433

C
CyC2018 已提交
434
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/66192382-558b-4b05-a35d-ac4a2b1a9811.jpg" width="700"/> </div><br>
C
CyC2018 已提交
435

C
CyC2018 已提交
436
ARP 实现由 IP 地址得到 MAC 地址。
C
CyC2018 已提交
437

C
CyC2018 已提交
438
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/b9d79a5a-e7af-499b-b989-f10483e71b8b.jpg" width="500"/> </div><br>
C
CyC2018 已提交
439

C
CyC2018 已提交
440
每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。
C
CyC2018 已提交
441

C
CyC2018 已提交
442
如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。
C
CyC2018 已提交
443

C
CyC2018 已提交
444
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/8006a450-6c2f-498c-a928-c927f758b1d0.png" width="700"/> </div><br>
C
CyC2018 已提交
445

C
CyC2018 已提交
446
## 网际控制报文协议 ICMP
C
CyC2018 已提交
447

C
CyC2018 已提交
448
ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。
C
CyC2018 已提交
449

C
CyC2018 已提交
450
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/e3124763-f75e-46c3-ba82-341e6c98d862.jpg" width="500"/> </div><br>
C
CyC2018 已提交
451

C
CyC2018 已提交
452
ICMP 报文分为差错报告报文和询问报文。
C
CyC2018 已提交
453

C
CyC2018 已提交
454
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/aa29cc88-7256-4399-8c7f-3cf4a6489559.png" width="600"/> </div><br>
C
CyC2018 已提交
455

C
CyC2018 已提交
456
### 1. Ping
C
CyC2018 已提交
457

C
CyC2018 已提交
458
Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。
C
CyC2018 已提交
459

C
CyC2018 已提交
460
Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。
C
CyC2018 已提交
461

C
CyC2018 已提交
462
### 2. Traceroute
C
CyC2018 已提交
463

C
CyC2018 已提交
464
Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。
C
CyC2018 已提交
465

C
CyC2018 已提交
466
Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。
C
CyC2018 已提交
467

C
CyC2018 已提交
468 469 470 471
- 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文;
- 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。
- 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
- 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。
C
CyC2018 已提交
472

C
CyC2018 已提交
473
## 虚拟专用网 VPN
C
CyC2018 已提交
474

C
CyC2018 已提交
475
由于 IP 地址的紧缺,一个机构能申请到的 IP 地址数往往远小于本机构所拥有的主机数。并且一个机构并不需要把所有的主机接入到外部的互联网中,机构内的计算机可以使用仅在本机构有效的 IP 地址(专用地址)。
C
CyC2018 已提交
476 477 478

有三个专用地址块:

C
CyC2018 已提交
479 480 481
- 10.0.0.0 \~ 10.255.255.255
- 172.16.0.0 \~ 172.31.255.255
- 192.168.0.0 \~ 192.168.255.255
C
CyC2018 已提交
482

C
CyC2018 已提交
483
VPN 使用公用的互联网作为本机构各专用网之间的通信载体。专用指机构内的主机只与本机构内的其它主机通信;虚拟指好像是,而实际上并不是,它有经过公用的互联网。
C
CyC2018 已提交
484

C
CyC2018 已提交
485
下图中,场所 A 和 B 的通信经过互联网,如果场所 A 的主机 X 要和另一个场所 B 的主机 Y 通信,IP 数据报的源地址是 10.1.0.1,目的地址是 10.2.0.3。数据报先发送到与互联网相连的路由器 R1,R1 对内部数据进行加密,然后重新加上数据报的首部,源地址是路由器 R1 的全球地址 125.1.2.3,目的地址是路由器 R2 的全球地址 194.4.5.6。路由器 R2 收到数据报后将数据部分进行解密,恢复原来的数据报,此时目的地址为 10.2.0.3,就交付给 Y。
C
CyC2018 已提交
486

C
CyC2018 已提交
487
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/1556770b-8c01-4681-af10-46f1df69202c.jpg" width="800"/> </div><br>
C
CyC2018 已提交
488

C
CyC2018 已提交
489
## 网络地址转换 NAT
C
CyC2018 已提交
490

C
CyC2018 已提交
491
专用网内部的主机使用本地 IP 地址又想和互联网上的主机通信时,可以使用 NAT 来将本地 IP 转换为全球 IP。
C
CyC2018 已提交
492

C
CyC2018 已提交
493
在以前,NAT 将本地 IP 和全球 IP 一一对应,这种方式下拥有 n 个全球 IP 地址的专用网内最多只可以同时有 n 台主机接入互联网。为了更有效地利用全球 IP 地址,现在常用的 NAT 转换表把传输层的端口号也用上了,使得多个专用网内部的主机共用一个全球 IP 地址。使用端口号的 NAT 也叫做网络地址与端口转换 NAPT。
C
CyC2018 已提交
494

C
CyC2018 已提交
495
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/2719067e-b299-4639-9065-bed6729dbf0b.png" width=""/> </div><br>
C
CyC2018 已提交
496

C
CyC2018 已提交
497
## 路由器的结构
C
CyC2018 已提交
498 499 500 501 502

路由器从功能上可以划分为:路由选择和分组转发。

分组转发结构由三个部分组成:交换结构、一组输入端口和一组输出端口。

C
CyC2018 已提交
503
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/c3369072-c740-43b0-b276-202bd1d3960d.jpg" width="600"/> </div><br>
C
CyC2018 已提交
504

C
CyC2018 已提交
505
## 路由器分组转发流程
C
CyC2018 已提交
506

C
CyC2018 已提交
507 508 509 510 511 512
- 从数据报的首部提取目的主机的 IP 地址 D,得到目的网络地址 N。
- 若 N 就是与此路由器直接相连的某个网络地址,则进行直接交付;
- 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给表中所指明的下一跳路由器;
- 若路由表中有到达网络 N 的路由,则把数据报传送给路由表中所指明的下一跳路由器;
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;
- 报告转发分组出错。
C
CyC2018 已提交
513

C
CyC2018 已提交
514
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/1ab49e39-012b-4383-8284-26570987e3c4.jpg" width="800"/> </div><br>
C
CyC2018 已提交
515

C
CyC2018 已提交
516
## 路由选择协议
C
CyC2018 已提交
517 518 519

路由选择协议都是自适应的,能随着网络通信量和拓扑结构的变化而自适应地进行调整。

C
CyC2018 已提交
520
互联网可以划分为许多较小的自治系统 AS,一个 AS 可以使用一种和别的 AS 不同的路由选择协议。
C
CyC2018 已提交
521 522 523

可以把路由选择协议划分为两大类:

C
CyC2018 已提交
524 525
- 自治系统内部的路由选择:RIP 和 OSPF
- 自治系统间的路由选择:BGP
C
CyC2018 已提交
526

C
CyC2018 已提交
527
### 1. 内部网关协议 RIP
C
CyC2018 已提交
528

C
CyC2018 已提交
529
RIP 是一种基于距离向量的路由选择协议。距离是指跳数,直接相连的路由器跳数为 1。跳数最多为 15,超过 15 表示不可达。
C
CyC2018 已提交
530

C
CyC2018 已提交
531
RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。
C
CyC2018 已提交
532 533 534

距离向量算法:

C
CyC2018 已提交
535 536 537 538 539
- 对地址为 X 的相邻路由器发来的 RIP 报文,先修改报文中的所有项目,把下一跳字段中的地址改为 X,并把所有的距离字段加 1;
- 对修改后的 RIP 报文中的每一个项目,进行以下步骤:
 - 若原来的路由表中没有目的网络 N,则把该项目添加到路由表中;
 - 否则:若下一跳路由器地址是 X,则把收到的项目替换原来路由表中的项目;否则:若收到的项目中的距离 d 小于路由表中的距离,则进行更新(例如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);否则什么也不做。
- 若 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为 16。
C
CyC2018 已提交
540

C
CyC2018 已提交
541
RIP 协议实现简单,开销小。但是 RIP 能使用的最大距离为 15,限制了网络的规模。并且当网络出现故障时,要经过比较长的时间才能将此消息传送到所有路由器。
C
CyC2018 已提交
542

C
CyC2018 已提交
543
### 2. 内部网关协议 OSPF
C
CyC2018 已提交
544

C
CyC2018 已提交
545
开放最短路径优先 OSPF,是为了克服 RIP 的缺点而开发出来的。
C
CyC2018 已提交
546

C
CyC2018 已提交
547
开放表示 OSPF 不受某一家厂商控制,而是公开发表的;最短路径优先表示使用了 Dijkstra 提出的最短路径算法 SPF。
C
CyC2018 已提交
548

C
CyC2018 已提交
549
OSPF 具有以下特点:
C
CyC2018 已提交
550

C
CyC2018 已提交
551 552 553
- 向本自治系统中的所有路由器发送信息,这种方法是洪泛法。
- 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示。
- 只有当链路状态发生变化时,路由器才会发送信息。
C
CyC2018 已提交
554

C
CyC2018 已提交
555
所有路由器都具有全网的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程收敛的很快。
C
CyC2018 已提交
556

C
CyC2018 已提交
557
### 3. 外部网关协议 BGP
C
CyC2018 已提交
558

C
CyC2018 已提交
559
BGP(Border Gateway Protocol,边界网关协议)
C
CyC2018 已提交
560

C
CyC2018 已提交
561
AS 之间的路由选择很困难,主要是由于:
C
CyC2018 已提交
562

C
CyC2018 已提交
563 564 565
- 互联网规模很大;
- 各个 AS 内部使用不同的路由选择协议,无法准确定义路径的度量;
- AS 之间的路由选择必须考虑有关的策略,比如有些 AS 不愿意让其它 AS 经过。
C
CyC2018 已提交
566

C
CyC2018 已提交
567
BGP 只能寻找一条比较好的路由,而不是最佳路由。
C
CyC2018 已提交
568

C
CyC2018 已提交
569
每个 AS 都必须配置 BGP 发言人,通过在两个相邻 BGP 发言人之间建立 TCP 连接来交换路由信息。
C
CyC2018 已提交
570

C
CyC2018 已提交
571
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/9cd0ae20-4fb5-4017-a000-f7d3a0eb3529.png" width="600"/> </div><br>
C
CyC2018 已提交
572

C
CyC2018 已提交
573
# 五、传输层
C
CyC2018 已提交
574 575 576

网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。

C
CyC2018 已提交
577
## UDP 和 TCP 的特点
C
CyC2018 已提交
578

C
CyC2018 已提交
579
- 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
C
CyC2018 已提交
580

C
CyC2018 已提交
581
- 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
C
CyC2018 已提交
582

C
CyC2018 已提交
583
## UDP 首部格式
C
CyC2018 已提交
584

C
CyC2018 已提交
585
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/d4c3a4a1-0846-46ec-9cc3-eaddfca71254.jpg" width="600"/> </div><br>
C
CyC2018 已提交
586

C
CyC2018 已提交
587
首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。
C
CyC2018 已提交
588

C
CyC2018 已提交
589
## TCP 首部格式
C
CyC2018 已提交
590

C
CyC2018 已提交
591
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/55dc4e84-573d-4c13-a765-52ed1dd251f9.png" width="700"/> </div><br>
C
CyC2018 已提交
592

C
CyC2018 已提交
593
-  **序号**  :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
C
CyC2018 已提交
594

C
CyC2018 已提交
595
-  **确认号**  :期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
C
CyC2018 已提交
596

C
CyC2018 已提交
597
-  **数据偏移**  :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
C
CyC2018 已提交
598

C
CyC2018 已提交
599
-  **确认 ACK**  :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
C
CyC2018 已提交
600

C
CyC2018 已提交
601
-  **同步 SYN**  :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
C
CyC2018 已提交
602

C
CyC2018 已提交
603
-  **终止 FIN**  :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。
C
CyC2018 已提交
604

C
CyC2018 已提交
605
-  **窗口**  :窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
C
CyC2018 已提交
606

C
CyC2018 已提交
607
## TCP 的三次握手
C
CyC2018 已提交
608

C
CyC2018 已提交
609
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/e92d0ebc-7d46-413b-aec1-34a39602f787.png" width="600"/> </div><br>
C
CyC2018 已提交
610

C
CyC2018 已提交
611
假设 A 为客户端,B 为服务器端。
C
CyC2018 已提交
612

C
CyC2018 已提交
613
- 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
C
CyC2018 已提交
614

C
CyC2018 已提交
615
- A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
C
CyC2018 已提交
616

C
CyC2018 已提交
617
- B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
C
CyC2018 已提交
618

C
CyC2018 已提交
619
- A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。
C
CyC2018 已提交
620

C
CyC2018 已提交
621
- B 收到 A 的确认后,连接建立。
C
CyC2018 已提交
622

C
CyC2018 已提交
623
**三次握手的原因** 
C
CyC2018 已提交
624 625 626 627 628

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。

客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。

C
CyC2018 已提交
629
## TCP 的四次挥手
C
CyC2018 已提交
630

C
CyC2018 已提交
631
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/f87afe72-c2df-4c12-ac03-9b8d581a8af8.jpg" width="600"/> </div><br>
C
CyC2018 已提交
632

C
CyC2018 已提交
633
以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。
C
CyC2018 已提交
634

C
CyC2018 已提交
635
- A 发送连接释放报文,FIN=1。
C
CyC2018 已提交
636

C
CyC2018 已提交
637
- B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
C
CyC2018 已提交
638

C
CyC2018 已提交
639
- 当 B 不再需要连接时,发送连接释放报文,FIN=1。
C
CyC2018 已提交
640

C
CyC2018 已提交
641
- A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
C
CyC2018 已提交
642

C
CyC2018 已提交
643
- B 收到 A 的确认后释放连接。
C
CyC2018 已提交
644

C
CyC2018 已提交
645
**四次挥手的原因** 
C
CyC2018 已提交
646

C
CyC2018 已提交
647
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
C
CyC2018 已提交
648

C
CyC2018 已提交
649
**TIME_WAIT** 
C
CyC2018 已提交
650

C
CyC2018 已提交
651
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:
C
CyC2018 已提交
652

C
CyC2018 已提交
653
- 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
C
CyC2018 已提交
654

C
CyC2018 已提交
655
- 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
C
CyC2018 已提交
656

C
CyC2018 已提交
657
## TCP 可靠传输
C
CyC2018 已提交
658

C
CyC2018 已提交
659
TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。
C
CyC2018 已提交
660

C
CyC2018 已提交
661
一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:
C
CyC2018 已提交
662

C
CyC2018 已提交
663
<div align="center"><img src="https://latex.codecogs.com/gif.latex?RTTs=(1-a)*(RTTs)+a*RTT"/></div> <br>
C
CyC2018 已提交
664

C
CyC2018 已提交
665
其中,0 ≤ a < 1,RTTs 随着 a 的增加更容易受到 RTT 的影响。
C
CyC2018 已提交
666

C
CyC2018 已提交
667
超时时间 RTO 应该略大于 RTTs,TCP 使用的超时时间计算如下:
C
CyC2018 已提交
668

C
CyC2018 已提交
669
<div align="center"><img src="https://latex.codecogs.com/gif.latex?RTO=RTTs+4*RTT_d"/></div> <br>
C
CyC2018 已提交
670

C
CyC2018 已提交
671
其中 RTT<sub>d</sub> 为偏差的加权平均值。
C
CyC2018 已提交
672

C
CyC2018 已提交
673
## TCP 滑动窗口
C
CyC2018 已提交
674

C
CyC2018 已提交
675
窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
C
CyC2018 已提交
676 677 678

发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。

C
CyC2018 已提交
679
接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
C
CyC2018 已提交
680

C
CyC2018 已提交
681
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/a3253deb-8d21-40a1-aae4-7d178e4aa319.jpg" width="800"/> </div><br>
C
CyC2018 已提交
682

C
CyC2018 已提交
683
## TCP 流量控制
C
CyC2018 已提交
684 685 686

流量控制是为了控制发送方发送速率,保证接收方来得及接收。

C
CyC2018 已提交
687
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
C
CyC2018 已提交
688

C
CyC2018 已提交
689
## TCP 拥塞控制
C
CyC2018 已提交
690 691 692

如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。

C
CyC2018 已提交
693
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/51e2ed95-65b8-4ae9-8af3-65602d452a25.jpg" width="500"/> </div><br>
C
CyC2018 已提交
694

C
CyC2018 已提交
695
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
C
CyC2018 已提交
696 697 698 699 700

发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。

为了便于讨论,做如下假设:

C
CyC2018 已提交
701 702
- 接收方有足够大的接收缓存,因此不会发生流量控制;
- 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。
C
CyC2018 已提交
703

C
CyC2018 已提交
704
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/910f613f-514f-4534-87dd-9b4699d59d31.png" width="800"/> </div><br>
C
CyC2018 已提交
705

C
CyC2018 已提交
706
### 1. 慢开始与拥塞避免
C
CyC2018 已提交
707

C
CyC2018 已提交
708
发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 ...
C
CyC2018 已提交
709

C
CyC2018 已提交
710
注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。
C
CyC2018 已提交
711

C
CyC2018 已提交
712
如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。
C
CyC2018 已提交
713

C
CyC2018 已提交
714
### 2. 快重传与快恢复
C
CyC2018 已提交
715

C
CyC2018 已提交
716
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M<sub>1</sub> 和 M<sub>2</sub>,此时收到 M<sub>4</sub>,应当发送对 M<sub>2</sub> 的确认。
C
CyC2018 已提交
717

C
CyC2018 已提交
718
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M<sub>2</sub>,则 M<sub>3</sub> 丢失,立即重传 M<sub>3</sub>
C
CyC2018 已提交
719

C
CyC2018 已提交
720
在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。
C
CyC2018 已提交
721

C
CyC2018 已提交
722
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。
C
CyC2018 已提交
723

C
CyC2018 已提交
724
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/f61b5419-c94a-4df1-8d4d-aed9ae8cc6d5.png" width="600"/> </div><br>
C
CyC2018 已提交
725

C
CyC2018 已提交
726
# 六、应用层
C
CyC2018 已提交
727

C
CyC2018 已提交
728
## 域名系统
C
CyC2018 已提交
729

C
CyC2018 已提交
730
DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。
C
CyC2018 已提交
731 732 733

域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名。

C
CyC2018 已提交
734
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/b54eeb16-0b0e-484c-be62-306f57c40d77.jpg"/> </div><br>
C
CyC2018 已提交
735

C
CyC2018 已提交
736
DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传来保证可靠性。在两种情况下会使用 TCP 进行传输:
C
CyC2018 已提交
737

C
CyC2018 已提交
738 739
- 如果返回的响应超过的 512 字节(UDP 最大只支持 512 字节的数据)。
- 区域传送(区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据)。
C
CyC2018 已提交
740

C
CyC2018 已提交
741
## 文件传送协议
C
CyC2018 已提交
742

C
CyC2018 已提交
743
FTP 使用 TCP 进行连接,它需要两个连接来传送一个文件:
C
CyC2018 已提交
744

C
CyC2018 已提交
745 746
- 控制连接:服务器打开端口号 21 等待客户端的连接,客户端主动建立连接后,使用这个连接将客户端的命令传送给服务器,并传回服务器的应答。
- 数据连接:用来传送一个文件数据。
C
CyC2018 已提交
747

C
CyC2018 已提交
748
根据数据连接是否是服务器端主动建立,FTP 有主动和被动两种模式:
C
CyC2018 已提交
749

C
CyC2018 已提交
750
- 主动模式:服务器端主动建立数据连接,其中服务器端的端口号为 20,客户端的端口号随机,但是必须大于 1024,因为 0\~1023 是熟知端口号。
C
CyC2018 已提交
751

C
CyC2018 已提交
752
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/03f47940-3843-4b51-9e42-5dcaff44858b.jpg"/> </div><br>
C
CyC2018 已提交
753

C
CyC2018 已提交
754
- 被动模式:客户端主动建立数据连接,其中客户端的端口号由客户端自己指定,服务器端的端口号随机。
C
CyC2018 已提交
755

C
CyC2018 已提交
756
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/be5c2c61-86d2-4dba-a289-b48ea23219de.jpg"/> </div><br>
C
CyC2018 已提交
757 758 759

主动模式要求客户端开放端口号给服务器端,需要去配置客户端的防火墙。被动模式只需要服务器端开放端口号即可,无需客户端配置防火墙。但是被动模式会导致服务器端的安全性减弱,因为开放了过多的端口号。

C
CyC2018 已提交
760
## 动态主机配置协议
C
CyC2018 已提交
761

C
CyC2018 已提交
762
DHCP (Dynamic Host Configuration Protocol) 提供了即插即用的连网方式,用户不再需要去手动配置 IP 地址等信息。
C
CyC2018 已提交
763

C
CyC2018 已提交
764
DHCP 配置的内容不仅是 IP 地址,还包括子网掩码、网关 IP 地址。
C
CyC2018 已提交
765

C
CyC2018 已提交
766
DHCP 工作过程如下:
C
CyC2018 已提交
767

C
CyC2018 已提交
768 769 770 771
1. 客户端发送 Discover 报文,该报文的目的地址为 255.255.255.255:67,源地址为 0.0.0.0:68,被放入 UDP 中,该报文被广播到同一个子网的所有主机上。如果客户端和 DHCP 服务器不在同一个子网,就需要使用中继代理。
2. DHCP 服务器收到 Discover 报文之后,发送 Offer 报文给客户端,该报文包含了客户端所需要的信息。因为客户端可能收到多个 DHCP 服务器提供的信息,因此客户端需要进行选择。
3. 如果客户端选择了某个 DHCP 服务器提供的信息,那么就发送 Request 报文给该 DHCP 服务器。
4. DHCP 服务器发送 Ack 报文,表示客户端此时可以使用提供给它的信息。
C
CyC2018 已提交
772

C
CyC2018 已提交
773
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/bf16c541-0717-473b-b75d-4115864f4fbf.jpg"/> </div><br>
C
CyC2018 已提交
774

C
CyC2018 已提交
775
## 远程登录协议
C
CyC2018 已提交
776

C
CyC2018 已提交
777
TELNET 用于登录到远程主机上,并且远程主机上的输出也会返回。
C
CyC2018 已提交
778

C
CyC2018 已提交
779
TELNET 可以适应许多计算机和操作系统的差异,例如不同操作系统系统的换行符定义。
C
CyC2018 已提交
780

C
CyC2018 已提交
781
## 电子邮件协议
C
CyC2018 已提交
782 783 784

一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。

C
CyC2018 已提交
785 786 787 788 789 790 791 792 793
邮件协议包含发送协议和读取协议,发送协议常用 SMTP,读取协议常用 POP3 和 IMAP。

<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/7b3efa99-d306-4982-8cfb-e7153c33aab4.png" width="700"/> </div><br>

### 1. SMTP

SMTP 只能发送 ASCII 码,而互联网邮件扩充 MIME 可以发送二进制文件。MIME 并没有改动或者取代 SMTP,而是增加邮件主体的结构,定义了非 ASCII 码的编码规则。

<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/ed5522bb-3a60-481c-8654-43e7195a48fe.png" width=""/> </div><br>
C
CyC2018 已提交
794

C
CyC2018 已提交
795
### 2. POP3
C
CyC2018 已提交
796

C
CyC2018 已提交
797 798 799
POP3 的特点是只要用户从服务器上读取了邮件,就把该邮件删除,但是目前改进的 POP3 已经全面支持下载而不删除原邮件。

它的另一个主要特点是:无论你在客户端做了任何操作(如移动、标记),都不会反映到服务器上,也就是只能单方面地从服务器 “读取”。
C
CyC2018 已提交
800

C
CyC2018 已提交
801
### 3. IMAP
C
CyC2018 已提交
802

C
CyC2018 已提交
803 804 805
IMAP 协议中客户端和服务器上的邮件保持同步,如果不手动删除邮件,那么服务器上的邮件也不会被自动删除。IMAP 这种做法可以让用户随时随地去访问服务器上的邮件。

同时它与 POP3 的本质区别在于,在客户端的操作(包括删除)都会反映到服务器上,是一个双向的通信。
C
CyC2018 已提交
806

C
CyC2018 已提交
807
## 常用端口
C
CyC2018 已提交
808

C
CyC2018 已提交
809 810 811 812 813 814 815 816 817 818 819
|应用| 应用层协议 | 端口号 | 传输层协议 | 备注 |
| :---: | :--: | :--: | :--: | :--: |
| 域名解析 | DNS | 53 | UDP/TCP | 长度超过 512 字节时使用 TCP |
| 动态主机配置协议 | DHCP | 67/68 | UDP | |
| 简单网络管理协议 | SNMP | 161/162 | UDP | |
| 文件传送协议 | FTP | 20/21 | TCP | 控制连接 21,数据连接 20 |
| 远程终端协议 | TELNET | 23 | TCP | |
| 超文本传送协议 | HTTP | 80 | TCP | |
| 简单邮件传送协议 | SMTP | 25 | TCP | |
| 邮件读取协议 | POP3 | 110 | TCP | |
| 网际报文存取协议 | IMAP | 143 | TCP | |
C
CyC2018 已提交
820

C
CyC2018 已提交
821
## Web 页面请求过程
C
CyC2018 已提交
822

C
CyC2018 已提交
823
### 1. DHCP 配置主机信息
C
CyC2018 已提交
824

C
CyC2018 已提交
825
- 假设主机最开始没有 IP 地址以及其它信息,那么就需要先使用 DHCP 来获取。
C
CyC2018 已提交
826

C
CyC2018 已提交
827
- 主机生成一个 DHCP 请求报文,并将这个报文放入具有目的端口 67 和源端口 68 的 UDP 报文段中。
C
CyC2018 已提交
828

C
CyC2018 已提交
829
- 该报文段则被放入在一个具有广播 IP 目的地址(255.255.255.255) 和源 IP 地址(0.0.0.0)的 IP 数据报中。
C
CyC2018 已提交
830

C
CyC2018 已提交
831
- 该数据报则被放置在 MAC 帧中,该帧具有目的地址 FF:FF:FF:FF:FF:FF,将广播到与交换机连接的所有设备。
C
CyC2018 已提交
832

C
CyC2018 已提交
833
- 连接在交换机的 DHCP 服务器收到广播帧之后,不断地向上分解得到 IP 数据报、UDP 报文段、DHCP 请求报文,之后生成 DHCP ACK 报文,该报文包含以下信息:IP 地址、DNS 服务器的 IP 地址、默认网关路由器的 IP 地址和子网掩码。该报文被放入 UDP 报文段中,UDP 报文段有被放入 IP 数据报中,最后放入 MAC 帧中。
C
CyC2018 已提交
834

C
CyC2018 已提交
835
- 该帧的目的地址是请求主机的 MAC 地址,因为交换机具有自学习能力,之前主机发送了广播帧之后就记录了 MAC 地址到其转发接口的交换表项,因此现在交换机就可以直接知道应该向哪个接口发送该帧。
C
CyC2018 已提交
836

C
CyC2018 已提交
837
- 主机收到该帧后,不断分解得到 DHCP 报文。之后就配置它的 IP 地址、子网掩码和 DNS 服务器的 IP 地址,并在其 IP 转发表中安装默认网关。
C
CyC2018 已提交
838

C
CyC2018 已提交
839
### 2. ARP 解析 MAC 地址
C
CyC2018 已提交
840

C
CyC2018 已提交
841
- 主机通过浏览器生成一个 TCP 套接字,套接字向 HTTP 服务器发送 HTTP 请求。为了生成该套接字,主机需要知道网站的域名对应的 IP 地址。
C
CyC2018 已提交
842

C
CyC2018 已提交
843
- 主机生成一个 DNS 查询报文,该报文具有 53 号端口,因为 DNS 服务器的端口号是 53。
C
CyC2018 已提交
844

C
CyC2018 已提交
845
- 该 DNS 查询报文被放入目的地址为 DNS 服务器 IP 地址的 IP 数据报中。
C
CyC2018 已提交
846

C
CyC2018 已提交
847
- 该 IP 数据报被放入一个以太网帧中,该帧将发送到网关路由器。
C
CyC2018 已提交
848

C
CyC2018 已提交
849
- DHCP 过程只知道网关路由器的 IP 地址,为了获取网关路由器的 MAC 地址,需要使用 ARP 协议。
C
CyC2018 已提交
850

C
CyC2018 已提交
851
- 主机生成一个包含目的地址为网关路由器 IP 地址的 ARP 查询报文,将该 ARP 查询报文放入一个具有广播目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该以太网帧,交换机将该帧转发给所有的连接设备,包括网关路由器。
C
CyC2018 已提交
852

C
CyC2018 已提交
853
- 网关路由器接收到该帧后,不断向上分解得到 ARP 报文,发现其中的 IP 地址与其接口的 IP 地址匹配,因此就发送一个 ARP 回答报文,包含了它的 MAC 地址,发回给主机。
C
CyC2018 已提交
854

C
CyC2018 已提交
855
### 3. DNS 解析域名
C
CyC2018 已提交
856

C
CyC2018 已提交
857
- 知道了网关路由器的 MAC 地址之后,就可以继续 DNS 的解析过程了。
C
CyC2018 已提交
858

C
CyC2018 已提交
859
- 网关路由器接收到包含 DNS 查询报文的以太网帧后,抽取出 IP 数据报,并根据转发表决定该 IP 数据报应该转发的路由器。
C
CyC2018 已提交
860

C
CyC2018 已提交
861
- 因为路由器具有内部网关协议(RIP、OSPF)和外部网关协议(BGP)这两种路由选择协议,因此路由表中已经配置了网关路由器到达 DNS 服务器的路由表项。
C
CyC2018 已提交
862

C
CyC2018 已提交
863
- 到达 DNS 服务器之后,DNS 服务器抽取出 DNS 查询报文,并在 DNS 数据库中查找待解析的域名。
C
CyC2018 已提交
864

C
CyC2018 已提交
865
- 找到 DNS 记录之后,发送 DNS 回答报文,将该回答报文放入 UDP 报文段中,然后放入 IP 数据报中,通过路由器反向转发回网关路由器,并经过以太网交换机到达主机。
C
CyC2018 已提交
866

C
CyC2018 已提交
867
### 4. HTTP 请求页面
C
CyC2018 已提交
868

C
CyC2018 已提交
869
- 有了 HTTP 服务器的 IP 地址之后,主机就能够生成 TCP 套接字,该套接字将用于向 Web 服务器发送 HTTP GET 报文。
C
CyC2018 已提交
870

C
CyC2018 已提交
871
- 在生成 TCP 套接字之前,必须先与 HTTP 服务器进行三次握手来建立连接。生成一个具有目的端口 80 的 TCP SYN 报文段,并向 HTTP 服务器发送该报文段。
C
CyC2018 已提交
872

C
CyC2018 已提交
873
- HTTP 服务器收到该报文段之后,生成 TCP SYN ACK 报文段,发回给主机。
C
CyC2018 已提交
874

C
CyC2018 已提交
875
- 连接建立之后,浏览器生成 HTTP GET 报文,并交付给 HTTP 服务器。
C
CyC2018 已提交
876

C
CyC2018 已提交
877
- HTTP 服务器从 TCP 套接字读取 HTTP GET 报文,生成一个 HTTP 响应报文,将 Web 页面内容放入报文主体中,发回给主机。
C
CyC2018 已提交
878

C
CyC2018 已提交
879
- 浏览器收到 HTTP 响应报文后,抽取出 Web 页面内容,之后进行渲染,显示 Web 页面。
C
CyC2018 已提交
880 881


C
CyC2018 已提交
882
# 参考资料
C
CyC2018 已提交
883

C
CyC2018 已提交
884 885 886 887 888 889 890 891 892 893 894 895 896 897 898
- 计算机网络, 谢希仁
- JamesF.Kurose, KeithW.Ross, 库罗斯, 等. 计算机网络: 自顶向下方法 [M]. 机械工业出版社, 2014.
- W.RichardStevens. TCP/IP 详解. 卷 1, 协议 [M]. 机械工业出版社, 2006.
- [Active vs Passive FTP Mode: Which One is More Secure?](https://securitywing.com/active-vs-passive-ftp-mode/)
- [Active and Passive FTP Transfers Defined - KB Article #1138](http://www.serv-u.com/kb/1138/active-and-passive-ftp-transfers-defined)
- [Traceroute](https://zh.wikipedia.org/wiki/Traceroute)
- [ping](https://zh.wikipedia.org/wiki/Ping)
- [How DHCP works and DHCP Interview Questions and Answers](http://webcache.googleusercontent.com/search?q=cache:http://anandgiria.blogspot.com/2013/09/windows-dhcp-interview-questions-and.html)
- [What is process of DORA in DHCP?](https://www.quora.com/What-is-process-of-DORA-in-DHCP)
- [What is DHCP Server ?](https://tecadmin.net/what-is-dhcp-server/)
- [Tackling emissions targets in Tokyo](http://www.climatechangenews.com/2011/html/university-tokyo.html)
- [What does my ISP know when I use Tor?](http://www.climatechangenews.com/2011/html/university-tokyo.html)
- [Technology-Computer Networking[1]-Computer Networks and the Internet](http://www.linyibin.cn/2017/02/12/technology-ComputerNetworking-Internet/)
- [P2P 网络概述.](http://slidesplayer.com/slide/11616167/)
- [Circuit Switching (a) Circuit switching. (b) Packet switching.](http://slideplayer.com/slide/5115386/)
C
CyC2018 已提交
899 900 901 902




C
CyC2018 已提交
903 904
</br><div align="center">⭐️欢迎关注我的公众号 CyC2018,在公众号后台回复关键字 📚 **资料** 可领取复习大纲,这份大纲是我花了一整年时间整理的面试知识点列表,不仅系统整理了面试知识点,而且标注了各个知识点的重要程度,从而帮你理清多而杂的面试知识点。可以说我基本是按照这份大纲来进行复习的,这份大纲对我拿到了 BAT 头条等 Offer 起到很大的帮助。你们完全可以和我一样根据大纲上列的知识点来进行复习,就不用看很多不重要的内容,也可以知道哪些内容很重要从而多安排一些复习时间。</div></br>
<div align="center"><img width="180px" src="https://cyc-1256109796.cos.ap-guangzhou.myqcloud.com/%E5%85%AC%E4%BC%97%E5%8F%B7.jpg"></img></div>