计网总结

Posted by QingJun's Blog on April 12, 2021

第二章 Internet 地址结构

IPv4,IPv6

分类寻址:网络号+主机号

子网寻址:网络号+子网号+主机号

子网掩码,用于确定网络号和主机号的划分

第四章 地址解析协议

地址解析协议(ARP),IP 地址到 MAC 地址的转换

当访问一个 IP 地址时,若该地址与发送主机不在同一子网时(同一子网时直接发送),链路层向局域网内所有设备广播请求(交换机会转发),最终得到 ARP 响应获取 MAC 地址

ARP 会缓存最新的地址映射

代理 ARP ,可以代替目的主机做出响应。可以隐藏目的主机,或者截获发送主机到目的主机的通信(做出响应,把别的主机假装成目的主机),所以很不安全。

第五章 Internet 协议

IPv4 数据包格式

分片

IP 转发

转发表:目的地,掩码,下一跳,接口

第六章 系统配置:DHCP 和自动配置

动态主机配置协议(DHCP):客户机请求分配一个 IP 地址,服务器从可用地址池中选择一个地址作为响应,该地址在租用期内有效。

第七章 防火墙和网络地址转换

防火墙:代理防火墙,包过滤防火墙

两者主要区别在于所操作的协议栈的层次及由此决定的 IP 地址和端口号的使用

包过滤防火墙:一个互联网路由器,过滤不符合标准的数据报

代理防火墙:选择性地丢弃数据包的路由器,本质上是应用层网关。

代理防火墙常见形式:HTTP 代理防火墙(Web代理)和 SOCKS 防火墙

网络地址转换(NAT):允许不同地方重复使用相同的 IP 地址

第十章 用户数据报协议和 IP 分片

用户数据报协议(UDP)

第十一章 名称解析和域名系统

域名系统(DNS)

第十二章 TCP

ARQ 和重传

此前讨论的 IP,UDP 都是不可靠的协议,它们或许可以检测差错,却无法纠正差错;而 TCP 是可靠的协议,区别于其他协议的重点是它提供了差错纠正,采用重传的方式。无论是分组错误还是分组丢失,最简单的解决办法就是直接重传。

自动重复请求(ARQ)

直接处理分组丢失的方法,重发分组直到它被正确接收,即重传。

重传引入了新的问题:

  • 如何判断接收方是否已收到分组(即什么时候重传)
  • 接收方的分组是否与之前发送方发送的一样(即重传什么内容)

解决第一个个问题,可以用 ACK 和计时器,当发送方接收到 ACK 时不需要重传,当超时仍未接收到 ACK ,就重传。

解决第二个问题,用序列号来处理,标识不同的分组。

同样地,引入 ACK 也带来了一些问题:

  • 发送方对一个 ACK 应该等待多久
  • ACK 丢失了怎么办
  • 分组被接受,但分组发生了错误怎么办

对于第一个问题,即往返时间(RTT),这并不是确定的,需要估计,随网络情况变化。

对于第二个问题,发送方无法区分分组丢失和 ACK 丢失,只能做相同的处理——重传,对于接收方来说,如果 ACK 丢失,接收方将会接收两次同样的分组(即解决分组重复),需要进行处理。

对于第三个问题,就用到了校验和进行差错检测,接收方对错误的分组只要不发送 ACK 等待发送方重传即可

分组窗口和滑动窗口

因为发送方有可能会重传,则发送方在发送分组后并不能立即丢弃分组,而需要暂存,直到收到 ACK 才可以丢弃已发送的分组。

利用滑动窗口可以很好地描述和解决缓存分组的问题。滑动窗口分为三部分:经 ACK 确认过的分组,未得到 ACK 确认的分组,等待发送的分组。

为什么是窗口呢?因为在要发送的分组序列中,我们只关注目前需要发送和接收 ACK 确认的分组。

流量控制和拥塞控制

通过改变窗口的大小,可以实现流量控制。由接收方反馈发送方使用多大的窗口。

