Python-UDP 协议

相对TCP,UDP则是面向无连接的协议。

UDP 协议

我们来看 UDP 的定义:

UDP 协议(User Datagram Protocol),中文名是用户数据报协议,是 OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

从这个定义中,我们可以总结出 UDP 的几个特点以及其与 TCP 的区别:

  • UDP 是用户数据报协议,传输模式是数据报,而 TCP 是基于字节流的传输协议。
  • UDP 是无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
  • UDP 是简单不可靠的协议,它不提供可靠性,只是把数据包发送出去,并不保证能够到达目的地。由于它不需要在客户端和服务端之间建立连接,也没有超时重发机制,所以传输速度很快。

从以上特点,我们可以看到 UDP 适合应用在每次传输数据量小、对数据完整性要求不高、对传输速度要求高的领域。这里面最典型的就是即时通信的场景,微信是一个很常见的例子。相信大家在使用微信的时候都遇到过先发的消息后收到,或者有些发送的消息对方没有收到的情况吧,这就是 UDP 协议典型的特点,不保证传输数据的完整性和顺序性。除此之外, UDP 还应用在在线视频、网络电话等场景。

  • UDP 传输过程

    我们在讲 TCP 的时候,我们说 TCP 客户端和服务端必须先连接才可以传输数据:客户端先请求连接服务器,服务器接受连接请求,然后双方才可以通信。在 UDP 协议里,客户端只需要知道服务器的地址和端口号,就可以直接发送数据了。

  •  

     

  • TCP服务器的建立可以归纳这几步:

    • 创建 socket(套接字)
    • 绑定 socket 的 IP 地址和端口号
    • 接收客户端数据
    • 关闭连接

    TCP客户端的创建可总结为这几步:

    • 创建 socket(套接字)
    • 向服务器发送数据
    • 关闭连接

    这里需要注意的是 UDP 客户端连接到服务器的 IP 和端口号必须是 UDP 服务器的 IP 和监听的端口号,服务器服务器只需要绑定 IP 和端口号,就可以时刻准备接收客户端发送的数据,此时服务器处于阻塞状态,直到接收到数据为止。

  • UDP 客户端

    创建 socket,可以这样做:

  • # 导入socket库
    import socket
    
    # 创建一个socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

     

  • 创建 socket 时,第一个参数 socket.AF_INET 表示指定使用 IPv4 协议,如果要使用 IPv6 协议,就指定为 socket.AF_INET6。SOCK_DGRAM 指定基于 UDP 的数据报式 Socket 通信。

    创建了 socket 之后,我们就可以向目标地址发送数据报了:

  • # 发送数据
    s.sendto(b'Hello Server', ('127.0.0.1', 6000))

     

  • 第一个参数是需要发送的数据报内容,第二个参数是 IP 地址和端口号的二元组。

    如果是接收数据的话,我们可以这样写:

  • # 接收数据
    data, addr = s.recv(1024)
    # 解码接收到的数据
    data = data.decode('utf-8')

     

  • 接收信息的时候,第一个 data 表示接收到的数据, addr 是对方的 IP 地址和端口号的二元组。

    想要关闭 socket,直接调用 close() 方法即可:

  • # 关闭 socket
    socket.close()

     

  • UDP 服务器

    相比于客户端,服务器端只是多了一个步骤,在创建 socket 之后,需要绑定一个 IP 地址和端口号,以便接收客户端随时可能发送过来的数据。绑定的方法为:

  • # 绑定 IP 和端口
    s.bind(('127.0.0.1', 6000))

     

posted @ 2020-03-23 16:42  大橘子儿  阅读(314)  评论(0编辑  收藏  举报