python 之网络编程 一

本文介绍了网络编程的基本概念,包括OSI七层模型与TCP/IP模型,详细解释了各层的功能及常见协议。此外还介绍了IP地址、域名系统、套接字编程等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:

网络编程

网络起源 (了解)

网络目的 : 数据的传输

ISO : 国际标准化组织

OSI七层模型 —-》 网络通信的标准化流程

7层

  1. 应用层 : 提供用户服务,具体的内容由特定程序规定
  2. 表示层 : 数据的压缩优化加密
  3. 会话层 : 建立应用连接,选择传输层服务
  4. 传输层 : 提供数据传输服务,流量控制
  5. 网络层 : 路由选择,网络互连
  6. 链路层 : 提供链路交换,具体的消息的发送
  7. 物理层 : 物理硬件,接口 网卡的规定

osi模型优点 :

将功能分开,降低网络传输中的耦合度每一部分完成自己的功能,开发更加清晰专一

四层模型
应用层 : 应用层 表示层 会话层
传输层 : 传输层
网络层 : 网络层
物理链路层: 链路层 物理层

五层模型(tcp/ip模型)

  1. 应用层 : 应用层 表示层 会话层
  2. 传输层 : 传输层
  3. 网络层 : 网络层
  4. 链路层 : 链路层
  5. 物理层 : 物理层

要求 :

  1. 能够按顺序说出七层模型 五层和四层模型
  2. 知道每一层是什么作用
  3. 对网络消息传输流程有基本了解

协议 :

  1. 协议定义:
    网络通信中,各方必须遵守的规定。包括建立什么样的连接,消息结构等。
  2. 对应有哪些协议
5层模型对应的协议
应用层TFTP HTTP DNS SMTP
传输层TCP UDP
网络层IP
物理层IEEE

网络相关概念

  1. 主机 : host 表示一台计算机

  2. 本地使用 : ‘localhost’

    ‘127.0.0.1’

  3. 网络使用 : ‘0.0.0.0’
    ‘172.60.50.60’

  4. 获取计算机名:
    In [2]: socket.gethostname()
    Out[2]: 'admin'

  5. 通过计算机名获取地址:
    In [3]: socket.gethostbyname('admin')
    Out[3]: '127.0.1.1'

IP地址

  1. 在网络上确定一台主机的地址

    1. IPv4 :点分十进制 比如 192.168.1.72 0–255
      32位二级制表示

    2. IPv6 : 128位二进制

  2. windows cmd.exe 窗口 –》 ipconfig

  3. linux 查看本机地址 ifconfig

网络连接测试

  1. ping 172.60.50.60

特殊IP

特殊ip表示意思
127.0.0.1本地测试IP
0.0.0.0使用局域网内可用的IP
192.168.1.0表示当前网段
192.168.1.1通常是网络节点设备的IP (网关)
192.168.1.255广播地址

名获取服务器信息

 socket.gethostbyaddr('www.baidu.com')
('127.0.0.1', [],    ['119.75.213.61'])
   主机     主机别名   主机IP

将点分十进制IP转换为二进制

In [11]: socket.inet_aton('192.168.1.2')
Out[11]: b'\xc0\xa8\x01\x02'

二进制转换为点分十进制IP

In [12]: socket.inet_ntoa(b'\xc0\xa8\x01\x02')
Out[12]: '192.168.1.2'

功能 : 同上面两个完全相同。只是可以选择地址类型
inet_pton(socket.AF_INET,’192.168.1.2’)
inet_ntop()

域名:

  1. 定义: 网络服务器地址的网络名称

  2. 端口号 : 端口号是网络地址的一部分,在一个系统中 每个网络应用都会有一个端口号相对应。用来在接收消息时确定由谁来接收

    1. 范围 : 1–65535
      1–255 一些通用的众所周知程序占用
      256-1023 系统应用端口
      1024 — 65535 自用 >10000

    2. 获取应用端口:
      In [16]: socket.getservbyname('mysql')
      Out[16]: 3306

字节序

  1. 数据在内存中的存储解析方式,不同操作系统可能不同
  2. 网络字节序 : 不同的操作系统在消息收发时均按照该标准操作。

