为什么聊天软件一般采用UDP协议

TCP是美国国防部设计的两种传输协议之一,另一种是UDP。UDP是一种不可靠的网络服务,负载比
较小,而TCP则是一种可靠的通信服务,负载相对而言比较大。TCP采用套接字(socket)或者端口
(port)来建立通信。TCP给端口到端口通信提供了错误和流量控制机制,同时TCP还负责建立连接
、处理终止和中断的端对端通信控制。 
  
通常情况下我们认为TCP相比UDP具有更大的通信负载,UDP不具备TCP的控制特性,TCP用了大约20个字节来发送一个65Kbps的数据块,
这个报头占整个数据块的比重也不过3%。总得来看,这个负载是合理的,何况还令通信具有了可靠性性。
   tcp  udp
 是否连接  面向连接  面向非连接
 传输可靠性  可靠的  不可靠的
 应用场合  传输大量数据  传输少量数据
 速度  慢  快
 
所以UDP的速度快的优点是很关键的因素,而且,UDP是“推”的协议,有多少个接收客户,客户端
是否链接均无所谓,只顾把数据发送/广播出去就行;这对链接不可靠,需要一对多等情形很有用。
TCP关键是可靠,是基于可靠链接基础上的协议,因而可能较慢,网络数据量较大。

当然UDP并不一定永远都比TCP快。我们之所以认为UDP快,仅仅是从报头中传输的信息比重更大来考虑
的。但是如果网络情况,可能UDP就不一定比TCP快了。UDP只负责发送,因而不会管网络的情况,一旦
网络阻塞,继续发UDP包只会加重整个网络的负担。而此时TCP的控制及复杂的传输算法就起到很好的
作用了。通过自适应窗口等方式减少实际发往网络的数据。就像堵车的时候一样,UDP只会越来越堵,
而TCP还可以缓慢的行走。还有像聊天这种及时性高,如果采用TCP短连接,频繁的连接断开也会增加
网络负担。

综上所述:如果是每次连接时间较短,或者即时性要求高,发送内容较少,则采用UDP;而对数据完整
性、可靠性要求较高,传输性能要求较低时采用TCP。

而我们知道像QQ这种大型的聊天软件却主要使用的是UDP连接,而以TCP为辅。即使是传文件,也是以UDP
为主,个人认为这主要还是从服务器的角度来考虑的。
首先是每一个客户实际上都是和服务器交互,再由服务器转发给正在通信的用户。
如果每一个QQ从一上线到下线的这段时间全部采用TCP长连接,这对服务器的负担很大。而如果采用TCP
短连接,频繁的连接断开也会造成网络负担。而采用UDP则可以避开上述这些麻烦,减少服务器的负担。
基于上述不同,UDP和TCP编程步骤也有些不同,如下: 
TCP编程的服务器端一般步骤是: UDP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket();   

2、设置socket属性,用函数setsockopt(); * 可选 

3、绑定IP地址、端口等信息到socket上,用函数bind();  

4、开启监听,用函数listen();   

5、接收客户端上来的连接,用函数accept();

6、收发数据,用函数send()和recv(),或者read()和write();   

7、关闭网络连接;   

8、关闭监听;

1、创建一个socket,用函数socket();  

2、设置socket属性,用函数setsockopt();* 可选   

3、绑定IP地址、端口等信息到socket上,用函数bind();

4、循环接收数据,用函数recvfrom(); 

5、关闭网络连接;

TCP编程的客户端一般步骤是:  UDP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();   

2、设置socket属性,用函数setsockopt();* 可选   

3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选   

4、设置要连接的对方的IP地址和端口等属性;   

5、连接服务器,用函数connect(); 

6、收发数据,用函数send()和recv(),或者read()和write();   

7、关闭网络连接;

1、创建一个socket,用函数socket();   

2、设置socket属性,用函数setsockopt();* 可选   

3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选   

4、设置对方的IP地址和端口等属性; 

5、发送数据,用函数sendto();   6、关闭网络连接;

猜你喜欢

转载自blog.csdn.net/susu_php/article/details/81085700
今日推荐