一、

UDP用户数据报协议,它是一个无连接的,面向数据报的协议,它不提供可靠性但传输速度比TCP要快。

UDP数据报中的“UDP长度”为两个字节,所以我们要发送的UDP数据最多支持65507大约68K的数据,超过该大小的话需要自己来分割发送。 使用UDP必须关心IP数据报的长度,因为如果它超过MTU的话,会对IP数据报进行分片。

在UDP数据报文中,头部占8个字节,报文具体格式如下:


UDP适合一次只传送少量数据、对可靠性要求不高的场景:
  发送小尺寸的数据,如DNS通讯使用的是UDP以提高通信速度。
  流媒体、VOD、IPTV、音视频通讯等常采用UDP。
  UDP的高级应用:广播/多播、P2P、TCP over UDP。

二、广播/多播

1、

利用广播可以将数据发送到子网内所有计算机上,广播几乎占用了子网内网络的所有带宽,所以如果有多个进程来同时发送广播数据则网络会阻塞。路由器会隔绝广播。

对于广播发送方需额外设置两点:一个是设置套接字的SO_BROADCAST选项(BOOL bBroadcast = TRUE; setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(BOOL));),一个是发送数据的地址设为"255.255.255.255",其它按照UDP发送方模型来编程即可。

对于广播数据接收方按照UDP接收者模型来编程即可接收广播数据。

2、

多播地址即代表了一个组,用户可以加入或退出这个组,多播地址使用D类IP地址,范围是从224.0.0.0到239.255.255.255,而且有一些地址是保留作为特殊的地址所使用。网络中的交换机和路由器只向加入多播组的主机复制并转发数据,这样可以不影响其他不需要(未加入组)的主机的其他通讯。

多播编程方法与UDP模型也大体相同,对于发送端需要增加设置数据的TTL生存时间功能(使用函数setsockopt),对于接收端需要增加加入多播组的功能(使用函数setsockopt)。

多播需要网络硬件(如路由器)的支持或者硬件开启了多播服务。

3、

单播是主机之间一对一的通讯模式,可以使用TCP或UDP,网络中的交换机和路由器对数据只进行转发不进行复制。网络上大部分的数据都是以单播的形式传输的,如浏览网页、收发邮件等。对于广播或多播数据,网络中的交换机和路由器会对其进行复制并转发。

广播和多播一般只适合向不同客户传送相同数据的应用,如有线电视使用广播,网络电台使用多播,如果需要对每个客户的不同请求发送不同的数据的话只能使用单播服务器。因为广播和多播是仅发送一次数据所有的接收方就都能收到数据,所以发送方(服务器)流量负载很低,而单播服务器要向所有客户发送数据,即发送多次数据才能到达多个客户上,所以服务器网络负载大。

因为广播和多播使用的是UDP,发生丢包错包后无法重传。

三、P2P

NAT使只能内网中计算机去连接外网,然后二者再进行通信,而外网中的计算机是无法主动连接内网计算机进行通信的,所以产生了P2P通信技术来解决这个问题,这种方法也被称为NAT打洞。P2P技术广泛存在于基于UDP的应用中,但本质上,相同的技术也应该
支持TCP。

以UDP打洞为例,假设A要向B发送数据,A和B都已经登陆上了S服务器,则S能够知道A和B的外网地址、端口号(通过recvfrom()的sockaddr_in结构,我们称为公共终端)和本地地址、端口号(A、B登陆的时候向S发送,我们称为私有终端):

1、A通过S获得B的公共终端和私有终端后分别向两个终端发送数据以建立A和B的好友关系。
    2、A通过S让B向A的两个终端分别发送数据(B可以通过S获得A的两个终端)以确认A和B的好友关系。
    3、A收到B发来的数据后二者已成功建立好友关系,A可以直接向B发送数据了。
  在1和2中之所以要向对方的公共终端和私有终端都发送数据是防止A和B在同一子网中。

四、TCP over UDP

TCP over UDP具有UDP速度快、实时性高的特点,同时又兼备TCP的可靠性,它主要是在UDP之上参考TCP协议算法来实现。

