【每日八股】复习计算机网络 Day4:TCP 协议的其他相关问题
文章目录
- 昨日内容复习
- 已经建立了 TCP 连接,客户端突然出现故障怎么办?
- 什么时候用长连接?短连接?
- TCP 的半连接队列与全连接队列?
- 什么是 SYN 攻击?如何避免?
- TIME_WAIT 的作用?过多如何解决?
- TIME_WAIT 为什么要经过两个 MSL?
- CLOSE_WAIT 状态过多如何解决?
- 复习计算机网络 Day4:TCP 协议的其他相关问题
- TCP 和 UDP 的区别?
- TCP 传输时出现粘包问题应该如何解决?
- TCP 的 keepalive 和 HTTP 的 keepalive 的区别?
- IP 层可以对较长的报文进行分片,为什么 TCP 层还需要 MSS?
昨日内容复习
已经建立了 TCP 连接,客户端突然出现故障怎么办?
服务端不会一直等待。服务端会为每一条 TCP 连接设置一个保活计时器(时长通常是两个小时),每当客户端传来数据,服务端会重置计时器。如果保活计时器时间到,那么服务端每隔一定时间发送一个探测报文,连续发送十个探测报文仍然收不到客户端的回复,那么服务端终止与客户端的连接。
什么时候用长连接?短连接?
- 长连接用于频繁通信的点对点通讯,并且长连接的个数不能太多。数据库的连接就是长连接的一种。
- HTTP 服务一般使用短连接,可快速释放。
TCP 的半连接队列与全连接队列?
- 半连接队列:又称 SYN 队列,服务端会保存发送 SYN 请求报文请求连接的客户端的信息,并向客户端发送 SYN-ACK 报文。
- 全连接队列:又称 ACCEPT 队列。服务端回发的 SYN-ACK 报文得到 ACK 报文确认后,就会将 SYN 队列中的客户端移出队列,建立 TCP 连接并加入到全连接队列当中。
什么是 SYN 攻击?如何避免?
服务端收到大量的恶意 SYN 请求报文,会不停地回发 SYN-ACK 报文,得不到 ACK 确认报文,会触发超时重传,此时会导致服务端资源浪费。此外,服务端收到 SYN 报文后,可能会为该连接分配一个 TCB 进程控制块,大量的恶意 SYN 请求会导致服务端资源枯竭。
避免方法包括但不限于以下几种:
- TCP 连接建立后再分配 TCB;
- 减少 SYN-ACK 的重传次数;
- 监视 SYN 队列和 ACCEPT 队列中的无效连接,及时清除;
- 扩大 SYN 队列;
TIME_WAIT 的作用?过多如何解决?
- 确保主动关闭方发送的 ACK 报文到达被动关闭方,从而确保全双工通道的可靠关闭;
- 等待网络中因网络拥塞而还没有到达的报文在网络中自然消失,避免对新连接产生干扰;
过多的 TIME_WAIT 会占用网络与端口资源,导致新的连接无法建立。
解决办法包括但不限于:
- 复用长连接;
- 调整 MSL 时间;
- 快速回收 TIME_WAIT。
TIME_WAIT 为什么要经过两个 MSL?
- 第一个 MSL:确保 ACK 报文到达对端;
- 第二个 MSL:确保对端重传的 FIN 到达本端;
2 MSL 还可确保旧报文在网络中完全消亡。
CLOSE_WAIT 状态过多如何解决?
CLOSE_WAIT 过多可能是应用程序层面产生的问题,应该对应用程序进行检查。
复习计算机网络 Day4:TCP 协议的其他相关问题
TCP 和 UDP 的区别?
- TCP 是面向连接的,连接建立时需要三次握手,断开时需要四次挥手。UDP 不需要建立连接。
- TCP 是可靠传输服务,可确保传输数据无差错。UDP 非可靠传输,尽最大努力交付。
- TCP 是点对点连接,UDP 可以通过多对一、一对多、多对多等方式通讯。
- UDP 对系统资源的要求比较少,通讯效率高,实时性好。TCP 适用于需要可靠连接,比如付费、加密数据等场景。
- TCP 首部长度较长,有一定开销,在没有额外选项时 TCP 头部的长度占 20 字节。UDP 首部长度只有 8 字节,没有额外长度。
- TCP 进行流式传输,没有数据边界。UDP 基于数据包传输,可能会丢包与乱序。
- TCP 数据的大小如果大于 MSS,则会在传输层进行分片。对端收到数据分片后会在传输层进行组装。中间如果发生丢包,传输方会重传丢失的分片。UDP 数据的大小取决于 MTU 的大小,会在 IP 层分片,对端收到数据后,会在 IP 层组装。
- 应用场景:TCP 可用于 FTP 文件传输;UDP 用于包总量较少的通信,比如 DNS、SNMP 等。视频、音频等多媒体通信以及广播通信也可用 UDP 实现。
TCP 传输时出现粘包问题应该如何解决?
在数据的头部指定当前数据包的数据长度,由应用层根据数据长度来分包拆包。粘包是需要在应用层解决的问题。
TCP 的 keepalive 和 HTTP 的 keepalive 的区别?
- HTTP 的 keepalive 是由应用层(用户态)实现的,称为 HTTP 长连接。而 TCP 的 keepalive 是由传输层(内核态)实现的,称为 TCP 保活机制。
- HTTP 的 keepalive 与 TCP 的 keepalive 作用不同。TCP 的 keepalive 用于探测对端是否仍然在线。而 HTTP 的 keepalive 用于避免重复建立/断开 TCP 连接,减少 TCP 连接建立与断开时的开销。
IP 层可以对较长的报文进行分片,为什么 TCP 层还需要 MSS?
- MTU:一个网络包的最大长度,在以太网中一般 1500 字节;
- MSS:去除 IP 和 TCP 报文头部后,一个网络包中可以容纳的 TCP 数据部分的最大长度。
IP 层虽然可以对报文进行分片,但是存在以下问题,TCP 中 MSS 的提出就是为了解决下述问题:
性能消耗
- 重组开销:IP 层分片传输的报文需要在接收端进行重组,消耗 CPU /内存资源。
- 重传开销:如果传输过程中任意 IP 报文分片丢失,则整个报文都需要重传。
可靠性风险
- 无分片状态跟踪:IP 是无状态协议,无法感知分片是否全部到达。
- 防火墙 / NAT 干扰:部分网络设备会丢弃分片报文,导致通信失败。
路径 MTU 发现(PMTUD)复杂性
- 动态路径 MTU:网络路径中不同链路的 MTU 可能不同。
- PMTUD 失败:若 ICMP 报文被屏蔽,PMTUD 可能会失败。