网络面试题
相关问题目录
- TCP三次握手和四次挥手过程
- 为什么要采用三次握手
- TCP和UDP的区别
- TCP如何保证可靠性
- 如果发送的SYN丢失会怎么办
- TIME_WAIT状态等待2MSL作用
- 集群中处于TIME-WAIT状态的服务器过多的原因
- 如何避免TIME_WAIT过多的问题
- 清理TIME_WAIT技巧
- 滑动窗口
- 如果发送端收到一个零窗口该怎么处理
- 拥塞控制
- 其它
- 补充ing
三次握手和四次挥手
- 知识点1:握手挥手过程
- 知识点2:TCP包类型
- 知识点3:携带的相关信息(序列号/确认号/MSS等等)
- 知识点4:有限状态机变化
为什么采用三次握手
- 不采用2次的原因:TCP是全双工的,如果只是服务端发送完 ACK 包(客户端发送已经失效的 SYN 包)就建立连接然后发送数据,会严重消耗资源
- 不采用4次的原因:服务端将 SYN 和 ACK 合并成一个包发送;这样做的目的是:减少连接时间过长,影响工作效率
TCP和UDP区别
- 是否连接
- 传输可靠性
- 应用场景
- 传输速度
TCP如何保证可靠性
- TCP分段
- 重传机制
- 流量控制
- 数据校验
- IP数据包处理
发送的SYN包丢失后处理机制
- 重传计时器
- 快速重传
- SACK
- D-SACK
TIME_WAIT状态等待2MSL作用
- 防止主动关闭方的 ACK 包丢失问题
- 防止重复(旧)的数据包出现在本次连接问题
集群中处于TIME-WAIT状态的服务器过多的原因
- 场景:高并发短链接的 TCP 服务器上,当服务器处理完请求后正常主动关闭连接
- 短链接:“业务处理+传输数据时间”远远小于TIME-WAIT时间;比如:1s 的 http 短链接处理完业务,主动方关闭连接之后,会在 TIME_WAIT 状态等待 2MLS 时间从而导致端口被占用
如何避免TIME_WAIT过多的问题
- Linux系统调优
/etc/sysctl.conf文件中: net.ipv4.tcp_tw_reuse=1 # 连接重用 net.ipv4.tcp_tw_recycle=1 # 快速回收 net.ipv4.tcp_tw_timestamps=1 # 时间戳一致 net.ipv4.tcp_syncookies=1 # SYN请求缓存(有一点点用处)
清理TIME-WAIT技巧
- 统计 T-W 连接数量
netstat -an | grep "TIME_WAIT" | wc -l
- 调整 net.ipv4.tcp_max_tw_buckets 参数;当超过默认值,内核会把过多的 T-W 连接清理掉
- 利用RTS包从外部清理,当内核收到RTS包后会产生错误从而终止连接
滑动窗口
- 发送方根据接收端的窗口大小( win=xxx )来调整发送速率,实现端到端的流量控制
- 发送和接收缓存可以重复使用并通过 Linux 相关内核参数控制大小
#自动调节相关: net.ipv4.tcp_moderate_rcvbuf=1 # 默认为1:代表开启自动调节 net.ipv4.tcp_adv_win_scale=1 # 默认为1:计算接收缓存和接收窗口的微调 #分别代笔:min值 defaults值 max值 net.ipv4.tcp_wmem=4096 16384 4194304 net.ipv4.tcp_rmem=4096 87380 6291456 #发送和接收缓存的默认值和最大值: net.core.rmem_default=212992 net.core.rmem_max=212992 net.core.wmem_default=212992 net.core.wmem_max=212992
如果发送端收到一个零窗口该怎么处理
- 产生场景:服务端处理能力不够的时候,可能会导致数据丢失,从而向发送端发送零窗口
- 发送端处理机制:
1. 会暂时停止发送数据流
2. 启用窗口定时器:当网络中没有发送且未确认的数据包且本端有待发送的数据包时3. 保持连接并传输探测( keep-alive 报文)
a)当接收窗口不为0:继续发送数据包(清除超时时间的退避指数,删除零窗口探测定时器)
b) 当接收窗口仍为0:重新设置零窗口探测定时器的下次超时时间,超时时间的设置和超时重传定时器的一样
拥塞控制
- 网络拥塞的原因:
- 独享整个网络资源,TCP的流量控制必然会导致网络拥塞,只关注了对端接收空间,无法知道链路上的容量
- 路由器接入网络会拉低网络的总带宽,路由器如果出现瓶颈,很容易出现堵塞
- 知识点1:4种机制
- 知识点2:拥塞控制详细过程( cwnd/ssthresh等等 )