1. 计算机网络体系结构
1.1 计算机网络的主要功能
- 硬件资源共享
- 可以在全网范围内提供对处理资源、存储资源、输入输出资源等昂贵设备的共享,使用户节省投资,也便于集中管理和均衡分担负荷。
- 软件资源共享
- 允许互联网上的用户远程访问各类大弄数据库,可以得到网络文件传送服务、远地进程管理服务 和远程文件访问服务,从而避免软件研制上的重复劳动以及数据资源的重复存贮,也便于集中管理。
- 用户间信息交换
- 计算机网络为分布在各地的用户提供了强有力的通信手段。用户可以通过计算机网络传送电子邮件、发布新闻消息和进行电子商务活动。
- 分布式处理
- 当计算机网络中某个计算机系统负荷过重时,可以将其处理的某个复杂任务分配给网络中的其他计算机系统,从而利用空闲计算机资源以提高整个系统的利用率。
1.2 主机间的通信方式
- 客户-服务器(C/S)
- 客户是服务请求方,服务器是服务的提供方。
- 对等(P2P)
- 不区分客户和服务器。
1.3 电路交换,报文交换和分组交换的区别
电路交换、报文交换和分组交换是三种不同的通信方式,用于在网络中传输数据。它们在数据传输的方式、效率和适用场景上有明显的区别。
电路交换
- 电路交换是一种传统的通信方式,主要用于电话网络。包括建立连接、传输数据和断开连接三个阶段。一旦建立了这条电路,通信双方可以独占这条路径进行数据传输,直到通信结束。
- 特点:
- 专用通道:通信开始前需要建立一条固定的通道,通道独占,直到通信结束。
- 实时性强:数据传输是连续的,适合实时通信,如语音通话。
- 资源利用率低:即使在通信过程中没有数据传输,这条通道仍然被占用,导致资源利用效率较低。
报文交换
- 将整个报文转发到相邻结点,全部存储下来,查找转发表,转发到下一个结点。是存储-转发类型的网络。
- 特点:
- 无专用通道:不需要在发送端和接收端之间建立专用通道。
- 灵活性高:数据可以根据网络状况选择不同的路径传输。
- 延时较大:因为中间节点需要存储和转发整个报文,可能导致较大的传输延时。
分组交换
- 分组交换是将数据分割成较小的分组(数据包)进行传输,每个分组包含目的地址等控制信息。每个分组独立在网络中传输,可能经过不同的路径到达目的地。到达目的地后,分组会被重新组装成原始数据。
- 特点:
- 高效利用网络资源:分组交换允许多个用户共享网络带宽,数据包可以在不同路径上进行传输,提高了网络资源的利用率。
- 鲁棒性强:如果某条路径发生故障,数据包可以通过其他路径传输,提高了传输的可靠性。
- 适用于突发性流量:分组交换非常适合互联网等网络流量较为突发的场景,如网页浏览和数据传输。

