您的位置:首页 > 理论基础 > 计算机网络

浅谈UDP协议的网络编程

2015-08-19 20:23 330 查看
UDP协议是User Datagram Protocol的缩写,UDP与TCP相比,具有速度快的优点,缺点是不可靠,因此主要应用于一些实时性很强的引用场景中,比如网络游戏,视频会议等。UDP协议和TCP下面我们首先做一个简单的对比,然后我们通过两个模型来形象的说明两者之间的区别。

TCP协议:可靠,传输大小无限制,但是需要连接建立时间,差错控制开销大。

UPD协议:不可靠,差错控制开销较小,传输大小限制在64KB以下,不需要建立连接。

有一个形象的比喻,如果将TCP比喻成打电话,那么电话线就是那条将两端连接起来的链路,而我们在电话必须经过如下三个步骤:1、先拨打对方的电话号码,向对方检查对方是否在线,第一次握手;2、如果对方电话在线则产生通话请求,第二次握手;3、对方电话铃响并按下接听键,通话建立,第三次握手;后面就可以开始正式通话了。

而对于UDP呢,我们这里将它比喻成投递信件,这里我们忽略UDP比TCP快这个属性,只讨论逻辑上的比喻。投递信件时(客户端),我们将所有要说的话全写在信里(将所有的数据都转换成一个byte[ ]),然后用信封装起来(在生成DatagramPacket实例时必须传入这个byte[
]),信封上必须写上收信人的地址和姓名,这个地址我们是事先通过查找知道的(在生成DatagramSocket的实例时必须传入服务器端的IP和端口),然后将这个信放入邮筒(建立DatagramSocket实例),等待邮差取走(调用send()方法),之后的事情我们就管不了了,我们不能确认对方一定能收到信件,因为投递不是即时的,首先投递的过程中存在着丢失的风险(路由的过程中的网络堵塞可能会丢包),然后收件人的地址可能发生了变化,而我们并不知道(服务器端的IP和端口号被占用或者发生了变化)。假设一起顺利,信件顺利到达目的地,收件人收到了信件(服务器端调用receive()方法),读到了信里的内容(对byte[
]进行解析),他需要对发件人进行回信,前面的操作和寄信相同,但是在信封上写收信人的地址和姓名时他事先并不知道,所以必须从寄过来的信封上得到(通过DatagramPacket的getSocketAddress()方法可以获取客户端的IP和端口),后面的过程于寄信过程并无差别,在此就不再赘述。

所以说,对于UDP而言,其实并没有明确的服务器端和客户端,一般而言,固定IP地址、固定端口的DatagramSocket对象所在的程序被称为服务器端,因为该DatagramSocket可以主动接收客户端数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: