UDP协议
TCP协议与UDP协议都是位于传输层的协议,其中TCP协议即 Transmission Control Protocol,中文名为传输控制协议,UDP全称为 User Datagram Protocol,中文名为用户数据报协议。
两者都主要用于计算机之间的网络通信。
TCP与UDP再区分
在之前的文章里已经简略地介绍了TCP与UDP的区别,接下来再详细地说明一下。
因为TCP协议与UDP协议都是建立在IP协议之上的,因此有必要先来回顾一下IP协议。我们可能对IP协议了解的不是太多,但我们肯定接触或者听说过IP地址,什么是IP地址呢?IP地址是计算机在某一网络下的唯一标识,就像你要是想和一个人说话,肯定要先知道他的名字一样,最早的IP地址基于IPv4,现在基于最新的IPv6。
IP协议负责把数据从一台计算机通过网络传输给另一台计算机,IP协议会先把数据分成多个小块,称为IP包,然后将一个一个的IP包传输过去,但是,IP协议只是保证了计算机之间可以通过这种方式发送数据以及接收数据,对于IP包在传输过程中遇到的各种问题,比如数据丢失、数据重复等问题,这些问题IP协议无法解决。要想解决这些问题,则需要一些其它的协议来提供支持,即TCP协议。
TCP负责收集IP包并将它们按照合适的顺序送达,它采用重发机制,即当通信端A向通信端B发送数据后,它需要接收到通信端B发来的确认信息,如果没有收到,TCP协议则要求通信端A重发信息。
这使得TCP协议成为一种可靠安全的网络协议。TCP协议是面向连接的通信协议,它要求在进行通信之前需要先在通信的两端各建立一个socket,从而形成一条虚拟的网络链路,之后两端的程序就可以通过这条链路进行通信。即先建立连接,之后才能通信。
而UDP协议不需要建立连接就能通信,省去了建立socket的时间,UDP通信肯定是要比TCP通信更快的,但这样的通信却也是不可靠的,因为没有socket建立的双端链路,那么通信数据是否能够安全完整的到达另一端对于UDP协议来说是无法预测的。
另外,TCP是面向流的通信协议,而UDP则会将网络数据流转换为数据报进行传输。UDP将数据流封装成数据报,然后将数据报发送出去,在接收端再将数据报转换成实际的数据内容。
关于数据流与数据包以及数据报的解释,虽然在网上查了一些资料,但解释看不太懂,也可能是本人水平不到的缘故,所以以后再说。
总结一下,TCP与UDP协议的对比:
- TCP协议 :可靠、安全,传输大小无限制,需建立连接,序列化,不重复,不记录边界,差错控制维护开销大。
- UDP协议 :不可靠,不需要建立连接,传输快,传输大小有限制(64KB以下),差错控制维护开销小。
UDP编程
因为UDP协议不需要建立连接就能通信,所以在UDP协议里实际上是没有清晰的客户端/服务器的概念的。不过为了对比学习,在接下来还是分为服务器与客户端分别讲解。
UDP的服务器编程不需要事先与客户端建立连接,利用recvfrom()方法UDP服务器会接收来自任何客户端发送的请求。利用sendto()方法可以将数据发送到任何客户端上,sendto()需要两个参数,一个是数据data,一个是地址addr。
参考代码如下:
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',25555))
while True:
data,addr = s.recvfrom(1024)
s.sendto(b'Hello,%s!' % data,addr)
UDP的客户端编程不需要建立连接,利用sendto()方法就可以直接给客户端发送数据。给出实现代码:
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
for data in [b'Alice',b'Tom']:
s.sendto(data,('127.0.0.1',25555))
print(s.recv(1024).decode('utf–8'))
s.close()
总结:
使用UDP编程与使用TCP大同小异,只注意两点,在发送数据时,必须使用sendto()方法,它要求需要有两个参数,其中addr参数指定接收端的地址;而在接收数据时,既可以使用recv()方法,也可以使用recvfrom()方法,但recv()方法只返回接收到的数据,recvfrom()方法返回一个元组,该元组包含两个值,第一个值是接收到的数据,第二个值是发送端的地址。