1.4 计算机网络的主要性能指标
宽带(Bandwidth)
- 原本表示通信线路允许通过的信号频带范围。在计算机网络中,表示网络的通信线路所能传送数据的能力,是能传送的“最高数据率”的同义词,单位是比特每秒(b/s)。
时延(Delay)
- 排队时延:分组在路由器的输入队列和输出队列中排队等待的时间,取决于网络当前的通信量。
- 处理时延:主机或者路由器收到分组时进行处理所需要的时间,例如分析首部、从分组中提取数据、进行差错检验或查找适当的路由等。
- 传输时延:传输时延又称为发送时延,表示结点将分组所有比特推向链路所需要的时间。
- 传播时延:电磁波在信道中传播所需要花费的时间,电磁波传播的速度接近光速。
$$
\text{总时延} = \text{排队时延} + \text{处理时延} + \text{传输时延} + \text{传播时延}
$$
- 时延宽带积
- 指的是发送端发送的第一个比特即将到达终点时,发送端已经发送了多少个比特,因此又称以比特为单位的链路长度,即 \(\text{时延宽带积}=\text{传播时延} \times \text{信道带宽}\)。
1.5 ISO/OSI 参考模型和TCP/IP 模型
TCP/IP 网络模型总览
同一台设备的的进程间通信方式有很多,比如管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通信,又由于设备是多样的,所以要兼容各种各样的设备,就协商出一套通用的网络协议。
应用层(Application Layer)
最上层的,就是直接能接触到的应用层(OSI:应用层+ 表示层+ 会话层),设备是使用的应用软件都是在应用层实现。当两个设备需要通信时,应用就把应用数据传给下一层,即传输层。所以,应用层只需要专注于为用户提供应用功能,比如HTTP
、FTP
、DNS
、SMTP
等。
传输层(Transport Layer)
应用层的数据包会传给传输层,传输层是为应用层提供网络支持的。在传输层会有两个传输协议,分别是TCP
和UDP
。
TCP
全称叫传输控制协议(Transmission Control Protocol),大部分应用使用的正是TCP
传输层协议,比如HTTP
协议。TCP
相比UDP
多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠的传输给对方。
UDP
与TCP
相比就简单许多,该协议只负责转发数据包,不保证数据能够送到接收方,因此其实时性相对更好,传输的效率也更高。
应用需要传输的数据可能会非常大,因此如果在传输层直接传输就不好控制,因此当传输层的数据包大小超过MSS(TCP 最大报文段长度),就要将数据分段,即使某个分段丢失或损坏,也只需要重新发送这一分块,而不是重新发送整个数据包。其中在TCP
协议中,称之为TCP 端。
当设备需要接收数据时,传输层要负责把数据包传给应用,此时就需要使用端口来将应用区分开来。常见的端口比如80
端口通常是Web 服务器用的,22
端口通常是远程登录服务器用的。浏览器中每个标签栏都是一个独立的进程,操作系统会给这些进程分配临时的端口号。
网络层(Internet Layer)
实际场景中的网络错综复杂。如果一个设备数据要传送给另一个设备,就需要在各种各样的结点中选择,然而,传输层的设计理念是简单、高效、专注,如果传输层还负责这一块功能就会违背设计的原则,即传输层只负责服务号应用即可,让其作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际传输功能为其下一层,也就是网络层。
网络层最常使用的协议是 IP 协议(Internet Protocal),该协议将传输层的报文作为数据部分,再加上IP包头组装成 IP 报文,如果 IP 报文长度超过 MTU( 以太网一般为 1500 字节)就会再次分片,得到一个即将发送到网络的 IP 报文。

网络层一般使用 IP 地址给设备进行编号,对于 IPv4 协议,IP 地址共 32 位,分为四段,每段 8 位。每个 IP 地址由网络号和主机号组成。
- 网络号:负责标识该 IP 地址属于哪个子网。
- 主机号:负责标识同一个子网下的不同主机。
那么哪几位为网络号?哪几位为主机号?此时就需要使用子网掩码进行计算。计算方式为将 IP 地址与子网掩码进行按位与运算,就可以得到网络号;子网掩码取反后与 IP 地址进行按位与运算,就可以得到主机号。
IP 地址除了寻址,还有一个功能就是路由。路由器在寻址的过程中,就是要找到目标地址的子网,找到后进而把数据包转发给对应的网络去。
总结,IP 协议的寻址功能就是告诉报文下一个目的地该朝哪个方向走,路由则是根据下一个目的地选择路径。
网络接口层(Link Layer)
有了 IP 地址后,接下来就要交给数据链路层(数据链路层 + 物理层),在 IP 报文的加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。
为何有了 IP 地址,还需要加入 MAC 地址,这是因为以太网其实是一种局域网,把附近的设备连接起来,从而进行通信的技术,在判断网络包是否到达目的地时,必须采用相匹配的方式才能在以太网中将包发往目的地,因此需要使用 MAC 头部中的 MAC 地址,该地址可以通过ARP
协议获取对方的 MAC 地址。
总结,数据链路层主要是为网络层提供链路级别的数据传输服务,在底层网络上发送数据包,工作在网卡这个层次,使用 MAC 地址来标识网络上的设备。