传输层服务

  1. 面向连接的传输服务 —-》 tcp协议

    1. 传输特征:

      1. 可靠的数据传输
      2. 可靠性指数据传输中 无失序 无差错 无丢失 无重复
      3. 所有消息传输前一定会建立连接,传输后一定会断开连接
    2. 三次握手: 在进行面向连接的数据传输前进行传输连接的过程

      1. 客户端向服务器发送连接请求(问是否可以连接)
      2. 服务器接收到连接请求进行确认,返回报文
      3. 客户端收到回复,进行连接建立
    3. 四次挥手: 在进行面向连接的数据传输时,断开连接的过程

      1. 主动方发送报文 告知被动方要断开连接
      2. 被动方返回报文,告知收到请求,准备断开
      3. 被动方再次发送报文给主动方,告知准备完毕可以断开
      4. 主动方发送报文进行断开
    4. 应用情况 :适用于传输较大的内容或文件,网络情况良好,需要保证传输可靠性的情况

      1. 比如 : 聊天信息,文件的上传下载,邮件传输,网页获取
  2. 面向无连接的传输服务 —》 udp协议

  3. 传输特点:

    1. 不保证可靠的数据传输
    2. 没有连接过程
    3. 数据的收发都比较自由,不会受另一端制约

    4. 适用情况: 网络情况较差,对传输可靠情形要求不高。需要提升传输效率的情况
      比如 : 网络视频,群聊,发送广播

socket套接字编程

  1. 目的 :
    通过编程语言提供的函数接口进行组合,更简单的完成基于 tcp 或者udp通信的网路编程

  2. 套接字 : 完成上述目标的一种编程方法

  3. 套接字分类

    1. 流式套接字(SOCK_STREAM): 传输层基于tcp的协议进行通信
    2. 数据报套接字 (SOCK_DGRAM):传输层基于udp协议进行通信
    3. 底层套接字 (SOCK_RAM):访问底层协议的套接字

TCP服务端

  1. 格式:
import  socket
socket.socket(socket_family = AF_INET,
              socket_type = SOCK_STREAM,
                            proto = 0)
  1. 功能 : 创建一个套接字
  2. 参数 : socket_family : 选择地址族类型 AF_INET
    socket_type :套接字类型 SOCK_STREAM 流式
    SOCK_DGRAM 数据报
    proto :子协议类型,没有子协议选择 0
  3. 返回值 : 套接字对象

  4. 绑定地址(IP 端口号)

    1. 格式:
      sockfd.bind()
    2. 功能 : 绑定地址
    3. 参数 : 一个元组包含两项
      第一项为IP第二项为端口号
      (’172.60.50.50’,8888)
  5. 将套接字设置可监听

    1. 格式:sockfd.listen(n)
    2. 功能 : 将套接字设置为监听套接字
    3. 参数 : n是一个正整数 表示监听等待队列的大小
  6. 等待接收连接请求

    1. 格式:connfd,addr = sockfd.accept()
    2. 功能: 阻塞等待处理客户端连接
    3. 返回值 : 第一个 : 一个新的套接字用来和客户端通 信
      第二个 : 连接的客户端的地址
    4. 阻塞函数:程序运行到阻塞函数的位置,如果某种期待条件没有达成则暂停继续运行。当条件达成后会结束阻塞继续运行。
  7. . 收发消息

    1. 收消息
      1. 格式:data = connfd.recv(buffersize)
      2. 功能 : 流式套接字接收消息
      3. 参数 : 一次最多接收多大的消息 字节
      4. 返回值 : 返回接收到的内容
    2. 发消息
      1. 格式:n = connfd.send(data)
      2. 功能 : 流式套接字发送消息
      3. 参数 : 要发送的内容 要求bytes格式
      4. 返回值 : 返回实际发送的字节数
  8. 关闭套接字

    1. 格式:close()
    2. 功能:关闭套接字 tcp套接字连接断开

tcp 客户端

  1. 创建套接字
    socket()
  2. 请求连接

    1. 格式: connect()
    2. 功能: 发起连接请求
    3. 参数: 是一个元组,表示服务器的地址
  3. 消息收发
    recv() send()

  4. 关闭套接字
    close()
  5. recv() 特性
    1. 如果连接双方断开连接,则recv会立即结束阻塞返回空字符串
    2. 当接收缓冲区为空的时候会阻塞
    3. 如果recv一次接收不完缓存去内容,下一次会继续接收
  6. send()特性
    1. 如果一段不存在,另一端还在试图send操作时会产生BrokenPipeError异常
    2. 当发送缓冲区慢的时候会阻塞
  7. 网络收发缓冲区
    • 发送和接收消息均先放到缓冲区中,在进行处理
      即 recv和send实际是从缓冲区接收内容,向缓冲区发送消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值