TCP/IP协议(6):传输层之UDP的更多相关文章

  1. TCP/IP 协议图--传输层中的 TCP 和 UDP

    TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP. TCP 是面向连接的.可靠的流协议.流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但 ...

  2. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造

    在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...

  3. TCP/IP中的传输层协议TCP、UDP

    TCP提供可靠的通信传输,而UDP则常用于让广播和细节控制交给应用的通信传输. 传输层协议根据IP数据报判断最终的接收端应用程序. TCP/IP的众多应用协议大多以客户端/服务端的形式运行.客户端是请 ...

  4. TCP/IP五层模型-传输层-TCP协议

    ​1.定义:TCP是一种面向连接.可靠的.基于字节流的传输控制协议. 2.应用场景:TCP为可靠传输,适合对数据完整性要求高,对延时不敏感的场景,比如邮件. 3.TCP报文:①TCP报文格式: ②TC ...

  5. TCP/IP入门(3) --传输层

    原文:http://blog.csdn.net/zjf280441589/article/category/1854365 传输层的主要功能 1)传输层为应用进程之间提供端到端的逻辑通信(网络层是为主 ...

  6. TCP/IP 协议:链路层概述

    我们以一个常见的查看IP指令为出发点(ifconfig -a):   1.链路层是什么 链路层是指硬件层协议.也即网络所使用的硬件,比如:以太网(后文主要讨论对象),令牌环网,FDDI已经RS-232 ...

  7. TCP/IP协议族各层的作用

    从协议分层模型方面来讲,TCP/IP由四个层次组成:数据链路层.网络层.传输层.应用层一.数据链路层 数据链路层是负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层 ...

  8. TCP/IP 协议 OSI七层协议

    ------------------你来自何处并不重要,重要的是你要去往何方,人生最重要的不是所站的位置,而是所去的方向.人只要不失去方向,就永远不会失去自己! day 27 # # -------- ...

  9. TCP/IP五层模型-传输层-UDP协议

    ​1.定义:UDP:是非面向连接.不可靠的用户数据包协议. 2.应用场景:适合对数据完整性要求不高,但对延迟很敏感,比如即时通信(语音视频聊天等). 3.UDP报文格式: 4.用UDP传输数据的应用层 ...

  10. 网络编程的基本概念,TCP/IP协议简介

    8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或 ...

随机推荐

  1. 截图原理(二)——android自动化测试学习历程

    接上一篇(截图原理) 视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=87 ...

  2. 【laravel VS lumen】

    读取项目的配置信息 读取config文件database.php中的default属性信息 laravel:config('database.default'); lumen:app()->co ...

  3. 【centos】centos中添加一个新用户,并授权

    前言 有时候给root用户不太方便,新建一个用于并赋予权限这个做法相对好些 创建新用户 创建一个用户名为:cmj [root@localhost ~]# adduser cmj 为这个用户初始化密码, ...

  4. python之集合【set】

    初学python,今天晚上学习了set,做下set的总结,set的中文名也就是[集合],set的总结分为两部分,第一部分是set的创建,第二部分是set的操作,也就是set的功能:set的特点是无序的 ...

  5. ReactPHP── PHP版的Node.js(转)

    原文地址:http://www.csdn.net/article/2015-10-12/2825887 摘要:ReactPHP作为Node.js的PHP版本.在实现思路,使用方法,应用场景上的确有很多 ...

  6. VS2010,VS2012,VS2013中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法

    在VS2013开发环境下,C#引用COM组件遇到的两个问题: 一开始是COM组件没有注册导致代码引用报错,那么我就使用管理员的命令行方式下,入册COM组件: C:\WINDOWS\system32&g ...

  7. 从django的序列化到rest-framework 序列化

    1.利用Django的view实现返回json数据 from django.views.generic import View from goods.models import Goods class ...

  8. 那些年我们遇到的坑(1)-Description Resource Path Location Type Archive for required library

    在下载JAR包过程中遇到了错误,根据提示找到maven仓库报错的目录,将该目录下的所有文件删除重新下载即可

  9. SQL Server 2008数据库连接错误

    以Windows身份连接SQL Server 2008数据库时,连接不上,出现如下报错画面: 解决办法:打开services窗口,找到名字类似于SQL Server (xxx)的服务,启动服务. 注: ...

  10. divinglaravel.com

    https://divinglaravel.com/ 这是一个深入 laravel 的学习网站