数据链路层的传输单位是帧(frame),网络层的传输单位是包(packet),运输层的传输单位是段(segment),应用层的传输单位则是消息或报文(message),所有的名词可以统称为数据包。
2. 应用层
2.1 应用层总览
2.2 DNS 域名解析协议
域名解析就是把域名映射成 IP 地址或把 IP 地址映射成域名的过程。前者为正向解析,后者称为反向解析。当客户端需要域名解析时,通过本机 DNS 客户端构造一个 DNS 请求报文,以 UDP
数据报方式发送到本地域名服务器。解析的方式有两种:
- 递归查询
- 递归与迭代相结合的查询
其中递归与迭代相结合的查询方式更为常见,其工作流程如下:
- 客户端首先会发送一个 DNS 请求给本地域名服务器,目的是让本地域名服务器替本地主机查询服务器的 IP 地址。
- 本地域名服务器收到客户端的请求后,首先会在缓存中寻找时候有对应的
< 域名, IP>
,如果有则直接返回 IP 地址;如果没有,本地 DNS 会去访问其根域名服务器。 - 根域名服务器并不会直接替其递归查询目标 IP 地址,而是查询顶级域名服务器的 IP 地址并返回顶级域名服务器的 IP 地址给本地域名服务器。本地域名服务器根据收到的顶级域名服务器 IP 地址,接着发送询问请求。
- 顶级域名服务器也并不会替其递归查询目标 IP 地址,而是返回对应的权威域名服务器的 IP 地址给本地域名服务器。本地服务器接着询问权威服务器。
- 权威服务器知道目标服务器的 IP 地址,因此返回给本地域名服务器目标服务器的 IP 地址。
- 本地域名服务器再将目标服务器的 IP 地址返回给客户端。至此,客户端完成 DNS 解析。

2.3 FTP 文件传输协议
文件传输协议(File Transfer Protocol,FTP)是因特网上使用的最广泛的文件传输协议。FTP 提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限,适用于异构网络中任意计算机之间传送文件。FTP 提供以下功能:
- 提供不同种类主机系统之间的文本传输能力。
- 以用户权限管理的方式提供用户对远程 FTP 服务器上的文件管理能力。
- 以匿名 FTP 的方式提供公用文件共享的能力。
FTP 采用 C/S 工作方式,使用TCP
进行可靠传输服务。一个 FTP 服务器进程可以同时为多个客户进程提供服务。FTP 的服务器进程分为两大部分组成:一个主进程,负责接收新的请求;另外有若干从属进程,负责处理单个请求。工作步骤如下:
- 服务器打开21 号端口,使客户进程能够连接上。
- 等待客户进程发连接请求。
- 启动从属进程来处理客户进程发来的请求。主进程与从属进程并发执行,从属进程对客户进程的请求处理完毕后即终止。
- 回到等待状态,继续接收其他客户进程的请求。
2.4 SMTP 简单邮件传输协议
简单邮件传输协议(Simple Mail Transfer Protocol, SMTP) 是一种提供可靠且有效的电子邮件传输的协议,它控制两个相互通信的 SMTP 进程交换信息。由于 SMTP 使用 C/S 方式,因此负责发送邮件的 SMTP 进程就是SMTP 客户,而负责接收邮件的 SMTP 进程就是 SMTP 服务器。SMTP 用的是TCP
连接,端口号为25 。
2.5 POP3 邮局协议
邮局协议(Post Office Protocol, POP) 是一个非常简单但功能有限的邮件读取协议,POP3 采用的是拉(Pull) 的通信方式,当用户读取邮件时,用户代理向邮件服务器发出请求,POP 也使用 C/S 的工作方式,在传输层使用TCP
, 端口号为110 。
随着万维网的流行,目前出现了很多基于万维网的电子邮件,如Hotmail
、Gmail
等。这种电子 邮件的特点是,用户浏览器与Hotmail
或Gmail
的邮件服务器之间的邮件发送或接收使用的是 HTTP
, 而仅在不同邮件服务器之间传送邮件时才使用SMTP
。
2.6 HTTP 超文本传输协议
HTTP 定义了浏览器怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。
那么当浏览器键入网址后,到网页显示,期间发生了什么呢?
HTTP :解析URL
首先浏览器做的第一步工作就是将网址进行解析,只有解析完了网址,才知道请求信息需要发送到哪个服务器。一个URL 通常由这么几个部分构成http://Web服务器地址/目录名/文件名
,其中目录名/文件名
是可以被省略掉的,没有路径名时,就代表访问根目录下默认文件。根据 URL 拆分得到如下几个部分:
- 数据协议:URL开头的部分,即
http:
- 服务器地址:// 后面的字符串标识服务器地址
- 数据源路径名:服务器地址后跟着的路径名
对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,根据这些信息生成 HTTP 请求消息。
DNS :查询IP 地址
再发送 HTTP 请求信息之前,还有一项工作,即查询服务器域名对应的IP地址,因为委托操作系统发送消息时,必须提供通信对象的 IP 地址。因此,DNS 服务器就派上用场了。当然,并不是每次都需要这个步骤,如果缓存中有对应的域名,就无需进行 DNS 解析,直接返回该域名对应的 IP 地址。
协议栈:分层管理
得到了目标服务器的 IP 地址后,就可以把 HTTP 的传输工作交给操作系统的协议栈。协议栈分为好几个部分,分别承担自己的工作,上面的部分会向下面委托工作,下面的部分收到委托的工作并执行。
浏览器通过调用Socket
库,来委托协议栈工作。其中上半部分为负责收发数据的TCP
与UDP
协议,受到应用层的委托执行收发数据的操作;下半部分用IP
协议控制网络包收发操作,在互联网上传数据时,切分成数据包,而将网络包发送给对方的操作就是由IP
负责的。
其中IP
还包括其他协议:
ICMP
用于告知网络包传送过程中产生的错误以及各种控制信息。ARP
用于根据 IP 地址查询对应的以太网 MAC 地址。
Notice:虽然
ARP
协议需要使用 IP 地址进行工作,但是其仍然为数据链路层的协议,这是因为ARP
的主要功能是处理局域网内的地址解析,直接影响数据链路层的操作。( 计算机考研 408 中 ARP 是网络层的协议)
IP 下面的网卡驱动负责控制网卡硬件,网卡负责完成实际的数据收发操作。
TCP :可靠传输
HTTP
是基于TCP
的协议传输的,首先根据TCP
的报文头部查看需要哪些字段信息。

