终于忙完学校课堂的事情可以做做自己想做的事情。前几天腾讯二面挂了,虽然有点失落但是也知道自己的不足就是基础不太好。其中有一个问题是:你能跟我说一下tcp和udp协议发生阻塞怎么办,对于tcp我还能够说一点流量控制,对于udp相关的知识我可以说几乎是空白。后悔以前上课没听已经没什么意义了,接下来继续学习才是最重要的!
1.用户数据报协议UDP
udp在传输数据之前不需要建立连接,收到udp报文后也不需要给出确认,在某些情况下它仍然是一种比较好的选择。由于用户数据报协议udp只在IP的数据报服务之上增加了很少一点的功能,比如复用分用和差错检测的功能。udp首部有源端口、目的端口、长度和校验和4个部分组成,各占2个字节,在可靠性较高的网络中可不计算校验和,这个字段的值将会为0。它的主要特点如下:
(1)无连接、尽最大努力交互,udp支持一对一、一对多、多对一和多对多的通信,udp首部开销小,只有8个字节。
(2)面向报文,面向报文指的是应用层下来的报文udp既不合并也不拆分,而是保留这些报文的边界。也就是说应用层将数据给传输层时,udp是直接在数据前加上udp首部后给ip层,一次发送一个报文。当接收方收到报文后,对ip层交上来的udp数据报去掉首部后直接交付给应用层。udp一次交付一个完整的报文,这要求应用程序选择合适大小的报文,若选择太大的报文则需要ip层进行分片,选择太小的报文IP数据报那么相对长度太大降低效率。
(3)udp没有拥塞控制。这样的话网络出现的拥塞不会使源主机的发送速率降低,这对某些实时应用是很重要的。但是也可以想象当很多源主机都向网络发送高速率的实时数据时,网络出现拥塞的话可能最后大家都接受不到数据。因此没有拥塞控制的udp还是有可能引起严重的网络拥塞问题。
2.对tcp与udp的思考
应用程序之间采用udp通信时,一般都会使用固定长度的数据报。对于tcp应用来说,数据到达内核后是可以积攒起来当达到一定数据量时进行首部的添加。这样的话显然可以节省开销,要知道tcp首部是有20个字节的,tcp在经过这么多年的实用与修改后已经有了非常好的平衡算法,那就是在延迟与吞吐量之间达到一个平衡。而且还有一点,tcp是不会进行分片的,它的大小由MSS决定,MSS一般小于MTU。现在,一个udp数据报如果很小或者很大,最后都会造成一个低效的结果,前面特点里提到太大就是将压力转移给IP层分片了。这样的话,突然就会觉得udp好像也不是印象中绝对的快了。正是因为如此,这2个协议应该在最适合各自的领域发挥作用,比如dns和snmp等协议使用的就是udp。
接下来想想面试官问的那个问题,也不知道是不是面试官看我是网络工程的,其实我现在觉得这个问题涉及的内容也好深的,这远远不是我今天花几个小时学习的udp知识可以解决的,应该是需要实际工作经验的积累。当tcp遇到阻塞时它会进行拥塞控制,其中有4个算法慢开始、拥塞避免、快重传和快恢复。再来看看udp,它没有拥塞控制,网络发生阻塞仍继续发送报文。这种情况下udp可能会造成网络阻塞到一种很严重的状况,而且情况还会更加恶化。所以从这里可以看出tcp有一个很大的优点就是虽然发生阻塞,但至少是朝着好的方向在发展,数据仍然在留流动。在网上没有找到解决udp拥塞的答案,我自己的想法是考虑到拥塞是整个网络的一种状态,不能仅仅说tcp拥塞或udp拥塞。由于tcp协议中有确认机制因此tcp拥塞可以体现出当前网络中确实发生了一些拥塞,那么tcp拥塞控制可以降低网络拥塞状。而udp协议它的设计本身就是没有可靠机制的,如果出现拥塞导致数据报太多,那么一般的处理情况就是直接丢弃了。
最后我有点好奇QQ使用的协议是什么,百度到QQ即使用了udp又使用了tcp协议,有人说使用udp是因为tcp要建立连接,这样的话服务器会受不了那么大的负荷。我又想到http是采用tcp协议的,网站的并发问题应该也很重要。http协议现在都开启了一个keep-alive特性,当浏览器请求服务器后用于传输信息的连接通道不会关闭,而是会保持一段时间在关闭,这样的话服务器同一时间仍然会保持很多连接,再想一下udp的优点就会疑惑http那样一个存在并发可能性的协议要采用tcp呢?第一个方面是http本质上类似于一次传输,但是浏览器对这个结果需要的精确度很高,稍有差错这个网页可能就无法解析,因此即便是短连接以及会有并发也要使用tcp,这就充分体现了tcp协议可靠性的优点了。第二个方面就是安全性的考虑了,很多安全协议是建立在tcp之上的。