计算机网络面试总结(传输层)
UDP协议
问题 1:UDP 和 TCP 的简单介绍。
-
UDP 是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP 数 据报,并组装成一份待发送的 IP 数据报。
-
TCP 是面向流字符,应用程序产生的全体数据与真正发送的单个 IP 数据报可能没什么联系。
问题 2:UDP 报头字段和含义?
问题 3: UDP 的校验和是怎么计算的?
UDP 的校验和要计算首部和数据部分。首部还包括伪首部。
多了 12 个字节的伪首部。
注意点:UDP 长度计算两次。
如果检验和有错,则 UDP 数据报被悄悄丢弃,不产生任何差错报文。
问题 4:为什么要加有伪首部?
目的是让 UDP 两次检查数据是否已经正确到达目的地。
IP 接受正确的目的地址,传送到正确的上层程序。
所有伪首部包括:源 IP 地址,目的 IP 地址,0,协议号,UDP 长度
TCP协议
问题 1:TCP 通过哪些方式来保证可靠性?
- 应用数据被分割成 TCP 认为最适合发送的数据块。
- 确认机制,发送报文后,等待确认。
- 重发机制,没有收到确认,将重发数据段。
- 保持它首部和数据的校验和。确认数据的准确性。
- 排序,丢弃重复的,流量控制。
问题 2:TCP 与 UDP 的概念相互的区别及优劣
- TCP 面向连接,UDP 面向无链接
- TCP 面向字节流,UDP 面向报文
- TCP 提供可靠传输服务(数据顺序、正确性),UDP 传输不可靠
- TCP 协议传输速度慢,UDP 协议传输速度快
- TCP 协议对系统资源要求多(头部开销大),UDP 协议要求少
问题 3:TCP、UDP 为什么存在伪包头?
UDP(TCP)检验和:是根据 UDP(TCP)数据报和伪报头计算得到的差错检测值。 伪报头包含源和目的 IP 地址,以及来自 IP 数据报报头的协议值。IP 数据报在网络中传送时 包含 UDP 数据报。
伪报头并不会在网络中传送,校验和中所包含的伪报头内容可以避免目的端错误地接收错误 路由的数据报。校验和值的计算方法和 IP 报头检验和的计算方法类似
问题 4:为什么要 3 次握手,4 次挥手
-
3 次握手:防止已过期的连接请求报文突然又传送到服务器,因而产生错误
-
4 次挥手:确保数据能够完成传输,但关闭连接时,当收到对方的 FIN 报文通知时,它 仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以 未必会马上会关闭 SOCKET,也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文 给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN 报文多数情况下 都是分开发送的
问题 5:TCP 的流量控制机制
主要是下面的四种机制:
慢启动(慢开始):
- 慢开始不是指 cwnd 的增长速度慢(指数增长),而是指 TCP 开始发送设置 cwnd=1。
- 思路:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大 逐渐增加拥塞窗口的大小。这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,实时 拥塞窗口大小是以字节为单位的。
- 为了防止 cwnd 增长过大引起网络拥塞,设置一个慢开始门限(ssthresh 状态变量)
- 当 cnwd<ssthresh,使用慢开始算法
- 当 cnwd=ssthresh,既可使用慢开始算法,也可以使用拥塞避免算法
- 当 cnwd>ssthresh,使用拥塞避免算法
拥塞避免:
-
拥塞避免并非完全能够避免拥塞,是说在拥塞避免阶段将拥塞窗口控制为按线性规律增 长,使网络比较不容易出现拥塞。
-
思路:让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞控 制窗口加一。
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有 收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做 拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口 设置为 1,执行慢开始算法。 如图所示:
快速重传:
- 快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及 早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发 送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设 置的重传计时器时间到期。
- 由于不需要等待设置的重传计时器到期,能尽早重传未被确认的报文段,能提高整个网 络的吞吐量。
快速恢复:
- 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把 ssthresh 门限减半。 但是接下去并不执行慢开始算法。
- 考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络 可能没有出现拥塞。所以此时不执行慢开始算法,而是将 cwnd 设置为 ssthresh 的大小, 然后执行拥塞避免算法。