- 源端口和目的端口:用来标识发送给主机上哪个应用程序的。
- 序号:为了解决包乱序的问题,给数据标号。
- 确认号:目的是确认发出去对方是否有收到。如果没有收到就应该重新发送,用于解决发送过程中出现的丢包问题。
- 状态位:
TCP
是面向连接的服务,因此双方需要维护连接状态,因此标识就起到了很重要的作用,如SYN
标识发起一个请求,ACK
是回复,RST
是重新连接,FIN
是结束连接…… - 窗口大小:
TCP
要实现流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够处理能力。
除了流量控制,TCP
还会用拥塞控制,控制发送速度。
TCP
传输数据之前,还要进行三次握手建立连接。

三次握手的流程如下:
- 客户端和服务端都处于
CLOSED
状态,先是服务器主动监听某个端口,处于LISTEN
状态。 - 客户端主动发起连接
SYN
,之后处于SYN-SENT
状态。 - 服务器接收到连接请求,返回
SYN
,并且ACK
客户端的SYN
,之后处于SYN-RCVD
状态。 - 客户端收到服务端发送的
SYN
和ACK
之后,发送对SYN
确认的ACK
,之后处于ESTABLISHED
状态。因为完成一发收。 - 服务端收到
ACK
之后,处于ESTABLISHED
状态,因为完成一发收。
所以三次握手目的是保证双方都有发送和接收的能力。
IP : 远程定位
TCP
需要委托IP
将数据封装成数据包发送给通信对象。IP
的头部组成部分如下所示。

- 源地址和目标地址:前者即客户端的输入的 IP 地址;后者即目标主机的 IP 地址。
- 协议号:由于
HTTP
是使用TCP
传输的,因此数据包头部需要填写0x06
,标识协议为TCP
。
MAC :两点传输
生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部。MAC 头部是以太网的头部,它包含了接收方和发送方的 MAC 地址等信息。
在 MAC 包头里需要发送方MAC地址和接收方MAC地址,用于两点传输。一般在 TCP/IP 通信中,MAC 包头的协议类型只使用:
- IP 协议:0x0800
- ARP 协议:0x0806
此时的数据已经被封装成如下形式:

那么如何获取接收方的 MAC 地址呢?
此时就会用到 ARP 协议,ARP 协议会在以太网中以广播的形式发送”Who has ··· IP ? Tell me ··· IP” ,对以太网所有的设备发送 ARP 请求。

