UDP协议  .vs.  TCP协议:

 原理上:(TCP报文段. vs . UDP用户数据报)

TCP协议的特性:

TCP是面向连接的运输层协议,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕之后,必须释放已建立的TCP连接。

每一条TCP连接只能有两个端点,每一条TCP协议只能是点对点的。

TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复并且按序到达。

TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。

TCP是面向字节流(即流入到进程或从进程流出的字节序列)。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系,但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。

TCP提供流量控制和拥塞控制。

UDP协议的特性:

UDP在传送数据前不需要先建立连接,远地主机的运输层在收到UDP报文后,不需要给出任何确认。

UDP不保证可靠交付,因此主机不需要维持复杂的连接状态表。

UDP是面向报文的。UDP保存应用层交下来的报文的边界(应用层交给UDP多长的报文,UDP就照样发送),一次发送一个报文。

UDP没有拥塞控制,吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制,因此网络出现的拥塞不会使源主机的发送速率降低。(这对某些实时应用是很重要的)。

UDP支持一对一、一对多、多对一和多对多的交互通信。

UDP的首部开销小,只有8个字节,比TCP首部的最小长度20字节(如果不计任选字段)要短。

UDP无法提供的TCP特性:

1.正面确认,丢失分组重传,重复分组检测,给被网络打乱次序的分组排序。TCP确认所有数据,以便检测出丢失的分组。

2.窗口式流量控制。

3.慢启动和拥塞避免。

小结:

1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

使用场合上:

UDP:非常在乎延迟,不能忍受重传的场合,比如实时音频、视频;网络极度可靠,不用考虑UDP的丢包问题,比如专门为有限局域网设计的协议;如果数据报的起止判定对程序会产生大问题,那么也可以考虑使用UDP;NAT穿透,不得不用UDP。

From UNP卷一:对于广播或多播应用程序,必须使用UDP;对于简单的请求-应答应用程序可以使用UDP,不过错误检测功能必须加到应用程序内部。错误检测至少涉及确认(增加序列号)、超时和重传。对于海量数据传输(如文件传输)不应该使用UDP。

TCP:如果不是非要使用UDP的场合(如前所述),那么使用TCP更好。

一些细节:

UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必需的。

UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的。

衍生问题:QQ为什么使用UDP协议而不是TCP协议?

01.当时没有epoll这种可以支持成千上万TCP并发连接的技术,所以腾讯使用了UDP,然后在UDP上面封装了一下,模拟了一下TCP,解决了大并发的问题。

02.TCP因为拥塞控制、保证有序等原因,在当时的网络状态下对带宽的利用率很低。而且因为网络抖动的原因,应用层心跳超时(一般不依靠keepalive)应用层主动断掉socket之后TCP需要三次握手才能重新建立链接,一旦出现频繁的小抖动就会使得带宽利用更低。而等待四次挥手的时间,也会占用服务器上宝贵的资源。而如果使用UDP对抗网络抖动,就可以自己去实现在应用层比TCP更快地探测和重传,一旦超过一定的时间没有收到回复,客户端可以选择马上重试或者换一个IP:PORT重试(假如你的服务像QQ一样有多个接入),在服务器端则可以果断地断掉socket。这样,,在当时的情景下,利用UDP去实现一个面向连接的协议,在当时的网络条件下,就可以尽可能地降低网络抖动的影响,同时也可以尽可能地利用整个带宽。

03.总的来说:

1.登陆过程,客户端client 采用TCP协议向服务器server发送信息,HTTP协议下载信息。登陆之后,会有一个TCP连接来保持在线状态。
2.和好友发消息,客户端client采用UDP协议,但是需要通过服务器转发。腾讯为了确保传输消息的可靠,采用上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。
3.如果是在内网里面的两个客户端传文件,QQ采用的是P2P技术,不需要服务器中转。
 