流量控制和拥塞控制的区别:拥塞问题是一个全局性的问题,涉及到网络中的所有的主机、所有的路由器、以及与降低网络传输性能有关的所有因素。流量控制往往指的是点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接受。

TCP

TCP 是面向连接的

TCP 是可靠的

TCP 是面向字节流的

ARQ,差错纠正(分组丢失和分组错误)

ACK,和计时器协作,用于判断何时重传

序列号,标识不同的分组(解决分组重复和分组乱序)

滑动窗口,缓存分组等待重传或 ACK ,流量控制,拥塞控制

校验和,提供可靠性

字节流,

累计确认,

三次握手

  • 第一次
    • SYN
    • 初始序列号 x (随机,为了安全性)
  • 第二次
    • SYN + ACK
    • 初始序列号 y (随机)
    • 确认号 x + 1
  • 第三次
    • ACK
    • 序列号 x + 1
    • 确认号 y + 1

三次握手的目的不仅在于建立连接,还用于交换初始序列号。

四次握手

  • 第一次
    • FIN + ACK(用于确认上一次接收的分组)
    • 序列号 x
  • 第二次
    • ACK
    • 确认号 x + 1
  • 第三次
    • FIN
  • 第四次
    • ACK

半关闭是指仅关闭数据流的一个传输方向

同时打开,比如主机 A 通过 7777 端口向主机 B 的 8888 端口发送主动打开请求,同时主机 B 通过 8888 端口向主机 A 的 7777 端口发送主动打开请求,两者是不同的 TCP 连接。

同时打开需要交换 4 个报文段,比三次握手多一个。

同时关闭

为什么初始序列号是随机的?TCP 实际上非常脆弱,一个 TCP 连接由通信双方的套接字(端口号+ IP 地址)标识,如果知道了套接字和当前序列号,就可以伪造 TCP 报文,为了避免这种情况,可以随机初始化序列号。

面经

访问网址发生了什么

什么是网址:http:// + 域名;

http 是超文本传输协议,采用的传输层协议是 TCP ,TCP 是面向连接的,建立连接需要 IP 地址。

域名可以被用来使用 DNS 查询 IP 地址。

查询 IP 地址的流程:(为了提高效率,查询 IP 地址的过程中有很多缓存)

  • 查询浏览器缓存
  • 查询/etc/hosts文件下是否缓存
  • 查询本地 DNS 服务器缓存
  • 根据域名一路向上查询

获取 IP 地址后,三次握手建立 TCP 连接。然后浏览器向服务器发送 http 请求,服务器返回结果给浏览器。

微信扫码登录发生了什么

  • 网页刷新,网页后台向微信后台请求授权登录

  • 微信后台返回登陆所需二维码

  • 用户扫描二维码,将账号与二维码绑定,并在手机上授权登录(向微信后台发送授权)

  • 微信后台通知网页后台已授权

  • 网页后台向微信后台请求微信账号数据

  • 微信后台返回账户数据

  • 网页后台接收数据并显示

模型

OSI 七层模型

TCP / IP 五层模型

TCP 与 UDP 的区别

  • TCP 面向连接,UDP 面向无连接
  • TCP 建立连接需要更多资源
  • TCP 面向字节流,UDP 面向数据报
  • TCP 有差错纠正(可靠性)
  • TCP 保证分组顺序(序列号)

三次握手与四次挥手

TCP 状态转换

未命名文件 (2)

IMG_20210412_202451

TCP 的 TIME_WAIT 状态

TIME_WAIT 状态也被称为 2MSL 等待状态。