如果对方和自己处于同一个子网中,那么通过上面的操作就可以得到对方的 MAC 地址。然后,我们将这个 MAC 地址写入 MAC 头部,MAC 头部就完成了。
当然,并不是每次转发网络包都要使用 ARP 协议,只要查询过一次<IP, MAC>
就会将其存放到 ARP 缓存中去方便之后使用,只不过缓存的时间就几分钟。
也就是说,网络包实际的请求过程为:
- 先查询 ARP 缓存,如果其中保存了对方的 MAC 地址,那么就不需要使用 ARP 查询,直接拿来使用。
- 否则,就使用 ARP 请求广播去请求对方的 MAC 地址。
网卡:发送出口
网络包只是存放在内存中的一串二进制编码。因此,想要发送这些信息,需要将数字信号转换为电信号,才能在网线上传输,这才是真正的数据发送过程。
负责这一操作的是网卡,要控制网卡还需要靠网卡驱动程序。网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列(FCS)。
- 起始帧分界符:标识包起始位置的标记
- FCS:用于差错检验
交换机:送别者
交换机的设计是将网络包原样转发到目的地。其工作在 MAC 层。其工作过程如下:
- 电信号到达网线接口,交换机里的模块进行接收,将电信号转换为数字信号。
- 通过末尾的 FCS 校验差错,如果没有问题则放到缓冲区。
- 存入缓冲区之后,查询这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录。交换机的 MAC 地址表主要包含两个信息:
- 设备的 MAC 地址
- 该设备连接在交换机的哪一个端口上
- 如果查询到了对应的 MAC 地址,则发送到对应的端口上;否则,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。
此外,如果接收到的 MAC 地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口。
- MAC 地址中的广播:
FF:FF:FF:FF:FF:FF
- IP 地址中的广播:
255.255.255.255
路由器:处境大门
路由器的转发工作原理和交换机类似,也是通过查表判断包转发的目标。但在具体的操作过程,两者有些区别:
- 路由器基于 IP 设计:俗称三层网络设备,其各个端口都具有 MAC 地址和 IP 地址。
- 交换机基于 MAC 设计:俗称二层网络设备,其端口不具有 MAC 地址。
以下分解路由器转发包的过程:
- 首先路由器端口会接收发给自己的以太网包,首先将其转化为数字信号,通过包末尾的 FCS 进行错误校验,如果校验不通过则丢弃该包。
- 接着检查 MAC 地址的接受方是否为自己,如果不是路由器端口的 MAC 地址,则丢弃;否则将数据包放入缓冲区中。
- 完成包接收工作后,路由器就会去掉包开头的 MAC 头部。MAC 头部的作用就是将包送达路由器,因此其任务已经完成。接着路由器会根据 MAC 头部后方的 IP 头部中的内容进行包转发,转发通过查询路由表判断下一步转发的目标。

- 根据匹配得到的路由条目判断对方的地址,一共有两种情况:
- 如果网关是一个 IP 地址,则这个 IP 地址就是要转发到的目标地址,还未到达目标网络,需要继续路由转发。
- 如果网关未空,则 IP 头部的接收方 IP 地址就是要转发的目标地址,也是找到了目标网络。
- 由于之前丢弃了 MAC 头部,因此还需要通过 ARP 协议根据 IP 地址查询目标的 MAC 地址,将查询的结果作为接收方的 MAC 地址。通过 ARP 协议或者缓存中获取到了目标的 MAC 地址,那么需要源 MAC 地址,这个地址就是发送端口的 MAC 地址,再加以太类型字段,填写
0x0800
表示 IP 协议。 - 网络包完成后,接下来会将其转换成电信号并通过端口发送出去。
- 如果已经在目标网络,那么通过交换机转发就能到达目的地;否则,还需要通过路由器转发,直到到达目标网络,最后到达目的地。
服务器与客户端:一个装一个拆
数据包送达到了服务器端口后,会经历如下几个步骤:
- 首先查看数据包的 MAC 头部,是否和服务器自己的 MAC 地址匹配。
- 接着查看数据包的 IP 头,查看 IP 地址是否符合,并且根据 IP 头中的协议项,知道上一层是 TCP 协议。
- 接着查看数据包的 TCP 头,查看序列号,看看序列号是不是想要的,如果是就放入缓存中然后返回一个 ACK,否则就将该包丢弃。TCP 头部里还有端口号,此时 HTTP服务器正监听该端口。
- 服务器接着将该包发送给 HTTP 进程。
- HTTP 进程发现该包要请求网页,于是将这个网页封装在 HTTP 响应报文里。
- HTTP 响应报文加上 TCP、IP、MAC 头部,只是其源地址为服务器 IP 地址,目标地址是客户端 IP 地址。然后从网卡中发送出去。
- 客户端手打送响应数据包后,同样的方式进行拆包,得到 HTTP 响应报文,交给浏览器去渲染页面。
- 最后,客户端向服务器发起 TCP 四次挥手,至此双方的连接就断开了。
3. 传输层
3.1 传输层总览
3.2 传输层的功能
- 传输层提供应用进程之间的逻辑通信,即端到端的通信。与网络层的区别是,网络层提供的是主机之间的逻辑通信。从网络层来说,通信的双方是两台主机,IP 数据报的首部给出了这两台主机的 IP 地址。但两台主机实际上是两台主机中的应用进程之间的通信。
- 复用和分用。复用是指发送方不同的应用进程都可以使用同一个传输层协议传送数据;分用是指接收方的传输层在剥去报文首部后能够把数据正确交付到目标应用程序。
- 传输层会对收到的报文进行差错检验。而网络层只检查 IP 数据包的首部,不检查数据部分是否出错。
- 提供两种不同的传输协议,即面向连接的 TCP 和无连接的 UDP。
3.3 TCP 协议
TCP 头部有哪些字段?
- 序列号:建立连接时生成的随机数作为其初始值,通过 SYN 包传给接收主机,每发送一次数据就累加一次数据字节数的大小。用来解决网络包乱序问题。
- 确认应答号:表示下一次期望收到的数据的序列号,发送端收到这个确认应答以后认为在这个序号以前的数据都已经被正常接收。用来处理丢包问题。
- 控制位标志:
- ACK :置
1
时,表示确认应答字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外都必须置为1
。 - RST :置
1
时,表示 TCP 连接出现异常必须强制断开连接。 - SYN :置
1
时,表示希望建立连接,并在其序列号字段进行序列号初始值设置。 - FIN : 置
1
时,表示之后不会再有数据发送,希望断开连接。断开连接时,双方互相交换 FIN 为1
的 TCP 段。
- ACK :置
为何要使用 TCP 协议
IP
层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。因此就需要上层的TCP
协议去负责可靠性。确保接收到的网络包是无损坏、无间隔、非冗余和按序的。
什么是 TCP 连接?
建立一个 TCP 连接是需要客户端与服务端达成三个信息的共识:
- Socket : 由 IP 地址和端口号组成
- 序列号:用来解决乱序问题等
- 窗口大小:用来做流量控制
TCP 三次握手过程
TCP 是面向连接的协议,所以使用 TCP 前必须建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下所示:

