UDP套接字:
1、在结构上比TCP简洁:UDP不会发送ack应答消息、不会分配seq
2、在编程上,UDP比TCP简单
3、虽然UDP缺少流控制机制,可靠性比不上TCP,但也不像想象中那么频繁的发生数据丢失与损毁
4、在重视性能而非可靠性的情况下,UDP是一种很好的选择
5、TCP的速度无法超过UDP,但是在收发某些类型的数据时有可能接近UDP,如每次交换的数据量越大,TCP的传输速率就越接近UDP的传输速率
5.不存在连接关系,不像TCP那样只能进行一对一的传输,只需1个UDP套接字就能和多个套接字进行通信(TCP中若要向10个客户端提供服务,除了监听套接字外,还需要10个套接字用于通信,UDP中无论服务器端还是客户端都只需要1个套接字)
UDP原理简单描述
UDP不会进行流控制,UDP数据包从一个主机准确的传递到另一个主机也是由IP层完成的,UDP进行的工作就是将UDP包交给接收主机的某一具体UDP套接字,即UDP根据端口号将传到主机的数据包交付给最终的UDP套接字
UDP的使用
UDP也具有一定的可靠性,尽管他没有TCP可靠
传递压缩文件时必须使用TCP,因为压缩文件只要丢失一部分就很难解压
传递音频或者视频就可以使用UDP,因为对于多媒体数据而言,丢失一部分不会有太大的问题,只会引起短暂的画面抖动,或细微的杂音
TCP比UDP慢的原因:
1、收发数据前后进行的连接设置及清除过程
2、收发数据过程中未保证可靠性而添加的流控制
因此当收发的数据量小但需要频繁连接时,UDP比TCP更加高效
UDP不需要连接
与TCP不同,UDP无需经过连接过程,即不必调用listen函数与accept函数,UDP中只有创建套接字的过程和数据交换的过程
UDP的I/O函数
TCP套接字可以与对方套接字保持"连接"(相当于TCP套接字知道目标地址信息),故传输数据时无需添加地址信息,由于UDP套接字不会保持连接状态(只有简单的邮筒功能),每次传输数据都要添加目标地址信息(相当于寄信时填写地址)
ssize_t sendto(int sock, void *buff, size_tnbytes, int flags, struct sockaddr *to, socklen_t addrlen);
参数一用于传递数据的UDP套接字的文件描述符
参数二待传输数据的缓冲区地址
参数三带喘数据长度,单位为字节
参数四可选项,没有传递0即可
参数五指向存有目标地址信息的sockaddr结构体变量的指针
参数六传递地址信息给参数五的结构体变量的长度
Ssize_t recvfrom(int sock, void *buff,size_t nbytes, int flags, struct sockaddr *from, socklen_t addrlen):
参数三可接收的最大字节数,不应超过参数二所指缓冲大小
UDP套接字不会保持连接状态,因此每次传输数据都需要添加目标地址信息
UDP套接字地址分配
在TCP中,服务器端对套接字地址的分配在bind函数调用时,客户端在connect时
UDP中,”服务器端”在调用bind函数时,”客户端”如果调用sendto函数时还未给套接字分配地址信息,则在首次调用sendto函数时自动分配,且分配的地址一直保留到程序结束,可用来与其他UDP套接字进行数据交换,分配地址时,IP用主机IP,端口号用尚未使用的任意端口号
UDP存在数据边界
TCP不存在数据边界(即数据传输过程中调用I/O函数的次数不具有任何意义)
UDP存在数据边界,传输过程中调用I/O函数的次数非常重要,发送端sendto函数的调用次数必须与接收端recvfrom函数的调用次数相等,这样才能保证数据的完全接收
UDP套接字中也存在缓冲区
未连接UDP套接字与已连接UDP套接字
UDP套接字默认属于未连接套接字,未连接UDP套接字调用sendto函数后经历以下过程:
1、向UDP套接字注册目标IP和端口号
2、传输数据
3、删除UDP套接字中注册的目标地址信息
每次调用sendto函数时重复上述过程,每次都可以变更目标地址,因此可以重复利用同一UDP套接字向不同目标传输数据
当要与同一主机进行长时间通信时,使用已连接UDP套接字效率会大大提高
创建已连接UDP套接字:
已连接UDP套接字跟普通UDP套接字的创建的区别仅仅是在sendto函数调用前,保存目标地址信息结构体完善后调用connect函数将目标地址注册到套接字上
注意:
1、创建套接字时的参数依然是SOCK_DGRAM
2、对UDP套接字调用connect函数也不意味着与对方UDP套接字连接,仅仅是注册地址信息
3、一旦成为了已连接UDP套接字,意味着已经指定了收发对象。每次调用I/O函数只需传输数据即可,也就是说,已连接UDP套接字不仅可以使用sendto、recvfrom函数,还可以使用write、read函数进行通信
套接字缓冲区参考连接;
http://www.cnblogs.com/xinglong/p/5928068.html
http://blog.chinaunix.net/uid-26921272-id-3446877.html