【网络编程】01 网络IO与套接字编程 概述

目录

1. UNIX的 5 种IO模型


1.1. 基本概念

  1. 同步与异步:

    1. 同步:
    2. 异步:
  2. 阻塞与非阻塞

    1. 阻塞:
    2. 非阻塞:

1.2. UNIX–5 种I/O模型

  • 5 种IO
    • blocking IO
    • nonblocking IO
    • IO multiplexing
    • signal driven IO
    • asynchronous IO

1.2.1. 介绍

  1. IO multiplexing 多路复用IO

    1. 单个Process可以处理 多个网络连接的IO;
    2. select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达,然后通知用户进程;
  2. signal driven IO 信号驱动I/O

    1. 进程通过接受到的信号确认数据是否准备就绪;
  3. asynchronous IO

    1. 进程不受阻塞,将任务交给内核处理;
    2. 数据的拷贝在内核进行;

1.2.2. 对比 & 区别

  1. blocking IO & nonblocking IO
    1. 优点:等待任务完成的时间里,“后台”可以进行多个任务;
    2. 缺点:任务完成的响应延迟 增大了,导致整体数据吞吐量降低;

注意:

  1. IO多路复用+多线程处理基本满足 高性能并发服务程序;
  2. IO多路复用 比 异步IO 更加常用;

2. 线程模型

  • 阻塞式I/O服务模型
  • Reactor模式
  • Proactor模式

3. 套接字编程

  1. 概述
    1. UNIX/Linux的网络连接可以看成一个文件,拥有文件描述符,相当于windows系统中的 “文件句柄”;

3.1. socket的类型:

  1. Internet域套接字

    1. 流格式(sock_stream): 可靠的双向通信数据流,数据损坏或丢失可以重新发送;
    2. 数据报格式(sock_dgram): 计算机只管传输数据,不进行数据校验;
  2. Unix域套接字
    同一台机器上的进程之间的通信,Internet域也可以完成,但UNIX域效率更高;


3.2. 面向连接和无连接的套接字

  1. 面向连接
    1. 在正式通信之前,先确定路径;
    2. 优势:可靠,万无一失,传输效率低,耗费资源多;
    3. 使用场景:(TCP服务)HTTP、FTP服务等;
  2. 无连接套接字
    1. 传输效率高,但不可靠,有丢失数据包、捣乱数据的风险;
    2. 使用场景:(UDP服务),DNS,即时聊天工具;

3.3. 网络模型

3.3.1. 网络通信中确认身份

  1. IP地址、
  2. MAC地址
  3. 端口号
    1. web服务:80
    2. ftp服务:21
    3. smtp服务:25

4. 套接字编程


4.1. 基本概念和原理

  1. 网络数据的大小端问题:
    1. 大端序: 高位字节存储在低位地址;-- 高字节在前
    2. 小端序: 高位字节存储在高位地址;-- 低字节在前

4.2. 函数

  1. int bind(int sock, struct sockaddr *addr, socklen_t addrlen);
  2. connect() 函数
    1. 用于建立连接;
  3. listen()
    1. 让套接字进入被动监听状态;
  4. accept()函数
    1. 当套接字处于监听状态,该函数用于接收用户请求;

4.3. 发送数据 & 接收数据

  1. Linux

    1. Linux 不区分套接字文件和普通文件;
    2. 使用write() 向套接字中写入数据,使用read() 从套接字中读取数据;
  2. 函数说明


4.4. socket缓冲区以及阻塞方式

4.4.1. 缓冲区

  1. socket 建立以后,会分配输入缓冲区和输出缓冲区;
  2. 数据先发送到缓冲区,而不是直接发送到网络;

4.4.2. 阻塞方式

4.4.3. TCP协议的粘包问题

  1. 问题

  2. 解决方法


5. TCP协议与套接字

3次握手,4次挥手;

5.1. TCP & UDP 区别


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的IO网络编程主要涉及socket模块。在socket模块中,有一些常用的函数,比如accept()和recv()。这些函数都是阻塞的,也就是说,如果没有数据可接收,它们会一直等待,直到有数据可用。这种阻塞型接口是指系统调用(一般是IO接口)如果不返回结果就一直等待。在网络IO中,当一个read操作发生时,它会经历两个阶段:等待数据准备和将数据从内核拷贝到进程中。\[1\]\[2\] 在Python的IO编程中,常见的操作包括网络操作、文件操作和终端操作。网络操作包括建立socket对象、进行连接、发送和接收数据等。文件操作包括建立file对象,进行文件的读写操作。终端操作包括进行交互式输入输出等操作。\[2\] 举个例子,如果想要进行网络编程中的广播接收,可以使用socket模块中的相关函数。首先,需要创建一个UDP套接字,并设置套接字为可以接收广播。然后,选择接收端口,并在一个循环中接收广播消息。广播发送的代码似,需要创建一个UDP套接字,并设置套接字为可以发送广播。然后,使用sendto()函数发送广播消息。\[3\] 总结来说,Python的IO网络编程主要涉及socket模块,通过使用socket模块中的函数来进行网络操作、文件操作和终端操作。 #### 引用[.reference_title] - *1* *2* [python网络编程——网络IO模型](https://blog.csdn.net/JackLiu16/article/details/87838941)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python IO网络编程](https://blog.csdn.net/weixin_30802171/article/details/96956828)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值