- 客户端随机初始化序号(client_isn),将序号放到 TCP 首部的序号字段中,同时把 SYN 标志位设置为
1
,表示该报文是 SYN 报文。接着发送该报文给服务端。 - 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的序号字段中,其次把 TCP 首部的确认应答号字段填入
client_isn + 1
,接着 SYN 和 ACK 标志位设置为 1。最后把该报文发送给客户端,该报文也不包含应用层数据。 - 客户端收到服务端报文后,返回最后一个应答报文给客户端,首先该应答报文 TCP 首部 ACK 标志位置为
1
,其次确认应答号填入server_isn + 1
,最后发送报文给服务端,这次报文可以携带客户到服务端的数据。
为何 TCP 连接时三次握手?
之所以需要三次握手原因是:
- 三次握手才可以阻止重复历史连接的初始化
- 两次握手的情况下,服务器没有中间状态给客户端来阻止历史连接,导致服务器可能建立一个历史连接,造成资源浪费。为了解决这个问题,就需要在服务器发送数据前,阻止历史连接,所以需要三次握手。
- 三次握手才可以同步双方的初始序号
- 两次握手只能保证一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被正确收到。
- 三次握手才可以避免资源浪费
不使用两次握手和四次握手的原因:
- 两次握手:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步序列号。
- 四次握手:三次握手足够实现连接信息同步,因此没必要使用四次握手。
为什么需要随机初始化序列号?
随机初始化序列号的原因是:
- 为了防止历史报文被下一个相同的四元组的连接接收
- 为了安全性,防止黑客伪造相同序列号的 TCP 报文被对方接收
IP 层能分片,那MSS什么用?
- MTU :一个网络包的最大长度,以太网中为 1500 字节
- MSS : 去除 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度
看似 MSS 的设置没有必要,实则十分重要。这是因为在 IP 层并没有超时重传机制,如果一个 IP 分片丢失,那么整个 IP 报文的所有分片都要重传,如果这个 IP 报文设置的过长,那么会降低重传的效率。所以,在建立连接的时候,通信双方需要协商 MSS 值,如果超过 MSS 就需要对数据进行分片,分完片的数据包不会超过 MTU 所设置的长度,自然也不会在 IP 层进行分片,因此大大增加重传的效率。
TCP 四次挥手过程
TCP 四次握手双方都可以主动断开连接,断开连接后主机中的资源将被释放,过程如下:

