什么是TCP和UDP
  TCP和UDP是TCP/IP协议中的两个传输层协议,它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层协议(包
括:HTTP、SMTP、SNMP、FTP和Telnet)提供网络服务。TCP提供的是面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、
不可靠的数据流传输。面向连接的协议在任何数据传输前就建立好了点到点的连接。ATM和帧中继是面向连接的协议,但它们工作在数据链路层,而不是在传输
层。普通的音频电话也是面向连接的。
  
  可靠的传输协议可避免数据传输错误。其实现方式是:在构造数据包时在其中设置校验码,到达
目的地后再采用一定的算法重新计算校验码,通过比较二者,就可以找出被破坏了的数据。因为需要重发被破坏了的和已经丢失的数据,所以在需要重发数据时协议
必须能够使目的地给出源头的一个确认信号。有些数据包不一定按照顺序到达,所以协议必须能够探测出乱序的包,暂存起来,然后把它们按正确的次序送到应用层
中去。另外,协议还必须能够找出并丢弃重复发送的数据。一组定时器可以限制针对不同确认的等待时间,这样就可以开始重新发送或重新建立连接。
  
  数据流传输协议不支持位传输。TCP不能在一个包内以字节或位为单位构造数据,它只负责传输未经构造的8位字符串。
  
 
 非面向连接的传输协议在数据传输之前不建立连接,而是在每个中间节点对非面向连接的包和数据包进行路由。没有点到点的连接,非面向连接的协议,如
UDP,是不可靠的连接。当一个UDP数据包在网络中移动时,发送过程并不知道它是否到达了目的地,除非应用层已经确认了它已到达的事实。非面向连接的协
议也不能探测重复的和乱序的包。标准的专业术语用“不可靠”来描述UDP。在现代网络中,UDP并不易于导致传输失败,但是你也不能肯定地说它是可靠的。

  
  TCP工作流程
  现在让我们一起来看看TCP段的各个域,在IP包中它们紧跟在IP头部信息之后。第一个16位确
认了源端口,第二个16位确认了目的端口。端口的划分使IP主机之间可用单个的IP地址实现不同类型的并发连接。在绝大多数现代操作系统中,采用32位
IP地址和16位端口地址的组合来确认一个接口。源接口和目的接口的组合就定义了一个连接。有216或65536个可能的端口。最低的1024个端口是常
用的,它们是系统为特定的应用层协议所保留的默认设置。如:默认状态下,HTTP使用端口80,而POP3使用端口110。其它的应用可以使用编号更高的
端口。
  
  在接下来的两个域中,序列号和确认号是TCP实现可靠连接的关键。当建立一个TCP连接时,发送方主机发出一个随机的初
始化序列号给初始化器,初始化器将其加1后送回确认域的起始器,这意味着下一个字节可以发送了。一旦数据开始流动,序列号和确认号将跟踪已发送了那些数
据,那些数据已被确认。因为每个域都是32位,总共可以有232个值,所以每个域的范围是:0~4294967295,当超过上限时回到0。
  
  4位的偏移量代表TCP头部一共有多少个32位的信息。这个信息是必不可少的,因为有可选的头部区域,偏移量标识了头部的结束和数据的开始。
  
  TCP的设计者保留了接下来的6位,以防万一将来要对其进行扩展。实际上,自从RFC793(传输控制协议)1981年发布以来,还没人有恰当的理由使用这些位,在这一点上,Jon Postel和他的同事一定是过分谨慎了。
  
 
 随后的6位每个都是一个标志。若UNG标志位的值为1,意味着远在头部紧急指针区域的数据是有效的;若ACK标志位的值为1,则意味着确认号区域中的数
