UDP和TCP网络编程

UDP和TCP

套接字(socket): 实现网络编程进行数据传输的一种技术手段,网络上的各种网络服务大多都是基于socket来完成通信的。

python套接字编程模块:import socket

UDP套接字编程:

. 创建套接字

sockfd=socket.socket(socket_family,socket_type,proto=0)
    功能:创建套接字
    参数:socket_family  网络地址类型 AF_INET表示ipv4
         socket_type  套接字类型 SOCK_DGRAM 表示udp套接字 (也叫数据报套接字) 
         proto  通常为0  选择子协议
    返回值: 套接字对象

绑定地址

  • 本地地址 : ‘localhost’ , ‘127.0.0.1’
  • 网络地址 : ‘172.40.91.185’ (通过ifconfig查看)
  • 自动获取地址: ‘0.0.0.0’

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B2PZwW8D-1605430266465)(C:\Users\hans_\Downloads\address.png)]

sockfd.bind(addr)
    功能: 绑定本机网络地址
    参数: 二元元组 (ip,port)  ('0.0.0.0',8888)
  • 消息收发
    data,addr = sockfd.recvfrom(buffersize)
    功能: 接收UDP消息
    参数: 每次最多接收多少字节
    返回值: data  接收到的内容
            addr  消息发送方地址

    n = sockfd.sendto(data,addr)
    功能: 发送UDP消息
    参数: data  发送的内容 bytes格式
          addr  目标地址
    返回值:发送的字节数
  • 关闭套接字
    sockfd.close()
    功能:关闭套接字

服务端客户端流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfBetFzl-1605430266467)(C:\Users\hans_\Downloads\11.png)]

UDP套接字特点

  • 可能会出现数据丢失的情况
  • 传输过程简单,实现容易
  • 数据以数据包形式表达传输
  • 数据传输效率较高

TCP传输方法

TCP传输特点

. 面向连接的传输服务

​ 传输特征 : 提供了可靠的数据传输,可靠性指数据传输过程中无丢失,无失序,无差错,无重复。

​ 可靠性保障机制(都是操作系统网络服务自动帮应用完成的):

​ . 在通信之前确定数据连接

​ . 确认应答机制

​ . 通信结束要正常的断开链接

. 三次握手(建立连接):

客户端向服务器发送信息报文请求连接

服务器收到请求后,回复报文确定可以连接

客户端收到回复后,发送最终报文连接建立

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZEwRf2Z-1605430266469)(C:\Users\hans_\Downloads\1_scws.png)]

. 四次挥手(断开连接):

    • 主动方发送报文请求断开连接
    • 被动方收到请求后,立即回复,表示准备断开
    • 被动方准备就绪,再次发送报文表示可以断开
    • 主动方收到确定,发送最终报文完成断开

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iTEwTQsg-1605430266471)(./img/1_schs.png)]

TCP服务端

  • 创建套接字
    sockfd=socket.socket(socket_family,socket_type,proto=0)
    功能:创建套接字
    参数:socket_family  网络地址类型 AF_INET表示ipv4
         socket_type  套接字类型 SOCK_STREAM 表示tcp套接字 (也叫流式套接字) 
         proto  通常为0  选择子协议
    返回值: 套接字对象
  • 绑定地址 (与udp套接字相同)

  • 设置监听

    sockfd.listen(n)
    功能 : 将套接字设置为监听套接字,确定监听队列大小
    参数 : 监听队列大小
  • 处理客户端连接请求
    connfd,addr = sockfd.accept()
    功能: 阻塞等待处理客户端请求
    返回值: connfd  客户端连接套接字
            addr  连接的客户端地址
  • 消息收发
    data = connfd.recv(buffersize)
    功能 : 接受客户端消息
    参数 :每次最多接收消息的大小
    返回值: 接收到的内容

    n = connfd.send(data)
    功能 : 发送消息
    参数 :要发送的内容  bytes格式
    返回值: 发送的字节数关闭套接字 (与udp套接字相同)

关闭套接字

TCP客户端

  • 创建TCP套接字
  • 请求连接
    sockfd.connect(server_addr)
    功能:连接服务器
    参数:元组  服务器地址
  • 收发消息

注意: 防止两端都阻塞,recv send要配合

  • 关闭套接字
TCP套接字细节
  • tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回一个空字串。

  • tcp连接中如果一端已经不存在,仍然试图通过send向其发送数据则会产生BrokenPipeError

  • 一个服务端可以同时连接多个客户端,也能够重复被连接

  • tcp粘包问题

    • 产生原因

      • 为了解决数据再传输过程中可能产生的速度不协调问题,操作系统设置了缓冲区
      • 实际网络工作过程比较复杂,导致消息收发速度不一致
      • tcp以字节流方式进行数据传输,在接收时不区分消息边界

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SjIXFVM3-1605430266473)(./img/13.jpg)]

    • 带来的影响

      • 如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。
    • 处理方法

      • 人为的添加消息边界,用作消息之间的分割
      • 控制发送的速度

TCP与UDP对比

  • 传输特征
    • TCP提供可靠的数据传输,但是UDP则不保证传输的可靠性
    • TCP传输数据处理为字节流,而UDP处理为数据包形式
    • TCP传输需要建立连接才能进行数据传,效率相对较低,UDP比较自由,无需连接,效率较高
  • 套接字编程区别
    • 创建的套接字类型不同
    • tcp套接字会有粘包,udp套接字有消息边界不会粘包
    • tcp套接字依赖listen accept建立连接才能收发消息,udp套接字则不需要
    • tcp套接字使用send,recv收发消息,udp套接字使用sendto,recvfrom
  • 使用场景
    • tcp更适合对准确性要求高,传输数据较大的场景
      • 文件传输:如下载电影,访问网页,上传照片
      • 邮件收发
      • 点对点数据传输:如点对点聊天,登录请求,远程访问,发红包
    • udp更适合对可靠性要求没有那么高,传输方式比较自由的场景
      • 视频流的传输: 如直播,视频聊天
      • 广播:如网络广播,群发消息
      • 实时传输:如游戏画面
        字使用sendto,recvfrom
  • 使用场景
    • tcp更适合对准确性要求高,传输数据较大的场景
      • 文件传输:如下载电影,访问网页,上传照片
      • 邮件收发
      • 点对点数据传输:如点对点聊天,登录请求,远程访问,发红包
    • udp更适合对可靠性要求没有那么高,传输方式比较自由的场景
      • 视频流的传输: 如直播,视频聊天
      • 广播:如网络广播,群发消息
      • 实时传输:如游戏画面
    • 在一个大型的项目中,可能既涉及到TCP网络又有UDP网络
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值