计算机网络知识合集
1.计算机网络性能指标
- 速率:指的是连接在计算机网络上的主机在数字信道上传输数据的速率。数据量的单位是比特(bit)。速率的单位是b/s,或者写为bps(bit per second),当传输速率高的时候,可以用Kb/s 、Mb/s等表示。
- 带宽:表示链路的最大传输速率,单位是 b/s (比特/秒),带宽越大,其传输能力就越强。
- 延时(时延):表示请求数据包发送之后,收到接收端响应所需要的时长(时间延迟)。总时延=发送时延+传播时延+处理时延+排队时延。
- **吞吐率:**单位时间内成功接收的数据量,单位是b/s、B/s。吞吐率受带宽影响,带宽越大,吞吐率越高。
- **往返时间RTT:**从发送方发送数据,到发送方接收到接收方的确认过程中所经历的总的时间。
除了上述五种基本指标以外,还有一些其他常用的性能指标。
- 网络可用性
- 并发连接数
- 丢包率
- 重传率
2.协议及层次划分
1.OSI七层体系协议模型
2.TCP/IP四层体系模型
3.五层协议模型
3.应用层
3.1关于HTTP协议
3.1.1什么是HTTP
HTTP,即超文本传输协议,全名为 HyperText Transfer Protocol.
HTTP协议是用于客户端和服务端之间的通信,客户端负责发送请求,服务端负责响应请求。
3.1.2HTTP的特点
- 支持客户端、服务器端模式,并且必定有一端为客户端、一端为服务器。
- 简单快速,客户端向服务器端请求服务时,只需传送请求方法和路径。
- HTTP允许传输任意类型的数据对象,无连接(HTTP1.0),限制每次连接只处理一个请求,数据发送万州会立即断开连接。
- 无状态,HTTP协议是无状态协议,指明协议对于事务处理没有记忆能力(有利有弊,可以利用cookie实现状态保存)
1.没有使用cookie时的http连接
2.使用cookie时的http连接
3.1.3HTTP的消息结构
- 请求的消息结构
一个请求消息是由请求行、请求头、一个空行和消息主体构成的。
- 客户端:发送请求
GET/HTTP/1.1
Host: hackr.jp
- **服务端:**响应请求
HTTP/1.1 200 OK
Date: Tue, 10 Jul ...
Content.Length: 362
Content.Type: text/html
<html>
...
- 请求与响应的各个字段
Request URL: 请求的URL地址。
Request Method: 请求方法。
-
GET 请求指定的页面信息,并返回实体主体。
-
HEAD 只用于获取响应头,响应中没有具体的内容。
-
POST 向指定资源提交数据进行处理请求,请求数据包含在请求体中。
-
PUT 向服务器传送的数据取代指定文档的内容。
-
DELETE 请求服务器删除指定的页面。
-
COONNECT HTTP/1.1协议中预留的能够将连接改为管道方式连接的代理服务器。
-
OPTIONS 允许客户端查看服务器的性能。
-
TRACE 回显服务器收到的请求,主要用于调试。
说到请求方法,就不得不提到HTTP的请求幂等性。
1.什么是请求幂等性?
HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。
1.比如前端对同一表单数据的重复提交,后台应该只会产生一个结果。 2.比如我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱。 3.比如发送消息,也应该只发一次,同样的短信如果多次发给用户,用户会崩溃。 4.比如创建业务订单,一次业务请求只能创建一个,不能出现创建多个订单。
Status Code 响应状态码和响应消息
分类 | 分类描述 | |
---|---|---|
1xx | 信息,服务器收到请求,需要请求者继续执行操作。 | |
2xx | 成功,操作被成功接收并处理。 | |
3xx | 重定向,需要进一步的操作以完成请求。 | |
4xx | 客户端错误,请求包含语法错误或者无法完成请求。 | |
5xx | 服务器错误,服务器在处理请求的过程中发生了错误。 |
常见状态码及其含义
常见状态码 | 含义 |
---|---|
200 | 请求成功,已经正常处理完毕。 |
301 | 请求永久重定向,转移到其它URL。 |
301 | 请求临时重定向。 |
304 | 请求被重定向到客户端本地缓存。 |
400 | 客户端请求存在语法错误。 |
403 | 客户端请求被服务器拒绝,一般是因为客户端不具有访问权限。 |
404 | 客户端请求的URL在覅武器不存在。 |
500 | 服务端永久错误。 |
User-Agent 产生请求的浏览器类型
Accept 客户端可以识别 / 接收的内容类型列表
Host 主机地址
响应字段及含义
Server 服务器的版本信息
Content-Type 响应体的类型及编码
Content-Length 响应体字节长度
Set-Cookie 响应给客户端的cookie
Date 响应的时间
3.1.4URL与URI
URI Uniform Resource Identifier,统一资源标识符
URL Uniform Resource Locator,统一资源定位符
URN Uniform Resource Name,统一资源名称
3.1.5 HTTP各个版本的区别
1 HTTP 0.9
URI,统一资源标识符,作为互联网上的唯一标识。
HTML,超文本标记语言,描述超文本。
HTTP ,超文本传输协议,传输超文本。
GET, 只存在一种请求方式。
2 HTTP 1.0
- 请求与响应支持头域
- 响应对象以一个响应状态行开始
- 响应对象不只限于超文本
- 开始支持POST、HEAD、GET方法
- TCP连接依然是短连接
3.HTTP1.1
- 首先,1.1是目前使用的主流版本之一。
- KeepAlive长连接,在请求头中使用
Connection:Keep-Alive
来开启长连接,默认使用长连接。- chunked编码传输,将传输实体分块传送并表明长度,直至长度为0表示结束。
- 字节范围请求,支持范围请求内容,为了节省带宽,可以只向服务器请求部分范围的数据,在请求头中通过
Range
字段来实现。在响应消息中通过Content-Range
来声明返回对象的长度和偏移值。对应响应码为206.- 请求流水线 Pipelining
- 请求方法,增加了
OPTIONS,PUT,DELETE,TRACE,CONNECT
等连接方式。- 缓存处理
- 响应状态码,新增了24个错误状态响应码。
- Host头处理,在请求消息头中增加Host头域,服务器下的主机唯一性标志。
4.HTTP2.0
- 二进制格式传输数据,将1.x中的txt文本传输改为二进制传输。
- HAPCK消息头压缩传输,节省消息头占用的大量网络资源,节省带宽资源。
- 多路复用,通过一个TCP连接并发完成,多个请求之间的响应不会被阻塞。
- 服务端推送,服务端能够更快的把资源推送给客户端,例如常用的JS和CSS文件。
3.2关于HTTPS协议
**前情提要:**HTTP本身不具备加密功能,报文以明文的方式进行传输。
3.2.1目前常用的加密方式
- 通信加密:将HTTP与SSL和TLS组合使用,统称为HTTPS。
- 内容加密:通信双方都具有加密和解密的机制。
过一个TCP连接并发完成,多个请求之间的响应不会被阻塞。
- 服务端推送,服务端能够更快的把资源推送给客户端,例如常用的JS和CSS文件。
3.2关于HTTPS协议
**前情提要:**HTTP本身不具备加密功能,报文以明文的方式进行传输。
3.2.1目前常用的加密方式
- 通信加密:将HTTP与SSL和TLS组合使用,统称为HTTPS。
- 内容加密:通信双方都具有加密和解密的机制。
内容加密
- 对称加密
- 发送方和接收方使用相同的密匙对明文进行加密和解密操作。
- 非对称加密
- 包含公开密匙和私有密匙两种。加密和解密使用的是不同的密匙。
- 例如:当客户端发起连接请求,服务端将公钥传输过去,客户端利用公钥加密好信息,再将密文发送给服务端,服务端里有私钥可以解密。
通信加密
- SSL(Secure Socket Layer)安全套接层和TLS(Transport Layer Security)传输层安全协议。
HTTPS加解密流程
- 用户在浏览器发起HTTPS请求(如 https://www.mogu.com/),默认使用服务端的443端口进行连接;
- HTTPS需要使用一套CA数字证书,证书内会附带一个公钥Pub,而与之对应的私钥Private保留在服务端不公开;
- 服务端收到请求,返回配置好的包含公钥Pub的证书给客户端;
- 客户端收到证书,校验合法性,主要包括是否在有效期内、证书的域名与请求的域名是否匹配,上一级证书是否有效(递归判断,直到判断到系统内置或浏览器配置好的根证书),如果不通过,则显示HTTPS警告信息,如果通过则继续;
- 客户端生成一个用于对称加密的随机Key,并用证书内的公钥Pub进行加密,发送给服务端;
- 服务端收到随机Key的密文,使用与公钥Pub配对的私钥Private进行解密,得到客户端真正想发送的随机Key;
- 服务端使用客户端发送过来的随机Key对要传输的HTTP数据进行对称加密,将密文返回客户端;
- 客户端使用随机Key对称解密密文,得到HTTP数据明文;
- 后续HTTPS请求使用之前交换好的随机Key进行对称加解密。
3.3关于DNS协议
3.3.1什么是DNS
DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。
3.3.2域名的解析过程
假定域名为m.xyz.com的主机想知道另一个主机y.abc.com的IP地址。例如,主机m.xyz.com打算发送邮件给y.abc.com。这时就必须知道主机y.abc.com的IP地址。下面是上图a的几个查询步骤:
1、主机m.abc.com先向本地服务器dns.xyz.com进行递归查询。
2、本地服务器采用迭代查询。它先向一个根域名服务器查询。
3、根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器dns.com的IP地址。
4、本地域名服务器向顶级域名服务器dns.com进行查询。
5、顶级域名服务器dns.com告诉本地域名服务器,下一步应查询的权限服务器dns.abc.com的IP地址。
6、本地域名服务器向权限域名服务器dns.abc.com进行查询。
7、权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
8、本地域名服务器最后把查询结果告诉m.xyz.com。
整个查询过程共用到了8个UDP报文。
为了提高DNS查询效率,并减轻服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
4.传输层
4.1进程间的通信方式
4.2传输层重要协议之一UDP
4.2.1什么是UDP
UDP(User Datagram Protocol)用户数据报协议。
- 传输数据之前不需要建立连接,服务端也不需要在收到数据之后发送确认,是一种不可靠的传输方式。减少了开销和发送数据之前的时延。
- UDP是面向报文的,UDP对应用层交下来的报文,不合并也不拆分,保留报文完整的边界。也就是说,应用层交付UDP多长的报文,UDP就照样发送,即一次只发送一个报文。
- UDP没有拥塞控制,网络发生拥塞时也不会使得发送速率降低,对一些具有实时性要求的场景。
- UDP支持一对一、一对多、多对一、多对多的交互通信。
- UDP首部开销小,只有8个字节,比TCP20个字节的首部短。
4.2.2UDP的首部格式
- 源端口号,发送端的端口号,发送端的IP地址由网络层的IP协议负责添加。
- 目的端口号,接收端的端口号。
- UDP长度,最小值为数据字段为空时,大小为8。
- 校验和,检验在传输过程中是否出现差错,有差错则丢弃。
4.3传输层重要协议之二TCP
4.3.1什么是TCP
TCP(Transfer Control Protocol)传输控制协议
- TCP是面向连接的传输协议,即发送数据之前必须先创建连接。
- TCP是一对一(点对点)的,即每一条TCP连接只能连接两个端点。
- TCP是可靠的传输方式,提供可靠交付的服务。通过TCP传输的数据,无差错、不丢失、不重复、并且按序到达。
- TCP提供全双工通信,TCP允许通信双方在任何时候都能发送数据,在连接的两端设有发送缓存和接收缓存。
- TCP是面向字节流的。
4.3.2 TCP报文段的首部格式
TCP虽然是面向字节流的,但是传输的数据单元依然是报文段。
TCP报文首部的长度是20字节固定。
- 源端口号和目的端口号,各占两个字节。
- 序号,4字节,TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。
- 确认号,4字节,期望收到对方下一个报文段的第一个数据字节的序号。(一般在确认报文中体现)
- 数据偏移,4位,表示着TCP报文段首部的长度。
- 保留,6位,保留今后使用,目前全置为0。
- URG,1位,紧急指针,表示这该传输报文段的紧急程度,如果置为1,则表示接收端应该优先处理。
- ACK,1位,确认位,当ACK位1时说明确认位有效。
- PSH,1位,两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。
- **RST,**复位, 当RST=1时,表名TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
- SYN(SYNchronized),同步,在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文。
- **窗口,4字节,**占2字节。窗口值是【0,2^16-1】之间的整数。窗口指的是接收本报文段的一方的接受窗口(。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
- 校验和,2字节,检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
- 紧急指针,2字节,在URG置为1时才有效,它指出本报文段中的紧急数据的字节数 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。
- **选项,**长度可变,最长可达4字节。
4.3.3 使用TCP和UDP协议的各种应用及应用层协议
应用 | 应用层协议 | 运输层协议 |
---|---|---|
域名IP转换 | DNS | UDP |
文件传送 | TFTP | UDP |
路由选择协议 | RIP | UDP |
IP地址配置 | DHCP | UDP |
网络管理 | SNMP | UDP |
远程文件服务器 | NFS | UDP |
多播 | IGMP | UDP |
电子邮件 | SMTP | TCP |
远程终端接入 | TELNET | TCP |
万维网 | HTTP | TCP |
文件传送 | FTP | TCP |
4.3.4 TCP是如何保证可靠传输的?
-
重传机制
-
超时重传
-
当超过指定时间没有收到接收方的ACK确认报文时就会重传该数据。
-
一下两种情况发生超时重传
- 发送数据包丢失
- 接收的ACK报文丢失
-
超时重传时间(RTO)的设置
- RTO的值应该略大于RTT往返时延的值。
- RTO较大:超时重传就会变慢,效率低,性能差
- RTO较小:因为网络波动导致的没有按时收到ACK会导致不断重发,加剧网络拥塞,导致更过的超时。
- 实际上「报文往返 RTT 的值」是经常变化的,因为我们的网络也是时常变化的。也就因为「报文往返 RTT 的值」 是经常波动变化的,所以「超时重传时间 RTO 的值」应该是一个动态变化的值。
-
-
快速重传
-
1. 在上图,发送方发出了 1,2,3,4,5 份数据:
- 第一份 Seq1 先送到了,于是就 Ack 回 2;
- 结果 Seq2 因为某些原因没收到,Seq3 到达了,于是还是 Ack 回 2;
- 后面的 Seq4 和 Seq5 都到了,但还是 Ack 回 2,因为 Seq2 还是没有收到;
- **发送端收到了三个 Ack = 2 的确认,知道了 Seq2 还没有收到,就会在定时器过期之前,重传丢失的 Seq2。**
- 最后,接收到收到了 Seq2,此时因为 Seq3,Seq4,Seq5 都收到了,于是 Ack 回 6 。
所以,快速重传的工作方式是当***收到三个相同的 ACK 报文***时,会在定时器过期之前,重传丢失的报文段。
2. **快速重传所面临的问题**
1. 对于上面的例子,是重传 Seq2 呢?还是重传 Seq2、Seq3、Seq4、Seq5 呢?**因为发送端并不清楚这连续的三个 Ack 2 是谁传回来的。**
2. 为了解决不知道该重传哪些 TCP 报文,于是就有 `SACK` 方法。
-
SACK(Selective Acknowledgement)选择性确认
- 这种方式需要在 TCP 头部「选项」字段里加一个
SACK
的东西,它可以将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。
- 如上图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过
SACK
信息发现只有200~299
这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。 - 如果要支持
SACK
,必须双方都要支持。在 Linux 下,可以通过net.ipv4.tcp_sack
参数打开这个功能。
- 这种方式需要在 TCP 头部「选项」字段里加一个
-
Duplicate SACK
- 称之为D-SACK,主要是使用了SACK告诉发送方有哪些数据被重复接收了。

- 「接收方」发给「发送方」的两个 ACK 确认应答都丢失了,所以发送方超时后,重传第一个数据包(3000 ~ 3499)
- 于是「接收方」发现数据是重复收到的,于是回了一个 SACK = 3000~3500,告诉「发送方」 3000~3500 的数据早已被接收了,因为 ACK 都到了 4000 了,已经意味着 4000 之前的所有数据都已收到,所以这个 SACK 就代表着
D-SACK
。 - 这样「发送方」就知道了,数据没有丢,是「接收方」的 ACK 确认报文丢了。
-
滑动窗口
-
为什么要引入滑动窗口
- TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。
-
什么是滑动窗口
- 窗口大小指的是无需等待确认应答而可以继续发送应答的数据的最大值。
-
滑动窗口如何工作
- 滑动窗口的实现其实是在操作系统缓冲区开辟的缓冲区,发送方在收到应答返回之前,必须在缓冲区中保存已发送的数据,收到确认应答之后才会从缓冲区对数据进行清除。
-
确认应答/累计应答
- 即发送方收到接收方的ACK应答代表ACK之前的所有报文段均被接收到收到。
-
滑动窗口的大小决定
- 通过
TCP
头部的Window
字段来决定的。 - 该字段的含义是接收端告诉发送端,接收端还有多少的缓冲区可以接收数据。
- 通过
-
发送方的滑动窗口
#1 已经发送且收到ACK确认的数据。
#2 已经发送但是还未收到接收方ACK确认的数据。
#3 尚未发送但是数据大小在接收方处理范围内的数据。
#4 未发送但是总大小超过接收方缓冲区大小处理范围的数据。
-
程序是如何表示发送方四个部分的?
-
TCP
滑动窗口是通过使用三个指针来表示四个类别的每一个字节。 -
其中两个是绝对指针,一个是相对指针。
SND.WND
:表示发送窗口的大小,图中的发送窗口大小位20SND.UNA
:绝对指针,指向已发送但未收到确认的第一个字节的序列号。SND.NXT
:绝对指针,只想未发送但是在接收方处理范围内的第一个字节。
-
-
接收方的滑动窗口
- #1 + #2 已经成功接收并且发送取人
ACK
的数据。 - #3 在滑动窗口接收范围大小但是并未收到的数据范围。
- 未收到且不可以被缓冲区接受处理的数据范围。
- 接收窗口的三个部分是通过两个指针进行描述的
RCV.WND
,表示接收窗口的大小,通过确认报文的Window
字段来告知发送方接收方接收窗口的大小,接收方接收窗口大小是动态变化的。RCV.NXT
,表示期望发送方发送来的下一段数据的序列号起始。
- #1 + #2 已经成功接收并且发送取人
-
接收方的滑动窗口大小和发送方的滑动窗口大小一定是先等的吗?
- 答案:并不是完全相等。
- 当接收方的应用进程读取数据的速度非常快的话,这样的话接收窗口可以很快的就空缺出来。那么新的接收窗口大小,是通过
TCP
报文中的Windows
字段来告诉发送方。那么这个传输过程是存在时延的,所以接收窗口和发送窗口是约等于的关系。
-
-
流量控制
-
什么是流量控制
- 让发送方根据接收方的实际数据控制发送的数据量的一种机制。
-
如何实现流量控制
- 利用滑动窗口机制可以很容易的在
TCP
连接上实现对发送方的流量控制。
- 利用滑动窗口机制可以很容易的在
-
零窗口(窗口关闭)
- 零窗口指的是接收方调节发送方发送窗口到0时的情况。
-
窗口关闭中的潜在危险
- 当发生窗口关闭时,接收方处理完数据后,会向发送方通告一个窗口非 0 的 ACK 报文,如果这个通告窗口的 ACK 报文在网络中丢失,造成一种相互等待的过程,即死锁过程。
-
如何解决窗口关闭时的死锁情况
-
探测报文
- 只要 TCP 连接一方收到对方的零窗口通知,就启动持续计时器,只要持续计时器超时,发送方就会发送窗口探测报文(Window probe),接收方返回接收窗口的大小。
- 如果接收窗口依然为0,那么收到ACK报文的同时就会重新启动持续计时器。
- 如果接收窗口不为0,窗口死锁被打破。
-
-
糊涂窗口综合症
- 如果接收方太忙了,来不及取走接收窗口里的数据,那么就会导致发送方的发送窗口越来越小。到最后,如果接收方腾出几个字节并告诉发送方现在有几个字节的窗口,而发送方会义无反顾地发送这几个字节,这就是糊涂窗口综合症。
- 糊涂窗口综合症可以发生在发送方和接收方
- 接收方通过
ACK
通知发送方一个小的窗口 - 发送方发送给接收方小数据
- 接收方通过
- 解决糊涂窗口综合症的办法
- 禁止接收方通知发送方小的窗口
- 当[发送窗口] < min(MSS, 缓存空间 / 2)时,即小于MSS和缓存空间一半中的最小值时,接收方会通告发送方接收窗口为0,组织发送方继续发送数据。
- 避免发送方发送小数据
- 使用Negla算法,算法的基本思想是延时处理,即当一下条件之一时才可以继续发送数据。
- 窗口大小 >= MSS 或者 数据大小 >= MSS。
- 收到之前发送数据的
ACK
回包。
- 使用Negla算法,算法的基本思想是延时处理,即当一下条件之一时才可以继续发送数据。
- 禁止接收方通知发送方小的窗口
-
-
拥塞控制
-
流量控制是控制发送方和接收方之间的缓存来避免出现差错,拥塞控制是避免发送方的数据填满整个网络。
-
拥塞窗口
- 什么是拥塞窗口?
- 拥塞窗口
CWND
是发送方维护的一个状态量,根据网络拥塞程度实时变化。 - 发送窗口
SWND
= min(CWND
,RWND
);
- 拥塞窗口
- 发生拥塞的判断依据
- 只要是发生了超时重传马,就认为网络上发生了拥塞。
- 什么是拥塞窗口?
-
拥塞控制的控制算法
- 慢启动
- 拥塞控制
- 拥塞避免
- 快速恢复
-
慢启动算法
-
慢启动即一点一点的提高发送数据包的数量
-
算法规则
- 每收到接收方一个
ACK
,九江拥塞窗口cwnd
大小加1。
- 每收到接收方一个
-
慢启动算法结束条件
- 有一个叫慢启动门限
ssthresh
(slow start threshold)状态变量。- 当
cwnd < ssthresh
时,使用慢启动算法。 - 当
cwnd >= ssthresh
时,就会使用「拥塞避免算法」。
- 当
- 有一个叫慢启动门限
-
-
拥塞避免
- 前面说道,当拥塞窗口
cwnd
「超过」慢启动门限ssthresh
就会进入拥塞避免算法。 - 一般来说
ssthresh
的大小是65535
字节。 - 那么进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd。
- 接上前面的慢启动的栗子,现假定
ssthresh
为8
: - 当 8 个 ACK 应答确认到来时,每个确认增加 1/8,8 个 ACK 确认 cwnd 一共增加 1,于是这一次能够发送 9 个
MSS
大小的数据,变成了线性增长。
- 前面说道,当拥塞窗口
-
拥塞发生算法
- 当触发了重传机制,也就进入了「拥塞发生算法」。
- 重传算法
- 超时重传
-
超时重传使用[拥塞发生算法]
-
ssthresh
设为cwnd/2
-
cwnd
重置为1 -
-
缺点:短时间内剧烈减少数据流,可能会造成网络卡顿等问题。
-
- 快速重传
- 快速重传时有自己的拥塞算法
cwnd = cwnd / 2
ssthresh = cwnd
- 进入快速恢复算法
- 超时重传
-
快速恢复算法
- 拥塞窗口
cwnd = ssthresh + 3
- 重传丢失的数据
- 如果收到重复的的
ACK
,cwnd
+ 1 - 收到新的数据的ACK后,设置
cwnd
为ssthresh
- 紧接着进入拥塞避免算法
- 拥塞窗口
-
4.3.5 TCP连接的建立过程(三次握手)
-
TCP
是面向连接的协议,使用TCP
之前必须先建立连接,而连接的建立是通过三次握手进行的。TCP三次连接的过程
- 一开始,客户端和服务端都处于
CLOSED
状态。先是服务端主动监听某个端口,处于LISTEN
状态。 - 客户端会随机初始化序号(
client_isn
),将此序号置于 TCP 首部的「序号」字段中,同时把SYN
标志位置为1
,表示SYN
报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于SYN-SENT
状态。 - 服务端收到客户端的
SYN
报文后,首先服务端也随机初始化自己的序号(server_isn
),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入client_isn + 1
, 接着把SYN
和ACK
标志位置为1
。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于SYN-RCVD
状态。 - 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部
ACK
标志位置为1
,其次「确认应答号」字段填入server_isn + 1
,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于ESTABLISHED
状态。 - 服务器收到客户端的应答报文后,也进入
ESTABLISHED
状态。 - 从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的。
-
建立连接为什么是三次握手
-
三次握手才可以阻止历史重复连接的初始化(主要原因),简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。
-
三次握手才可以同步双方的初始序列号。
-
三次握手才可以避免资源浪费。
1、三次握手避免历史连接
客户端连续发送多次 SYN 建立连接的报文,在网络拥堵等情况下:
- 一个「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端;
- 那么此时服务端就会回一个
SYN + ACK
报文给客户端; - 客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送
RST
报文给服务端,表示中止这一次连接。
如果是两次握手连接,就不能判断当前连接是否是历史连接,三次握手则可以在客户端(发送方)准备发送第三次报文时,客户端因有足够的上下文来判断当前连接是否是历史连接:
- 如果是历史连接(序列号过期或超时),则第三次握手发送的报文是
RST
报文,以此中止历史连接; - 如果不是历史连接,则第三次发送的报文是
ACK
报文,通信双方就会成功建立连接;
所以, TCP 使用三次握手建立连接的最主要原因是防止历史连接初始化了连接。
2.同步双方初始序列号
TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素,它的作用:
- 接收方可以去除重复的数据;
- 接收方可以根据数据包的序列号按序接收;
- 可以标识发送出去的数据包中, 哪些是已经被对方收到的;
四次握手其实也能够可靠的同步双方的初始化序号,但由于第二步和第三步可以优化成一步,所以就成了「三次握手」。
三次握手与四次握手
-
- 四次握手其实也能够可靠的同步双方的初始化序号,但由于第二步和第三步可以优化成一步,所以就成了「三次握手」。
3.避免资源浪费
- 如果只有「两次握手」,当客户端的
SYN
请求连接在网络中阻塞,客户端没有接收到ACK
报文,就会重新发送SYN
,由于没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的ACK
确认信号,所以每收到一个SYN
就只能先主动建立一个连接,这会造成如果客户端的SYN
阻塞了,重复发送多次SYN
报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。
两次握手
- 即两次握手会造成消息滞留情况下,服务器重复接受无用的连接请求
SYN
报文,而造成重复分配资源。
-
为什么不是两次握手和四次握手
-
「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
-
「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
-
-
TCP三次握手建立连接异常情况分析
-
TCP 第一次握手的 SYN 丢包了,会发生了什么?
-
TCP 第二次握手的 SYN、ACK 丢包了,会发生什么?
-
TCP 第三次握手的 ACK 包丢了,会发生什么?
2.1TCP 第一次握手的 SYN 丢包了,会发生了什么?
从上图可以发现, 客户端发起了 SYN 包后,一直没有收到服务端的 ACK ,所以一直超时重传了 5 次,并且每次 RTO 超时时间是不同的:
-
-
第一次是在 1 秒超时重传
-
第二次是在 3 秒超时重传
-
第三次是在 7 秒超时重传
-
第四次是在 15 秒超时重传
-
第五次是在 31 秒超时重传
可以发现,每次超时时间 RTO 是指数(翻倍)上涨的,当超过最大重传次数后,客户端不再发送 SYN 包。
在 Linux 中,第一次握手的
SYN
超时重传次数,是如下内核参数指定的:$ cat /proc/sys/net/ipv4/tcp_syn_retries 5
tcp_syn_retries
默认值为 5,也就是 SYN 最大重传次数是 5 次。我们可以得知,当客户端发起的 TCP 第一次握手 SYN 包,在超时时间内没收到服务端的 ACK,就会在超时重传 SYN 数据包,每次超时重传的 RTO 是翻倍上涨的,直到 SYN 包的重传次数到达
tcp_syn_retries
值后,客户端不再发送 SYN 包。
2.2 TCP第二次握手的SYN、ACK包丢失
- 当第二次握手的 SYN、ACK 丢包时,客户端会超时重发 SYN 包,服务端也会超时重传 SYN、ACK 包。
- TCP 第二次握手 SYN、ACK 包的最大重传次数是通过
tcp_synack_retries
内核参数限制的,其默认值如下:
$ cat /proc/sys/net/ipv4/tcp_synack_retries
5
2.3 TCP第三次握手ACK丢失
- 此时,由于服务端收不到第三次握手的 ACK 包,所以一直处于
SYN_RECV
状态: - 而客户端是已完成 TCP 连接建立,处于
ESTABLISHED
状态: - 过了 1 分钟后,观察发现服务端的 TCP 连接不见了:服务端超时重传了 SYN、ACK 包,重传了 5 次后,也就是超过
tcp_synack_retries
的值(默认值是 5),然后就没有继续重传了,此时服务端的 TCP 连接主动中止了,所以刚才处于SYN_RECV
状态的 TCP 连接断开了。 - 过了 30 分钟,客户端依然还是处于
ESTABLISHED
状态:客户端发送的数据报文,一直在超时重传,每一次重传,RTO 的值是指数增长的,所以持续了好长一段时间,客户端的 telnet 才报错退出了,此时共重传了 15 次。
那如果客户端不发送数据,什么时候才会断开处于 ESTABLISHED 状态的连接?
- 这里就需要提到 TCP 的 保活机制。这个机制的原理是这样的:
- 定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,发送一个「探测报文」,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。
net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_keepalive_intvl=75
net.ipv4.tcp_keepalive_probes=9
- tcp_keepalive_time=7200:表示保活时间是 7200 秒(2小时),也就 2 小时内如果没有任何连接相关的活动,则会启动保活机制.
- tcp_keepalive_intvl=75:表示每次检测间隔 75 秒;
- tcp_keepalive_probes=9:表示检测 9 次无响应,认为对方是不可达的,从而中断本次的连接。
3.TCP快速建立连接
- 客户端在向服务端发起 HTTP GET 请求时,一个完整的交互过程,需要 2.5 个 RTT 的时延。
- 由于第三次握手是可以携带数据的,这时如果在第三次握手发起 HTTP GET 请求,需要 2 个 RTT 的时延。
在 Linux 3.7 内核版本中,提供了 TCP Fast Open 功能,这个功能可以减少 TCP 连接建立的时延。在 Linux 上如何打开 Fast Open 功能?
可以通过设置 net.ipv4.tcp_fastopn
内核参数,来打开 Fast Open 功能。
net.ipv4.tcp_fastopn 各个值的意义:
- 0 关闭
- 1 作为客户端使用 Fast Open 功能
- 2 作为服务端使用 Fast Open 功能
- 3 无论作为客户端还是服务器,都可以使用 Fast Open 功能
Fast Open
4.3.6 TCP连接的断开过程(四次挥手)
四次挥手
-
客户端打算关闭连接,此时会发送一个 TCP 首部
FIN
标志位被置为1
的报文,也即FIN
报文,之后客户端进入FIN_WAIT_1
状态。- 关闭连接时,客户端向服务端发送
FIN
时,仅仅表示客户端不再发送数据了但是还能接收数据。
- 关闭连接时,客户端向服务端发送
-
服务端收到该报文后,就向客户端发送
ACK
应答报文,接着服务端进入CLOSED_WAIT
状态。 -
客户端收到服务端的
ACK
应答报文后,之后进入FIN_WAIT_2
状态。- 服务器收到客户端的
FIN
报文时,先回一个ACK
应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送FIN
报文给客户端来表示同意现在关闭连接。
- 服务器收到客户端的
-
等待服务端处理完数据后,也向客户端发送
FIN
报文,之后服务端进入LAST_ACK
状态。 -
客户端收到服务端的
FIN
报文后,回一个ACK
应答报文,之后进入TIME_WAIT
状态 -
服务器收到了
ACK
应答报文后,就进入了CLOSE
状态,至此服务端已经完成连接的关闭。 -
客户端在经过
2MSL
一段时间后,自动进入CLOSE
状态,至此客户端也完成连接的关闭。 -
这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT 状态。
为什么 TIME_WAIT 等待的时间是 2MSL?
MSL
是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。- 网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。
- 比如,如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 Fin 报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL。
- 在 Linux 系统里
2MSL
默认是60
秒,那么一个MSL
也就是30
秒。Linux 系统停留在 TIME_WAIT 的时间为固定的 60 秒。
为什么需要TIME-WAIT状态?
- 防止具有相同「四元组」的「旧」数据包被收到;
- 经过
2MSL
这个时间,足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的。
- 经过
- 保证「被动关闭连接」的一方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭;
假设 TIME-WAIT 没有等待时间或时间过短,断开连接会造成什么问题呢?
- 过少的危害
- 如上图红色框框客户端四次挥手的最后一个
ACK
报文如果在网络中被丢失了,此时如果客户端TIME-WAIT
过短或没有,则就直接进入了CLOSE
状态了,那么服务端则会一直处在LASE-ACK
状态。 - 当客户端发起建立连接的
SYN
请求报文后,服务端会发送RST
报文给客户端,连接建立的过程就会被终止。
2.过多的危害
- 第一是内存资源占用;
- 第二是对端口资源的占用,一个 TCP 连接至少消耗一个本地端口;
5.网络层
5.1 网络层概览
1.网络层只向上提供简单灵活的、无连接的、尽最大努力交付的数据报服务。
2.网络层在发送数据之前不需要先建立连接,每一个分组(也就是IP数据报)独立发送,与前后的分组无关。
3.网络层不提供服务质量的承诺,即不提供可靠传输服务。
4.提供可靠传输服务的是传输层。
5.网络层的主要作用:实现主机之间的通信,也可以称之为**【点对点】**的通信。
5.2 网际协议IP及其附属协议
5.2.1 IP协议的作用
5.2.2 IP和MAC的区别
IP的作用是实现主机之间的通信,而MAC的作用则是实现两个【直连设备】的通信,IP协议的作用是实现在【没有直连】的两个设备之间的通信。
5.2.3 一些IP配套协议
- 地址解析协议
ARP
(Address Resolution Protocol) - 网际控制报文协议
ICMP
(Internet Control Message Protocol) - 网际组管理协议
IGMP
(Internet Group Management Protocol) - 逆地址解析协议
ARAP
(Reverse Address Resolution Protocol)
5.2.4 IP地址的分类
什么是IP地址
- IP地址是给因特网上的每一个主机的每一个接口分配一个全世界范围内唯一的32位的标识符。
IP地址的分类
- 即将IP地址划分位若干固定的类。
IP地址的组成
- 每一个地址都由两个固定长度的字段组成。
- 网络号:标志着主机所连接到的网络。
- 主机号:标志着该主机。
- A类、B类、C类地址的网络号字段分别位1、2、3位,其值分别为0、10、110,且这三类地址分别由 【标志位+网络号+主机号】组成。
最大主机数的值是如何计算的呢?
为什么要减去2呢?
- 主机号全为 1 指定某个网络下的所有主机,用于广播。
- 广播地址用于在同一条链路中相互连接的主机间发送数据。
- 本地广播:主机位全部置为1。
- 直接广播:向不同地址的主机发送广播。
- 主机号全为 0 指定某个网络
D、E类地址的作用
- D类地址用于多播,即将数据报发送给特定组内的所有主机。
5.2.5 无分类地址CIDR
无分类地址将32位的IP地址划分为两部分,前面是网络号,后面是主机号。
- 表示形式
a.b.c.d/x
,其中/x
表示前 x 位属于网络号, x 的范围是0 ~ 32
,这就使得 IP 地址更加具有灵活性。 - 比如 10.100.122.2/30,这种地址表示形式就是 CIDR,
/30
表示前 30 位是网络号,剩余的 2位是主机号。
5.2.6 子网掩码
掩码:掩盖掉主机号,剩余网络号。
将IP地址与子网掩码按位与 AND 即可得到网络号。
5.2.7 为什么要分离网络号和主机号
- 如果网络地址相同则说明发送方和接收方在同一个广播域内,则可以直接将数据包发送到目标主机。
5.2.8 地址解析协议ARP
地址解析协议的作用
- 将从**[网络层]使用的主机IP地址转换为相应的在[数据链路层]使用的硬件地址**。
- 解决了同一个局域网上的主机或路由器IP地址和硬件地址的映射关系。
IP地址与硬件地址的关系
IP
地址与硬件地址由于格式不同,并不是简单的映射关系。(IP地址是32位,硬件地址是48位)
网络中主机经常变换的问题应该如何解决
- 在主机
ARP
高速缓存中存放一个IP地址到硬件地址的映射表,且该映射表还应经常更新。
高速缓存映射表的使用
- 如果高速缓存中存在对应地址的硬件地址,则直接使用并将硬件地址写入数据链路层的MAC帧中。
- 如果高速缓存总不存在IP地址的硬件地址,发送主机就自动运行
ARP
,然后按照以下步骤找出接收主机的硬件地址。- ARP进程在本局域网上广播发送一个ARP请求分组。
- 本局域网上所有主机上运行的ARP进程都能收到这个ARP请求分组。
- 主机B的IP地址与ARP请求分组中查询的IP地址一致,就收下这个ARP请求分组,并向主机A发送一个响应分组,并在这个响应分组中写下自己的硬件地址。
- 主机A收到主机B的ARP响应分组后,就在去ARP高速缓存中写入主机B由IP地址到硬件地址的映射。
高速缓存的生存时间
- ARP把保存在高速缓存中的每一个映射项目都设置了生存时间。
- 生存时间的设置是为了使得在高速缓存中的IP之间能够正常通信。
5.2.9 逆地址解析协议RARP
逆地址解析协议的作用
- 与
RAP
协议相反,从数据链路层使用的硬件地址转换为在网络层使用的IP地址。 - **TIPS:**现有的
DHCP
协议已经包含ARAP
协议的内容。
5.2.10 IP数据报的格式
- IP数据报由两部分组成,首部和数据部分。
- 首部的前一部分是固定长度,为20字节;后面是可变部分,长度可变。
-
版本,4位,即
IP
协议版本,通信双方的版本必须一致。目前使用的版本号为4(IPV4); -
首部长度,4位;首部长度最大位20字节,最大位60字节。
-
服务类型(区分服务),8位,只有在使用区分服务时才使用该字段。
-
总长度,16位,指的是首部与数据长度的和,最大值位65535字节。
-
标识,16位,相同的标识字段的值能使得分片后的各数据报片最后能够正确的重装成为原来的数据报。
-
标志,3位,目前只有全两位有意义
- 标志字段的最低位记作
MF(More Fragment)
,MF=1
标志着后面还有分片的数据报。MF=0
表示已经是若干数据报的最后一个。 - 标志字段中间的以为记为
DF(Don't Fragment)
,DF=1
表示禁止分片,DF=0
表示允许分片。
- 标志字段的最低位记作
-
片偏移,13位,表示较长的分组在分片后,每片在原分组中的相对位置。
-
生存时间,占8位,表明数据报在网络中的寿命。目的是防止无法交付后在网络中占用网络资源。每经过一个路由器,就把
TTL
减去数据报在路由器所消耗的时间,直至TTL
减为0时就丢弃该数据。 -
协议,8位,标志着该数据携带的数据使用的是哪种协议,以便目的主机的IP层知道应该将数据部分上交给哪个进程处理。
协议名 ICMP IGMP IP TCP EGP IGP UDP IPV6 ESP OSPF 协议字段值 1 2 4 6 8 9 17 41 50 89 -
首部校验和,只负责首部字段的首部校验,不包含数据部分。数据报每经过一个路由器均会重新计算一下首部校验和。
-
源地址和目的地址,IP地址,各占32位。
5.2.11 网际控制报文协议ICMP
ICMP
的作用
- 更高效的转发
IP
以及提高交付成功的机会。 ICMP
允许主机或者路由器报告差错情况和提供有关异常情况的报告。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lk886HPV-1619240052201)(C:UsersChenLinDesktop总结计算机网络图片ICMP报文格式.jpg)]
- 前三个字段是统一的格式,即类型、代码、校验和。
- 首部其他部分与ICMP的类型有关。
- 数据部分字段取决于ICMP报文的类型。
ICMP报文种类 | 类型的值 | ICMP报文类型 |
---|---|---|
差错报告报文 | 3 | 终点不可达 |
4 | 源点抑制 | |
11 | 时间超时 | |
12 | 参数问题 | |
5 | 改变路由 | |
询问报文 | 8或者0 | 回送请求或回答 |
1 | 13或者14 | 时间戳请求或者回答 |
- 终点不可达,当路由器或者主机不能交付数据报时就向源点发送终点不可达报文。
- 源点抑制,当路由器或者主机由于拥塞而产生数据丢失时,就会向源点发送源点抑制报文,使源点降低数据报的发送速率。
- 时间超时,路由器或者主机收到生存时间为0的数据报时,除了丢弃该数据之外,还要向源点发送时间超过报文;当终点在原先规定的时间段内不能收到一个数据报的全部片段时,就将已收到的数据报片段全部丢失,并向源点发送时间超时报文。
- 参数问题,当路由器或者主机收到数据包中首部参数不正确时,就丢弃数据报并且向源点发送参数问题报文。
- 改变路由,路由器将改变路由报文发送给主机,让主机知道下次应该将数据报发送给另外的路由器。
- 回送请求或回答,是一个主机或者路由器向另一个特定的目的主机发出的询问。这种询问报文用来测定目的主机是否可达以及目的主机的相关状态。
- 时间戳请求与回答,请某个主机或者路由器回答当前的时间和日期。
ICMP
报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。
2.ICMP
的应用
PING
(Packet Internet Groper),分组网间探测。用来测试两个主机之间的连通性。PING
使用了回送请求或回答报文。并没有经过运输层的UDP
或者TCP
。
5.2.12 英特网的路由选择协议
- 内部网关协议
IGP
(Interior Gateway Protocol),在一个自治系统内使用的路由选择协议,常见的有RIP
、OSPF
。 - 外部网关协议
EGP
(Eternal Gateway Protocol)。目的主机与源主机不在同一个系统中,当数据传到一个自治系统的边界时,就需要使用外部网关协议将路由选择信息传递到另一个自治系统中。常见的有BGP-4
.
5.2.13 DHCP
协议
DHCP
的作用
- 动态的获取
IP
地址,从而大大省去了配置IP
信息繁琐的过程。、
DHCP 交互的 4 个步骤:
- 客户端首先发起 DHCP 发现报文(DHCP DISCOVER) 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的地址,所以使用的是 UDP 广播通信,其使用的广播目的地址是 255.255.255.255(端口 67) 并且使用 0.0.0.0(端口 68) 作为源 IP 地址。DHCP 客户端将该 IP 数据报传递给链路层,链路层然后将帧广播到所有的网络中设备。
- DHCP 服务器收到 DHCP 发现报文时,用 DHCP 提供报文(DHCP OFFER) 向客户端做出响应。该报文仍然使用 IP 广播地址 255.255.255.255,该报文信息携带服务器提供可租约的 IP 地址、子网掩码、默认网关、DNS 服务器以及 IP 地址租用期。
- 客户端收到一个或多个服务器的 DHCP 提供报文后,从中选择一个服务器,并向选中的服务器发送 DHCP 请求报文(DHCP REQUEST进行响应,回显配置的参数。
- 最后,服务端用 DHCP ACK 报文对 DHCP 请求报文进行响应,应答所要求的参数。
5.2.14 NAT
网络地址转换
什么是NAT
NAT
指的是网络地址转换,目的是为了解决IPv4地址耗尽的问题。- 简单的来说 NAT 就是在同个公司、家庭、教室内的主机对外部通信时,把私有 IP 地址转换成公有 IP 地址。
5.2.15 IGMP
的工作机制
IGMP
报文分为三个版本 v1 v2 v3.
-
IGMP的工作机制
-
常规查询与响应
- 路由器会周期性发送目的地址为
224.0.0.1
(表示同一网段内所有主机和路由器) IGMP 常规查询报文; - 主机1 和 主机 3 收到这个查询,随后会启动「报告延迟计时器」,计时器的时间是随机的,通常是 0~10 秒,计时器超时后主机就会发送 IGMP 成员关系报告报文(源 IP 地址为自己主机的 IP 地址,目的 IP 地址为组播地址)。如果在定时器超时之前,收到同一个组内的其他主机发送的成员关系报告报文,则自己不再发送,这样可以减少网络中多余的 IGMP 报文数量;
- 路由器收到主机的成员关系报告报文后,就会在 IGMP 路由表中加入该组播组,后续网络中一旦该组播地址的数据到达路由器,它会把数据包转发出去;
- 路由器会周期性发送目的地址为
-
离开组播组工作机制----1
- 主机 1 要离开组 224.1.1.1,发送 IGMPv2 离组报文,报文的目的地址是 224.0.0.2(表示发向网段内的所有路由器);
- 路由器收到该报文后,以 1 秒为间隔连续发送 IGMP 特定组查询报文(共计发送 2 个),以便确认该网络是否还有 224.1.1.1 组的其他成员;
- 主机 3 仍然是组 224.1.1.1 的成员,因此它立即响应这个特定组查询。路由器知道该网络中仍然存在该组播组的成员,于是继续向该网络转发 224.1.1.1 的组播数据包
-
离开组播组工作机制----2
- 主机 1 要离开组播组 224.1.1.1,发送 IGMP 离组报文;
- 路由器收到该报文后,以 1 秒为间隔连续发送 IGMP 特定组查询报文(共计发送 2 个)。此时在该网段内,组 224.1.1.1 已经没有其他成员了,因此没有主机响应这个查询;
- 一定时间后,路由器认为该网段中已经没有 224.1.1.1 组播组成员了,将不会再向这个网段转发该组播地址的数据包;
5.3 IPv4
与IPv6
的对比
IPv4
是32位的,IPv6
是128位的。IPv6
具有更好的安全性和扩展性。IPv4
和IPv6
互不兼容。
5.3.1 IPv6
的优点
IPv6
可以实现自动配置,即便是在没有DHCP
服务器的帮助下,实现了便捷使用。IPv6
首部采用固定长度40字节,去掉了首部校验和,简化了首部结构,提高了传输性能。- 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大提升了安全性。
5.3.2 IPv6
地址的标识方法
- 每16位一组,【:】隔开。
- 如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号 【::】隔开。但是,一个 IP 地址中只允许出现一次两个连续的冒号。
5.3.3 IPv6
与IPv4
首部的对比
-
取消了首部校验和字段。 因为在数据链路层和传输层都会校验。
-
取消了分片/重新组装相关字段。 分片与重组是耗时的过程,IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机。
-
取消选项字段。 选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部中的「下一个首部」指出的位置上。删除该选项字段是的 IPv6 的首部成为固定长度的
40
字节。
6.数据链路层
数据链路层属于计算机网络的低层。数据链路层使用的信道主要有以下两种
- 点对点通信,使用一对一的点对点通信方式。
- 广播通信。使用一对多的广播通信方式,
6.1 数据链路层的功能
- 数据链路层在物理层提供基础服务的基础上向网络层层提供服务,主要作用是加强物理层传输比特流的功能,同时将物理层提供的可能出错的物理连接改造位逻辑上无差错的数据链路。使得其对网络层表现为一条无差错的链路。
最后
以上就是热心苗条最近收集整理的关于学习笔记 -- 两万字《计算机网络》合辑计算机网络知识合集的全部内容,更多相关学习笔记内容请搜索靠谱客的其他文章。
发表评论 取消回复