据是有效的。(注意:一个SYN包有一个有意义的序列号,但它的确认号是无意义的,因为它并不确认任何事件)PSH标志位使数据不必等待发送和等待接收。
RST标志位将断开一个连接。SYN(同步)标志位意味着序列号是有效的,FIN(结束)标志位将指出发送方已经发完了数据。
  
  
16位长的窗口区域表示了“滑动窗口”的大小,也就是告诉发送方它已经准备好接收多少个字的数据。TCP通过调整窗口的大小来控制数据的流量。一个值为0
的窗口意味着通告发送方:如果没有进一步的通知,接收器已满,不能再接收更多的数据了。大的窗口可以确保在任何给定的时间传输多达65536个未经确认的
字节,但是,当重发定时器超时且又没有得到接收确认时,窗口将减半,从而有效地降低传输速率。
  
  16位的校验码区域保证了数据的完整性,保护了TCP头部和IP头部的各个区域。发送方计算校验值并把它插入这个区域,接收方根据收到的包重新计算该值并比较二者,如果它们是匹配的,则认为数据是完整无损的。
  
  当设置紧急标志位时,紧急指针是一个16位的偏移量,它代表必须加快的最后一个字。选择区域可以容纳0或多个32位字,可扩展TCP的性能。大多数常用的选择区域支持大于65536字节的窗口,从而缩短了等待确认的时间,尤其是在高传输率时。
  
 
 TCP的传输机构有多个定时器。当一个包发送时,重发定时器开始计数;当收到确认信号后,重发定时器停止计数。如果超过设定时间段还没有收到确认信号,
就重发该包。一个比较棘手的问题是如何设置该时间段。如果太长,当网络传输错误增加时将导致不必要的等待时间;如果太短,就会产生过多的重复包从而降低网
络的反应时间。现代TCP协议根据实际情况对重发定时器进行动态设定。
  
  持续定时器对于避免死锁是必不可少的。如果网络收到了一
个大小为0的窗口确认并且丢失了随后的重发数据的确认,持续定时器将超时并发送一个探针。探针的回应将指出窗口的大小(也许仍为0)。保持定时器在本端没
有任何活动后,将检查在连接的另一端是否还有运行的进程。如果没有任何回应,该定时器将断开连接。
  
  当断开一个连接时,断开连接定时器将包的最大生命期加倍。该定时器在连接断开之前确保流量最大。
  
 
 不管重发过程执行得多么有效,很少的丢失包就能严重地降低TCP连接的流量。每个未收到的包或包的片段只会在重发定时器超时的时候才会丢失。在数据重发
时,接收过程一直在递送这些重发的数据,这样就使总体的数据传输陷于停顿,直到丢失的数据被取代为止。这些重发过程导致基于TCP的连接有时处于不稳定状
态。
  
  TCP与UDP的选择
  如果比较UDP包和TCP包的结构,很明显UDP包不具备TCP包复杂的可靠性与控制
机制。与TCP协议相同,UDP的源端口数和目的端口数也都支持一台主机上的多个应用。一个16位的UDP包包含了一个字节长的头部和数据的长度,校验码
域使其可以进行整体校验。(许多应用只支持UDP,如:多媒体数据流,不产生任何额外的数据,即使知道有破坏的包也不进行重发。)
  
 
 很明显,当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时,TCP协议是当然的选择。当强调传输性能而不是传输的完整性时,如:音频和
多媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择,如:DNS交换。把SNMP建立在UDP上的部分原因是设计者认为当发生网络阻塞时,UDP较低的开销使其有更好的机会去传送管理数据。TCP丰富的功能有时会导致不可预料的性能低下,但是我们相信在不远的将来,TCP可靠的点对点连接将会用于绝大多数的网络应用。

