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. 关于Oracle数据库字符集

    我们现在使用的字符集有以下两种: 推荐使用 AL32UTF8,避免以后数据导入导出字符集不同的麻烦. 推荐数据库设置参考图:

  2. STL迭代器之二:迭代器型别

    如果一个迭代器要兼容stl,必须遵循约定,自行以内嵌型别定义的方式定义出相应型别.根据书中介绍,最常用到的迭代器型别有五种:value type,difference type, pointer, r ...

  3. LinQ的查询操作

    LinQ的高级查询:-------------------在car表格进行练习操作: 一.模糊查询:1.在后台代码:(Contains)List<car>list=con.car.wher ...

  4. DataSnap 2009 系列之三 (生命周期篇)

    DataSnap 2009 系列之三 (生命周期篇) DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置 当DSServer启动时从DSServerClass组 ...

  5. 最简单的JS图片轮播

    var arr=new Array(); arr[1]="";//放图片地址 arr[2]=""; arr[3]=""; var no=0; ...

  6. win7系统部分便笺的元数据已被损坏怎么恢复

    解决Windows7系统打开便笺:部分便笺的元数据已被损坏,便笺已将其恢复为默认值.这个问题! Windows7下有一部分系统打开便笺就会报出以下情况 其实这个方法很好解决! 我们需要重新注册一下下面 ...

  7. 走进异步编程的世界 - 开始接触 async/await

    [C#] 走进异步编程的世界 - 开始接触 async/await   走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async ...

  8. 转载:Solr的自动完成实现方式(第一部分:facet方式)

    转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269059.html 大部分人已经见过自动完成(autocomplete)的功能了(见下 ...

  9. 介绍开源的.net通信框架NetworkComms框架之三 传递List

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  开源地 ...

  10. NIO vs. BIO

    性能测试 BIO -- Blocking IO 即阻塞式IO NIO -- Non-Blocking IO, 即非阻塞式IO或异步IO 性能 -- 所谓的性能是指服务器响应客户端的能力,对于服务器我们 ...