浅入udp

  终于忙完学校课堂的事情可以做做自己想做的事情。前几天腾讯二面挂了,虽然有点失落但是也知道自己的不足就是基础不太好。其中有一个问题是:你能跟我说一下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之上的。

时间: 2024-10-07 10:30:45

浅入udp的相关文章

包学会之浅入浅出Vue.js:升学篇

上一篇<包学会之浅入浅出Vue.js:开学篇>中,我们初步了解单页面组件这个概念,现在通过一个项目,来进一步解析组件的应用吧,Go~ 需求背景 组件库是做UI和前端日常需求中经常用到的,把一个按钮,导航,列表之类的元素封装起来,方便日常使用,调用方法只需直接写上<qui-button></qui-button>或者<qui-nav></qui-nav>这样的代码就可以,是不是很方便呢,接下来我们将要完成以下页面: 这是我们组件库的首页,包含三个子

浅入浅出SQL注入

已经开始了学习牛腩新闻发布系统,在讲后台代码的时候讲了一些重构SQLHelper的知识,存储过程和触发器等,这些以前都是接触过的.而SQL注入是以前没有注意过的,所以停下来总结学习一下SQL注入. 首先什么是SQL注入呢? 实战篇~~~~~~~~~~ SQL注入概念 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到

浅入深出ElasticSearch构建高性能搜索架构

浅入深出ElasticSearch构建高性能搜索架构  课程学习地址:http://www.xuetuwuyou.com/course/161 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件 ElasticSearch5.0.0 Spring Tool Suite 3.8.2.RELEASE Maven3.0.5 Spring4 Netty4 Hadoop2.7.1 Kibana5.0 JDK1.8.0_111 二.课程目标 1.快速学习Elastic

包学会之浅入浅出Vue.js:结业篇

在第一篇<包学会之浅入浅出Vue.js:开学篇>和上一篇<包学会之浅入浅出Vue.js:升学篇>的学习中,我们首先了解了Vue环境的搭建以及两个重要思想--路由和组件的学习,通过组件库中的按钮组件和导航组件,相信大家也开始了解相应的知识点,接下来我们会详细分析下如何完成由多个组件组成一个复用组件的开发流程. 下面先看看我们的需求 列表组件quiList.vue 本节我们主要要完成这样一个列表功能,每一行的列表是一个组件,列表内可能出现按钮组件或者箭头组件,点击按钮组件可以自定义事件

浅入浅出---JQuery到底是什么?

学习完了JQuery之后,我便感觉云里雾里的,JQuery到底是什么,朦朦胧胧感觉到JQuery应该是javascript函数的封装,就应该像WinForm窗体应用程序中可以调用的系统函数,据之前所学的javascript,知道JavaScript是一种镶嵌在HTML文档中的一种脚本语言, <body> <formid="form1" name="form1" method="post" > <label for=&

C#事件浅入

为什么要使用事件呢?举个简单的例子,比如说你的界面上有个bottom按钮,然后你写了一个点击一下这个按钮就弹出一个消息窗口的代码,然而你要弹出消息窗口的这个事,开发控件的人并不知道,所以开发者预先定义好了这个事件,他并不关心你点击这个按钮要干什么,但是按钮却通过点击事件调用了你的代码. 其实事件说简单点:就像委托一样,只是他多了一个约束,这个约束就是当XXX达到了某个时刻(某个点),然后就触发了XXX事情: 还不理解,没关系,看个小例子:大家平时都喜欢关注微博吧,就拿这个做个例子吧,可能不是很好

浅入浅出EmguCv(一)OpenCv与EmguCv

最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领域非常有名的lena图片(据说是个裸女\(^o^)/~). 正当我摩拳擦掌准备开始opencv学习之旅的时候,习惯了GUI的我突然觉得用C++做开发弄界面很麻烦,不如用C#来的方便,于是又发现了一个封装了opencv的.net库,可以被VC++,VC#,VB.net调用,即EmguCV.网上对于Em

浅入浅出EmguCv(三)EmguCv打开指定视频

打开视频的思路跟打开图片的思路是一样的,只不过视频是由一帧帧图片组成,因此,打开视频的处理程序有一个连续的获取图片并逐帧显示的处理过程.GUI同<浅入浅出EmguCv(二)EmguCv打开指定图片>一样,只不过处理程序编程如下所示: 1 /// <summary> 2 /// 点击按钮打开指定图片 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <pa

浅入深出之Java集合框架(下)

Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. 温馨提醒:建议从(上)开始看哦~ 目 录 浅入深出之Java集合框架(上) 浅入深出之Java集合框架(中)   浅入深出之Java集合框架(下) 前 言 在<浅入深出之Java集合框架(中) >中介绍了Map接口的基本操作.使用的示例是在<浅入深出之Java集合框架(上)>中的模拟学