第二章 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 状态转换
.png)

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 是面向字节流的,没有数据的区分。粘包就是两个数据块粘在了一起作为一个数据包发送,拆包就是接收方区分两个数据块。
解决办法:
- 为每个数据包添加数据块长度的首部
- 每个数据包封装成固定长度
- 数据块之间添加边界