您的位置:首页 > 运维架构 > Linux

Linux Socket Programming by Example-第六章 基于无连接的UDP通信

2014-03-30 13:35 204 查看
这一章的名字不大好翻译,UDP其实也是网络连接的,只是一定程度上状态无关。

什么叫状态无关?

做个库设计的可能比好好理解。

比如GUI库是状态无关指的是什么意思?

假设我们调了2个API

1: DrawText(文字信息,颜色信息1)

2: DrawRect(矩阵大小)

状态无关,指得是调了1的API后,2执行时,颜色并没有由于1的影响而变为颜色信息1。

UDP是无连接状态,指的是前一个包发送,并不影响后一个包的发送。(严格意义上来说,这个也不对,前一个包肯定对网络流量有影响)

要是网络不连接,UDP还怎么连?连个鬼?你把网线拔了,UDP能发得出去?发得出去就不是搞IT,变大仙了。(大仙可是好职业,^_^)

为什么选UDP呢?万物皆有两面性。

优点: 

简单  简单就是美,编程最重要的简单  和TCP比,不需要3次握手,建立连接。打个比方,

      我给你发短信,不需要和你打招呼,直接发就是了。至于你看不看,就不知道了。

灵活  坦率来说,这点没理解,搞不清楚比TCP灵活在哪。

高效  不需要ACK,能最大利用带宽

快    不需要3次握手,可以直接发送。

支持广播 好东西,对于设备发现来说,很重要。

看起来,这些优点很牛,天下武功唯快不破。

不过,最大的优点快也可能是缺点。程序最重要的不是效率,而是准确。

你发一万个短信,女朋友就是不看,发了也是白发。价值为0* 10000 = 0

缺点:

不可靠  TCP就一定可靠?也不一定,在发送瞬间,关路由器,肯定也发不出去。

包有重复

包大小受限制  这点来说,其实TCP也一样,整个计算系统就没有一个东西是大小不受限制。

从我的观点来看,TCP与UDP就相当于 选择Java还是C编程。

选择TCP,系统帮你做超时重传,做序列化,做流量控制。

系统帮你做,优点是久经考验的老战士,全世界高手帮你设计算法。

选择UDP,一切责任在你,你自己看着办。

优点: 没有谁比你更懂想要什么。

比如,假设网络丢包概率为1%。

显然,100个包,最多丢一个。

你完全可以设计一个ACK机制,在收到第50个包时回一个ACK。

一般来说,高可靠网络用UDP,复杂高延迟网络用TCP。

UDP通信机制:也是基于经典的C/S构架

Client Server

创建Socket 创建Socket

绑定IP与Port(可选) 绑定IP与Port

发送Request Packet
接收Request Packet
处理Request
发送Response Packet(处理结果)

接收Response Packet

书中的列子稍微看看就可以了,实际项目中基本没啥用。

实际项目中,一般使用异步I/O复用, 关于这一块,建议看Unix 网络编程。

疑问1:

服务器端如何知道客户端来的IP地址与Port?

这个其实涉及到IP层协议。

IP层明确包含2个字段:
源端IP地址
目标IP地址

UDP协议:
16位源端口  16位目标端口

服务器端调用recvfrom函数时,内核调用sock_recvfrom 与inet_recvfrom返回

源端地址信息。

疑问2:

客户端是不是需要bind?

一般来说,不需要。

不过,对于有2个以上网卡,明确知道客户端使用哪个网卡的,建议bind,可以提高性能与系统稳定性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux socket udp