12、TCP与UDP的区别
TCP作为面向流的协议,提供可靠的运输服务,并且提供点对点通信。UDP作为面向报文的协议,提供不可靠传输,并且不需要连接,不仅仅点对点,也支持多播和广播。
13、TCP的可靠性
TCP有三次握手建立连接,四次挥手关闭连接的机制。除此之外还有滑动窗口和拥塞控制算法。同时TCP有超时重传的机制。对于每份报文也存在校验,保证每份报文可靠性。
14、UDP的不可靠性
UDP面向数据报无连接,数据报发出去,就不保留数据备份了。仅仅在IP数据报头部加入校验和复用。UDP没有服务器和客户端的概念。UDP报文过长的话就将报文拆分成多个IP报文,如果某段报文废报文就废了。
15、TCP粘包现象
- TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。
-
- 发送方原因
TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:
-
只有上一个分组得到确认,才会发送下一个分组
-
收集多个小分组,在一个确认到来时一起发送
-
接收方原因
TCP接收到数据包时,并不会马上交到应用层进行处理,或者说应用层并不会立即处理。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。
16、TCP粘包现象处理方法
- 发送方
关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。
- 接收方
接收方没有办法来处理粘包现象,只能将问题交给应用层来处理。
- 应用层
循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成,但是如何判断每条数据的长度呢?
- 格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。
- 发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。
总结:固定发送信息长度,或在两个信息之间加入分隔符。
17、TCP协议的滑动窗口
- 滑动窗口是传输层进行流量控制的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,防止发送方发送速度过快而导致自己被淹没。
18、TCP协议的拥塞控制
- 拥塞是指一个或者多个交换点的数据报超载,TCP又会有重传机制,导致过载。
- 为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。
- 慢开始:由小到大逐渐增加拥塞窗口的大小,每接一次报文,cwnd指数增加。
- 拥塞避免:cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1。
- 快恢复之前的策略:发送方判断网络出现拥塞,就把ssthresh设置为出现拥塞时发送方窗口值的一半,继续执行慢开始,之后进行拥塞避免。
- 快恢复:发送方判断网络出现拥塞,就把ssthresh设置为出现拥塞时发送方窗口值的一半,并把cwnd设置为ssthresh的一半,之后进行拥塞避免。