MSL 是最大段生存期,即报文段在被丢弃前在网络中被允许存在的最长时间。可以自由设置,但存在上限。因为 TCP 报文段以 IP 数据报形式传输,IP 数据报拥有 TTL 字段和跳数限制字段,这两个字段限制了 IP 数据报的有效生存时间。也就是说,因为 IP 数据报有效生存时间有限,所以 MSL 有上限。

  • 什么时候进入该状态?

    当 TCP 执行主动关闭并发送最终 ACK 时

  • 进入该状态会发生什么?

    进入该状态,TCP 连接必须等待 2MSL 的时间

  • 该状态有什么作用?

    最终的 ACK 在传输过程中有可能丢失,需要重新发送。需要注意,并不是重传,而是因为另一方重传了 FIN (消耗一个序列号),需要重新发送最终的 ACK。另一方会一直重传 FIN 直到收到最终的 ACK

  • 如何理解?

    首先理解什么是 MSL ,然后思考为什么是 2MSL 。第一个 MSL ,ACK 的最晚到达时间,如果超过这个时间 ACK 还未到达,说明 ACK 丢失,重传 FIN;第二个 MSL ,FIN 的最晚到达时间,如果超过这个时间还未收到 FIN ,可以认为已经完成连接的关闭(为什么不认为 FIN 丢失?或者说如何区分 FIN 丢失和连接成功关闭)

为什么是三次握手而不是两次

通过一个例子说明:

假设只有两次握手,客户端发送了一个建立连接请求,但在网络中滞留了,客户端发现超时,发送了第二个建立连接请求,此时第一个请求已经失效了,但第一个请求在第二个请求到达前到达了服务器端,因为只有两次握手,此时服务器进入 ESTABLISHED 状态,即服务器认为连接已经建立,而客户端认为还没有建立连接(第一个请求失效了)

第三次握手失败

第三次握手失败时,即超时时服务器仍未收到来自客户端的 ACK ,服务器不会重传 SYN+ACK ,而是直接发送 RTS ,进入 CLOSED 状态。目的是防止 SYN 洪泛攻击。

TCP 拥塞控制

慢启动

  • 慢启动的目的

    使 TCP 在用拥塞避免探寻更多可用带宽之前得到 cwnd 值,以及帮助 TCP 建立 ACK 时钟

    在传输初始阶段,由于未知网络传输能力,需要缓慢探测可用传输资源,防止短时间内大量数据注入导致拥塞。

  • 什么时候执行慢启动?

    数据传输之初或重传计时器检测到丢包

拥塞避免

  • 什么时候执行拥塞避免

    到达慢启动阈值时

  • 为什么要进行拥塞避免

    慢启动的增长很快,可以快速帮助确立一个慢启动阈值,但继续增长下去会导致拥塞,所以要减缓增长速度。

快重传

发送方连续发送了 a,b,c,d 四个报文。报文 b 在传输中丢失。

接收方接收了 a 报文,发送 ACK 期望 b 报文,后续又接收了 c,d 报文,仍然发送 ACK 期望 b 报文。

发送方接到三个重复的 ACK ,立即重传 b 报文,不必等到重传计时器超时。

快重传避免了超时重传的情况,从而减少了拥塞(超时重传的话,cwnd 又要从一开始增长)

快速恢复

快重传之后的操作

TCP 可靠性

不可靠的情况:分组丢失;分组出错;分组乱序到达

分组出错,用校验和的方式检测

分组乱序到达,用序列号来检测

分组丢失,用是否收到 ACK 和重传计时器来检测

如何解决上述问题?

核心机制是重传,不管是分组丢失还是分组出错还是分组乱序到达,只要重传一次就好了。

重传的重点是 ACK ,重传计时器,滑动窗口(缓存分组)

此外,分组丢失和分组乱序到达可能因为网络拥塞的原因,所以拥塞控制也可以辅助重传保证可靠性。

粘包和拆包

TCP 是面向字节流的,没有数据的区分。粘包就是两个数据块粘在了一起作为一个数据包发送,拆包就是接收方区分两个数据块。

解决办法:

  • 为每个数据包添加数据块长度的首部
  • 每个数据包封装成固定长度
  • 数据块之间添加边界

IP 地址和子网掩码

ARP

DNS

HTTP