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

这一章的名字不大好翻译,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)