python 之网络编程 一

目录:

网络编程

网络起源 (了解)

网络目的 : 数据的传输

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实际是从缓冲区接收内容,向缓冲区发送消息

猜你喜欢

转载自blog.csdn.net/luohongtucsdn/article/details/81018340