剖析tcp与udp及应用场景协议方案选择的更多相关文章

  1. 常用传输层协议(tcp/ip+udp)与常用应用层协议简述(http)

    一.计算机网络体系结构 二.TCP与UDP差异 1.TCP是面向连接的可靠传输,UDP是面向无连接的不可靠传输 面向连接表现在3次握手,4次挥手:可靠传输表现在未进行4次挥手时的差错重传,超时重传: ...

  2. [TCP/IP] 传输层-TCP和UDP的使用场景

    传输层-TCP和UDP应用场景 TCP(传输控制协议) 需要将要传输的文件分段传输,建立会话,可靠传输,流量控制 UDP(用户报文协议) 一个数据包就能完成数据通信,不需要建立会话,不分段,不用流量控 ...

  3. 传输层协议TCP和UDP

    本文力图简洁,让读者对TCP和UDP有个初步的认知.闲话少说,现在开始吧.TCP和UDP都是传输层的协议.TCP通过三次握手建立可靠连接,对未送达的消息重新进行发送.UDP不建立连接而直接发送,对未送 ...

  4. 一些重要的计算机网络协议(IP、TCP、UDP、HTTP)

    一.计算机网络的发展历程 1.计算机网络发展 与其说计算机改变了世界,倒不如说是计算机网络改变了世界.彼时彼刻,你我都因网络而有了交集,岂非一种缘分? 计算机与网络发展大致经历如下过程:

  5. 【转】HTTP学习---TCP和UDP协议的区别与应用

    [原文]https://www.toutiao.com/i6592813624689951239/ 概述 ⊙TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICM ...

  6. 面试:TCP和UDP协议

    目录 TCP 协议 UDP协议 TCP和UDP的区别 TCP和UDP的使用场景 一 TCP协议 1.TCP的头部格式 理解TCP协议,首要的就是TCP协议的头部格式 ·        Source P ...

  7. c# tcp udp 的使用场景

    之前用tcp实现了一个案例(远程协助),后来我考虑用udp去实现它,于是又研究了下udp,我发现理论上udp可以做到,但是有一些问题不知道会不会有瓶颈 我参照网上写了一个简单的示例如下 服务端接收.发 ...

  8. [转]VB Winsock 控件TCP与UDP连接实例

    [-] 可能的用途 选择通讯协议 协议的设置 确定计算机的名称 TCP 连接初步 接受多个连接请求 UDP 初步 关于 Bind 方法   利用 WinSock 控件可以与远程计算机建立连接,并通过用 ...

  9. TCP、UDP、HTTP、SOCKET之间的区别

    IP:网络层协议: TCP和UDP:传输层协议: HTTP:应用层协议: SOCKET:TCP/IP网络的API. TCP/IP代表传输控制协议/网际协议,指的是一系列协议. TCP和UDP使用IP协 ...

随机推荐

  1. Java实现ping功能的三种方法及Linux的区分

    前大半部份转自:https://blog.csdn.net/futudeniaodan/article/details/52317650 检测设备的运行状态,有的是使用ping的方式来检测的.所以需要 ...

  2. 51nod1284容斥定理

    1284 2 3 5 7的倍数 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题   给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数. 例如N = 10, ...

  3. UVA-1336 Fixing the Great Wall(区间DP)

    题目大意:长城(视作x正半轴)有n处破损.有一个智能修复机器人,它的初始位置和移动速度已知.每处破损处都有一组参数(x,c,d),x表示位置,c.d表示在时间t后再修复该处破损的花费为d*t+c.求用 ...

  4. Presto改造

    最近在打造一款可视化分析产品, 需要用到组合多数据源, 进行查询, 看了挺多开源的插件, 发现目前只有Presto比较符合, 但是由于Presto没有多用户机制和资源管理, 所以需要在这基本上构建多用 ...

  5. vue触底,触顶事件

    data(){ return{ songList: [], //歌单列表 totalPage: "", total: "", pageSize: 10, thi ...

  6. bzoj 1854 构图 并查集

    我们可以把一件装备看成一条边,两个属性看成两个点,那么这就相当于读入了一张图 当读入每一个x,y时,我们找到两个点的祖先节点,fx,fy,我们保证祖先节点在该连通块 中编号(装备属性)最大,用flag ...

  7. java应用简单递归

    毕业后就怎么学过算法,还在上学的时候学过数据结构,现在基本上都还给老师了,可惜老师学费没有还给我... 情景: 类似于给定一个数字,算他由多少个数字组成,比如:36 现在有10.5.1 ,那么最佳帅3 ...

  8. 关于apply、call和bind的总结

    基础知识不是你看了一遍书或者两篇文章就能掌握的. 之前看书看文章时,感觉自己看懂了就掌握了.呵呵!too young!too naive! 以前的坑还是要一铲一铲的填上的. 高程上面关于apply和c ...

  9. python 读写三菱PLC数据,使用以太网读写Q系列,L系列,Fx系列的PLC数据

    本文将使用一个gitHub开源的组件技术来读写三菱的plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 gi ...

  10. Yii在window下的安装方法

    首先,在http://www.yiichina.com/上下载yii 然后,配置系统环境变量,在win8下,按win+x,找到系统->高级系统设置->环境变量->path 把php的 ...