- 客户端打算关闭连接,因此发送一个 TCP 首部 FIN 标志置 1 的报文给服务端。
- 服务端收到该报文后,就向客户端发送 ACK 应答报文。
- 等待服务端将数据处理完后,也向客户端发送 FIN 报文。
- 客户端收到服务端的 FIN 报文后,回应一个 ACK 应答报文。
- 服务端收到 ACK 后关闭连接。
- 客户端经过
2MSL
时间后,也关闭连接。
Notice : 主动关闭连接的一方,才有 TIME_WAIT 状态
为什么要设置 TIME_WAIT 状态
- 为了防止历史连接中的数据,被后面相同四元组的连接错误的接收
- 足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的。
- 保证被动关闭连接的一方,能被正确的关闭
- 等待足够的时间以确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭
序列号和确认号如何变化
发送 TCP 报文的规律可以总结如下:
- 公式一:$\text{序列号}=\text{上次发送的序列号} + len(数据长度)$。特殊情况,如果上一次发送的 SYN 报文或是 FIN 报文,则改为 $\text{上次发送的序列号}+1$。
- 公式二:$确认号 = 上一次收到的报文中的序列号 + len(数据长度)$。特殊情况,如果收到的是 SYN 报文或者 FIN 报文,则改为 $\text{上一次收到的报文中的序列号} + 1$。
3.4 UDP协议
3.5 TCP协议与UDP协议区别
- 连接
- TCP 是面向连接的传输层协议,传输数据前先要建立连接。
- UDP 是不需要连接,即刻传输数据。
- 服务对象
- TCP 是一对一的两点服务,即一条连接只有两个端点。
- UDP 支持一对一,一对多,多对多的交互通信。
- 可靠性
- TCP 是可靠交付数据的,数据可以无差错、不丢弃、不重复、按序到达。
- UDP 是尽最大努力交付,不保证可靠交付数据。
- 拥塞控制、流量控制
- TCP 有拥塞控制和流量控制,保证数据传输的安全性。
- UDP 则没有。
- 首部开销
- TCP 首部长度较长,在没有选项字段的是 20 个字节。
- UDP 首部只有 8 个字节,并且固定不变的,开销较小。
- 传输方式
- TCP 是流式传输,没有边界,但保证顺序和可靠。
- UDP 是一个包一个包传输的,有边界,可能会丢包和乱序。
- 分片不同
- TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,到达主机后在传输层组装 TCP 数据包,如果中途丢失了一个分片,只需要重传这个分片。
- UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着传给传输层。
4. 网络层
4.1 网络层总览
4.2 路由器
路由器主要完成两个功能:一个是路由选择(确定哪一条路径),另一个就是分组转发(当一个分组到达时采取的动作)。前者根据路由选择协议构造出路由表,同时经常或定时地和相邻路由器交换路由信息而不断地更新和维护路由表;后者处理通过路由器的数据流,关键操作是转发表查询、转发及相关的队列管理和任务调度。
4.3 路由算法
RIP 距离-向量路由算法
路由信息协议(Routing Information Protocol,RIP )是自治系统内部一个可以使用的路由选择协议,是基于距离向量的路由选择协议,其最大有点就是简单,其规定:
- 网络中的每个路由器都要维护从它自身到其每个目的网络的距离记录。
- 距离也称为跳数,规定从一个路由器到直接连接网络的距离为 1,而经过一个路由器,距离加1。
- RIP 认为好的路由就是通过的路由器的数量少,即优先选择跳数少的路径。
- RIP 允许一条路径最多只能包含 15 个路由器。距离为 16 时则表示网络不可达。因此 RIP 只适用于小型互联网。最高跳数的目的时为了防止数据包不断循环在环路上,减少网络拥塞的可能性。
- RIP 默认在任意两个使用 RIP 的路由器之间每 30s 广播一次 RIP 更新信息,从而实现动态维护。

