TCP/IP协议(6):传输层之UDP
一、
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协议算法来实现。
转载自 一点一滴成长,原文链接:https://www.cnblogs.com/milanleon/p/6902232.html