嵌入式-计算机网络(三)
更多专栏:
超万人学习和复习的面经专栏:(适用于小白学习和大佬复习):https://www.nowcoder.com/creation/manager/columnDetail/mGYoDz
超万人使用的校招汇总专栏:(助力你更快,更方便投递)https://www.nowcoder.com/creation/manager/columnDetail/0ybKdp
目录:
1.什么是 MSL?为什么在客户端最后还要等待2MSL?
2.什么是TCP粘包现象?
3.为什么服务端易受到SYN攻击?
4.请说说TCP的ACK机制,有什么好处?
5.什么是UDP,它的头部结构是什么样的?
6.TCP与UDP的对比?
7.从系统层面来说,如何让UDP也变得可靠?
内容:
1.什么是 MSL?为什么在客户端最后还要等待2MSL?
什么是 MSL?
MSL(Maximum Segment Lifetime,最大报文段生存时间)是指 TCP 报文在网络中存活的最长时间,即一个 TCP 报文在网络中最多可以存在的时间。超过这个时间报文将被丢弃。
为什么在第四次挥手之后,客户端要等待 2MSL?
在 TCP 四次挥手 关闭连接的过程中:
- 客户端发送
FIN
请求关闭连接。 - 服务器收到
FIN
后,回复ACK
确认,并进入 CLOSE_WAIT 状态。 - 服务器也发送
FIN
关闭连接,客户端回复ACK
并进入 TIME_WAIT 状态。 - 客户端等待 2MSL 时间后,才真正关闭连接。
确保服务器彻底关闭:
在 TCP 连接关闭过程中,最后的 ACK可能会丢失。为了保证客户端发送的最后一个ACK报文段能够到达服务端。在客户端向服务器发送最后一个ACK包之后,需要等待一段时间以确保这个ACK包已经顺利被服务器接收到并处理完毕。如果 ACK
丢失,客户端还能重新发送 ACK
,确保服务器彻底关闭。
避免旧连接导致的数据混乱:
如果客户端立即关闭连接,可能会遇到网络中残留的旧 TCP 报文,导致数据混乱。例如,如果新连接采用同样的源端口号,对于服务端而言这就是旧连接重新启动了,导致数据混乱。所以这个时候就需要等待 2MSL ,在旧连接的报文超时消失之后,从而避免新旧连接的数据混淆。
2.什么是TCP粘包现象?
什么是 TCP 粘包现象?
TCP 粘包:是指在 TCP 传输过程中,多条数据包被合并在一起,接收端一次性读取了多个数据包,导致应用层无法正确解析数据的情况。TCP 拆包:即一条数据被拆分成多个 TCP 报文,接收端需要多次读取才能获取完整数据。
服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;
(2)服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;
(3)服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取
到了D2包的剩余内容,这被称为TCP拆包;
(4)服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1
包的剩余内容D1_2和D2包的整包。
如果此时服务端TCP接收滑窗非常小,而数据包D1和D2比较大,很有可能会发生第五种可能,即服务
端分多次才能将D1和D2包接收完全,期间发生多次拆包。
TCP 粘包/拆包的原因
- TCP 传输的是一个无边界的字节流,没有固定的分隔符,所以 TCP 也没办法判断哪一段流属于一个消息就会出现粘包/拆包现象。
- Nagle 算法会将小数据包合并发送,以减少网络中的小数据包,提高效率,但可能导致粘包。
- 发送的数据大于MSS时,TCP 会自动拆分成多个数据包发送,导致拆包。
- 接收方调用 recv() 时,如果读取的数据长度大于实际数据,可能会一次性读取多个数据包,形成粘包。
注意:
粘包时:发送方每次写入数据 < 接收方套接字(Socket)缓冲区大小。拆包时:发送方每次写入数据 > 接收方套接字(Socket)缓冲区大小。
如何解决 TCP 粘包/拆包问题?
- 固定长度协议:例如规定每个包固定长度,比如64个字节大小,如果客户端发送的数据长度不足64个字节,则通过补充空格的方式补全到指定长度。适用于定长消息,但不适合变长数据。
- 添加消息分隔符:客户端在每个包的末尾使用固定的分隔符,发送端在每个包的末尾使用固定的分隔符,例如\r\n。如果发生拆包需等待多个包发送过来之后再找到其中的\r\n进行合并;例如,FTP协议;
- 添加消息头部:将消息分为头部和消息体,对端先收取包头大小字节数目(当然,如果不够还是先缓存起来,直到收够为止),然后解析包头,根据包头中指定的包体大小来收取包体,等包体收够了,就组装成一个完整的包来处理。
3.为什么服务端易受到SYN攻击?
什么是 SYN 攻击?
SYN 攻击 是一种常见的网络攻击方式,其利用TCP协议的三次握手过程中的漏洞,攻击者伪造大量 SYN 请求,让服务器消耗大量资源,导致无法处理正常请求。
SYN 攻击的原理
TCP 连接建立需要 三次握手,SYN 攻击发生在第二步:
- 客户端 → 服务器:发送 SYN
- 服务器 → 客户端:回复 SYN-ACK
- 客户端 → 服务器:发送 ACK,连接建立
- 攻击者伪造大量 SYN 请求,但不发送最终的 ACK。服务器进入 SYN_RECV状态,等待 ACK,但攻击者永远不回复。服务器的连接队列被填满,无法处理新的连接请求,导致 正常用户无法访问。
如何防御 SYN 攻击?
- SYN服务器不直接分配资源,而是发送一个加密的 SYN-ACK(包含编码的连接信息)。只有真正的客
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新