什么叫状态无关?
做个库设计的可能比好好理解。
比如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 Programming by Example-第六章 基于无连接的UDP通信,布布扣,bubuko.com