(来源:知乎问题:QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现?https://www.zhihu.com/question/20292749 )

TCP协议相关

TCP报文段的首部格式

01.源端口与目的端口(这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接)

02.序号,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,而该序号字段值标注的则是本报文段所发送的数据的第一个字节的序号

03.确认号,是期望收到对方下一个报文段的第一个数据字节的序号

04.数据偏移,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远

05.6个控制位:

URG: 当URG = 1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送。

ACK: 在连接建立后所有传送的报文段都必须把ACK置为1。

PSH: 接收方应尽快将这个报文段交给应用层。发送方立即创建一个报文段发送出去,接收方一收到报文段,就尽快交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

RST: RST=1表面TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或者拒绝打开一个连接。

SYN: 在连接建立时用来同步序号。

FIN: 当FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

06.窗口,指的是发送本报文段的一方的接收窗口,用于告知对端本端目前允许对方发送的数据量。

07.检验和。

08.紧急指针,指出本报文段中紧急数据的字节数。

TCP/IP详解系列 --- 概念总结01的更多相关文章

  1. TCP/IP详解系列 --- 概念总结02

    TCP复位报文段(RST)的用途: 1.当客户端程序访问不存在的端口时,目标主机将给它发送一个复位报文段:收到复位报文段的一端应该关闭连接或者重新连接,而不能回应这个复位报文段. 2.当客户端程序向服 ...

  2. 《TCP/IP详解 卷1:协议》系列分享专栏

    <TCP/IP详解卷1:协议>是一本详细的TCP/IP协议指南,计算机网络历久不衰的经典著作之一. 作者理论联系实际,使读者可以轻松掌握TCP/IP的知识.阅读对象为计算机专业学生.教师以 ...

  3. 『TCP/IP详解——卷一:协议』读书笔记——01

    从今日起开始认真研读TCP/IP详解这本经典制作,一是巩固我薄弱的计算机网络知识,二来提高我的假期的时间利用率.将心得与思考记录下来,防止白看-哦耶 2013-08-14 18:47:06 第一章 概 ...

  4. TCP/IP详解 (转)

    TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中 ...

  5. TCP IP详解(转)

    大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 网络七层协议简称OSI.TCP/IP刨除了物理层,并把上三层(会话层.表示层和应用层)统称 ...

  6. TCP/IP详解学习笔记 这位仁兄写得太好了

      TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...

  7. TCP/IP详解学习笔记 这位仁兄写得太好了.(转载)

    TCP/IP详解学习笔记   这位仁兄写得太好了   TCP/IP详解学习笔记   这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/20444 ...

  8. 【转】TCP/IP详解学习笔记(一)

      TCP/IP详解学习笔记   这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/204448.aspx TCP/IP详解学习笔记(13)-T ...

  9. TCP/IP详解学习笔记

    TCP/IP详解学习笔记(1)-基本概念 TCP/IP详解学习笔记(2)-数据链路层 TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议 TCP/IP详解学习笔记(4)-ICMP协议, ...

随机推荐

  1. Nginx配置文件说明

    在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释: #运行用户user www-data;    #启动进程,通常设置成和cpu的数量相等worker_processes  1 ...

  2. 用CMake设置Visual Studio工程中预处理器定义值

    构建VS工程时预处理值是不可缺少的,如动态库的导出配置等.在通过CMake构建VS工程时,可以通过CMake命令进行定义,下面讲三种应用. 字符集:默认装填下VS工程是多字节字符集,如果需要使用Uni ...

  3. DHCP服务器原理

    DHCP服务器   port:67 DHCP 这个服务可以自动的分配 IP 与相关的网络参数给客户端, 来提供客户端自动以服务器提供的参数来设定他们的网络   12.1 DHCP 运作的原理      ...

  4. python基础知识3——基本的数据类型2——列表,元组,字典,集合

    磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 一.列表 1.列 ...

  5. 8.15 CSS知识点6

    自定义动画 1.animation-name(动画名称) 元素所应用的动画名称,必须与规则@keyframes配合使用,因为动画名称由@keyframes定义. 语法: animation-name ...

  6. 谈谈对HTML语义化的理解

    什么是HTML语义化? HTML标签可以分为有语义的标签,和无语义的标签.比如table表示表格,form表示表单,a标签表示超链接,strong标签表强调.无语义标签典型的有<div>, ...

  7. Javascript use strict模式和对象

    use strict 只能出现在脚本代码的开始或者函数体的开始.任何实体语句之前.Javascript的具体实现将它们解析为解释器自有的指令.这个指令的目的是说明后续的代码将会解析为严格代码. ECM ...

  8. varchar(n),nvarchar(n) 长度、性能、及所占空间的说明

    varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. varchar(n)最多能存n个字节,一个中文是两个字节. 所占空间: nvar ...

  9. I2C总线和S5PV210的I2C总线控制器

    一.什么是I2C通信协议? 1.物理接口:SCL + SDA (1)SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道. (2)SDA(serial ...

  10. (转)不停止Nginx服务的情况下平滑变更Nginx配置

    在不停止Nginx服务的情况下平滑变更Nginx配置 1.修改/usr/local/webserver/nginx/conf/nginx.conf配置文件后,请执行以下命令检查配置文件是否正确: /u ...