OSPF 链路状态路由算法
开放最短路径优先(OSPF )协议是使用分布式链路状态由算法的典型代表,也是内部网关协议的一种。与 RIP 相比有以下区别:
- OSPF 向本自治系统中的所有路由器发送信息,这里使用的方法是洪泛法。而 RIP 仅向自己相邻的几个路由器发送信息。
- 发送的信息是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。“ 链路状态 ”说明本路由器和哪些路由器相邻及该链路的代价。而在 RIP 中,发送的信息是本路由器所知道的全部信息,即整个路由表。
- 只有当链路状态发生变化时,路由器才用泛洪法向所有路由器发送此信息,而且更新过程收敛的快,不会出现 RIP “ 坏消息传得慢” 的问题。RIP 中,不管网络拓扑是否发生变化,路由器之间都会定期交换路由表的信息。
除此以外,OSPF 还有其他特点:
- 如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径。被称为负载平衡。
- OSPF 路由器之间交换的分组都具有鉴别能力,因而保证了仅在可依赖的路由器之间交换链路状态信息。
- OSPF 对不同的链路可根据 IP 分组的不同服务类型设置不同的代价。因此,其更加灵活。
BGP 边界网关协议
之所以要使用 BGP 是因为:
- 因特网的规模太大,使得自治系统之间路由选择非常困难。
- 对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。
- 自治系统之间的路由选择必须考虑有关策略。
4.4 IP 层相关协议
ARP 地址解析协议
由于主机的路由表中可以找到下一跳的 IP 地址,所以可以通过 ARP 协议,求得下一跳的 MAC 地址。ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。具体的请求过程如下:
- 主机会广播发送 ARP 请求,这个包包含了想要知道的 MAC 地址的主机的 IP 地址。
- 如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己 MAC 地址放入 ARP 响应包返回给主机。
DHCP 动态主机配置协议
电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程。其主要通过如下几个步骤获取 IP 地址:
- 客户端首先发起DHCP发现报文(DHCP DISCOVER )的数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的地址,因此使用 UDP 进行广播发送,广播目的地址为 255.255.255.255(端口67 )并使用 0.0.0.0(端口68 )作为源 IP 地址。
- DHCP 服务器收到 DHCP 发现报文,用 DHCP 提供报文(DHCP OFFER )向客户端做出响应。此时仍然使用 IP 广播地址。
- 客户端收到一个或多个服务器的 DHCP 提供报文后,从中选择一个服务器,并向选中的服务器发送DHCP 请求报文(DHCP REQUEST )进行响应,回显配置的参数。
- 最后,服务端用 DHCP ACK 后 ,交付完成,并且客户端能够在租用期内使用 DHCP 服务器分配的 IP 地址。
如果租约的 DHCP IP 地址过期后,客户端就会像服务器发送 DHCP 请求报文:
- 服务器如果同意继续租用,则用 DHCP ACK 报文进行应答,客户端就会延长租期。
- 服务器如果不同意继续租用,则用 DHCP NACK 报文,客户端就停止使用租约的 IP 地址。
NAT 网络地址转换
网络地址转换 NAT,是为了缓解 IPv4 地址耗尽的问题。由于绝大多数的网络应用都是使用传输层协议 TCP 或 UDP 来传输数据的,因此,可以把IP 地址 + 端口号
进行转换,实现私有网络地址与端口与公有网络地址与端口的转换。
但是使用 NAT/NAPT 也有缺点,由于其都依赖自己的转换表,因此会有以下问题:
- 外部无法主动与 NAT 内部服务器建立连接,因为 NAPT 转换表没有记录值。
- 转换表的生成与转换表操纵会产生额外的开销
- 如果 NAT 路由器重启,所有的 TCP 连接都要重置。
解决如上问题又两种方法:
- 改用 IPv6增大地址空间。
- NAT 穿透技术,它能够让网络应用程序主动发现自己位于 NAT 设备之后,并且主动获得 NAT 设备的公有 IP,并为自己建立端口映射条目。换种说法,客户端主动从 NAT 设备获取公有 IP 地址,然后自己建立端口映射条目,然后用这个条目对外通信,因此就不需要 NAT 设备进行转换。
ICMP 互联网控制报文协议
ICMP(Internet Control Message Protocol )的主要功能就是确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
ICMP 大致可以分为如下两类:
- 诊断查询信息,即查询报文类型
- 类型 0 :回送应答(Echo Reply)
- 类型 8 :回送请求(Echo Request)
- 通知出错原因的错误信息,即差错报文类型
- 类型 3 :目标不可达(Destination Unreachable)
- 类型 4 :原点抑制(Source Quench)
- 类型 5 : 重定向或改变路由(Redirect)
- 类型 11 :超时(Time Exceeded)
ping 命令是如何执行的?
- 源主机首先会构造一个 ICMP 回送请求信息数据包,其中数据包中有两个重要的字段
- 类型,即回送请求类型 8
- 序号,用于区分连续 ping 时发出的数据包、
- 交付给 IP 层,加上 IP 层头部,构造成一个 IP 数据包。
- 主机 B 收到数据包后,构造一个 ICMP 回送响应消息数据包,其类型为 0 ,序号为请求数据包的序号。
- 在规定时间,源主机没有收到 ICMP 的应答包,则说明目标主机不可达;如果接收到了回送响应消息,则说明目标主机可达。