PythonNet(一)

一、网络编程

    1、网络功能:数据传输
     2、ISO(国际标准化组织)
     3、OSI七层模型  ——>网络通信工作流程的标准化

         应用层:提供用户服务,具体功能由特定的程序而定
         表示层:数据的压缩优化,加密
         会话层:建立应用级的连接,选择传输服务
         传输层:提供不同的传输服务,流量控制
         网络层:路由选择,网络互连
         链路层:进行数据转换,具体消息的发送,链路连接
         物理层:物理硬件,接口设定,网卡路由交换机等

        1、cookie(扩展):
            高内聚:模块功能尽可能单一,不要掺杂
            低耦合:模块之间尽可能减少关联和影响
       2、OSI七层模型优点:
            1、将工作流程标准化
            2、降低了模块间的耦合度,使每一部分可以单独开发,单独工作。

   4、四层模型

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

   5、五层模型(IPC/IP模型)

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

   6、数据传输流程:

        1、发送端由信息层到物理层逐层添加信息头部(首部),最终在物理层发送。
        2、中间经过节点(交换机,路由器)转发,发送到接收端。
        3、在接收端根据发送端的每个信息头进行解析,最终在应用层展示给用户。

   7、网络协议:

       在网络通信中协议各方必须遵守的规定。包括建立什么样的网络结构,消息结构,表示代表什么等。
       1、应用层 : TFTP   HTTP  DNS  SMTP
       2、传输层 : TCP     UDP
       3、网络层 : IP
       4、物理层 : IEEE

2、网络相关概念

  1、网络主机:在网络中标识一台计算机  HOST
         1、本地使用:'localhost'   或   '127.0.0.1'
         2、网络使用:'0.0.0.0'    Linux查询IP: ifconfig       Windows下查询IP: ipconfig
             如: '192.168.207.129'
         3、ifconfig  : 查看IP信息
   2、获取计算机名
         ipython3
         import socket
         socket.gethostname()
        通过计算机名获取地址
         socket.gethostbyname("")
       如: ipython3
          In [1]: import socket
          In [2]: socket.gethostname()
          Out[2]: 'tedu'
          In [3]: socket.gethostbyname("tedu")
          Out[3]: '127.0.1.1'
    3、IP地址
       1、网络上确定一台主机网络位置的地址
         IPv4: 点分十进制  比如 192.168.1.2   0--255   (32位)
         IPv6: 128位
       2、ping   ip:测试和某台网络主机是否联通
    4、特殊IP地址
        127.0.0.1  本地测试IP
        0.0.0.0    自动使用本地可用网卡IP
        192.168.1.0  代表当前网段IP
        192.168.1.1  通常为网关IP
        192.168.1.255  广播地址
   5、通过地址获取主机网络信息
        In [2]: socket.gethostbyaddr('www.baidu.com')
        Out[2]: ('127.0.0.1', [], ['119.75.213.61'])
                主机   别名    IP地址
      1、点分十进制地址转换为二进制
          In  : socket.inet_aton('192.168.1.2')
          Out: b'\xc0\xa8\x01\x02'
      2、二进制地址转换为点分十进制
          In  : socket.inet_ntoa(b'\xc0\xa8\x01\x02')
          Out: '192.168.1.2'
    6、域名:网络服务器地址的名称
        1、方便记忆
        2、名称表达一定的含义
    7、网络端口号
       端口号是网络地址的一部分,用去区分一个网络主机上的网络应用
       * 注意:在一个操作系统中不同的网络应用监听不同的端口号,以获取对应端口传递的信息
        1、取值范围:1----65535
           1--255          一些众所周知的通用端口,程序占用
           256 --1023   系统应用端口
           1024 --  65535  自用端口         建议使用>10000
        2、获取一个应用的端口信息
           In [12] : socket.getservbyname("mysql")
           Out[12]: 3306
        3、网络字节序:数据在网络中的传输格式

三、传输层服务:

  1、面向连接的传输服务

      1、基于tcp协议的数据传输
       2、传输特征:提供可靠的数据传输,可靠性指数据传输过程中无丢失,无失序,无差错,无重复。
       3、实现手段:数据传输断开前都需要进行传输和断开的确认
       4、三次握手:tcp传输在数据前建立连接的过程
           1、客户端向服务器发送连接请求
           2、服务器接受到请求后,回复确认消息,表示允许连接
           3、客户端收到服务器回复,进行最终标志发送确认连接
       5、四次挥手:tcp传输在连接断开前进行断开确认的过程
            1、主动方发送报文,告知被动方要断开连接
            2、被动方收到请求后立即返回报文,告知已经准备断开
            3、被动方准备就绪后,再次发送报文,告知可以断开
            4、主动发发送消息,确认最终离开
        6、应用情况:适用于传输较大的文件,网络情况良好,需要保证传输可靠行的情况。
            比如:网页的获取,文件的下载,邮件的传输,登录注册

  2、面向无连接的传输服务

      1、基于udp协议的数据传输
      2、传输特点:不保证传输的可靠性,传输过程没有连接和断开的过程,数据的收发比较自由。
      3、使用情况:网络情况较差,对传输可靠性要求不高,需要提升传输效率。不便连接,需要灵活收发消息。
           比如:网络视频,  群聊,广播发送等

四、socket 套接字编程

   1、目标:根据socket模块提供的接口函数,进行组合使用完成基于tcp或者udp的网络编程。
   2、套接字(socket):完成上述目标的一种编程手段,编程方案
   3、套接字分类
         1、流式套接字(SOCK_STREAM):传输层基于tcp协议的套接字编程方案。
         2、数据报套接字(SOCK_DGRAM):传输层基于udp协议的套接字编程方案。
         3、底层套接字 (SOCK_RAM): 访问底层协议的套接字编程。
          * 面向连接的传输——tcp协议——可靠的——流式套接字
          * 面向无连接传输——udp协议——不可靠—— 数据报套接字

五、tcp(流式)套接字服务端编程

   import socket
    1、创建套接字
      sockfd = socket.socket(socket_family = AF_INET,socket_type = SOCK_STREAM,proto = 0)
      功能:创建套接字
      参数:socket_family:选择地址族类型  AF_INET
              socket_type:套接字类型 SOCK_STREAM 流式
                                                  SOCK_DGRAM 数据报
               proto:选择子协议类型  通常为0
      返回值:返回套接字对象
    2、绑定服务端地址
        sockfd.bind(addr)
        功能:绑定IP地址
        参数:元组  (ip,port)         port为端口
        localhost     可以被本机用    127.0.0.1
        127.0.0.1    同上
        192.168.205.127(本机) 可以被所有人用192.168.205.127访问
        0.0.0.0     可以被别人用192.168.205.127访问, 也可以被自己用127.0.0.1访问
    3、设置监听套接字
        sockfd.listen(n)
        功能:将套接字设置为监听套接字,创建监听队列
        参数:n 表示监听队列大小(等待处理的进入连接的个数)
       *  一个监听套接字可以连接多个客户端套接字
    4、等待处理客户端连接请求
      conndf,addr = sockfd.accept()
      功能:connfd  客户端连接套接字
              addr      连接客户端地址
     * 阻塞函数:程序运行过程中遇到阻塞函数则暂停运行,直到某种阻塞条件达成再继续运行。
    5、消息收发
      1、connfd.recv(buffersize)
         功能:接收对应客户端消息
         参数:一次最多接收多少字节
         返回值:接收的内容
         * 如果没有消息则会阻塞
         * decode()字节转字符串,encode()字符串转字节
      2、n = connfd.send(data)
          功能 : 发送消息给对应客户端
          参数 : 要发送的内容 ,必须是bytes格式
          返回值 : 返回实际发送消息的大小(字节数)
    6、关闭套接字
        sockfd.close()
        功能 :关闭套接字

六、tcp(流式)客户端

    1、创建套接字
       * 必须相同类型的套接字才能通信,sockfd = socket.socket()默认为流式tcp套接字
    2、连接建立
       sockfd.connect(servr_addr)
        功能 : 建立连接
        参数 : 元组, 服务端地址
    3、消息收发
        *消息收发要和服务端配合,避免两边都出现recv阻塞(服务器先收后发,客户端先发后收)。recv中只有数据,recvfrom中有数据和谁发过来的信息。

             decode() 字节 –> 字符串,encode() 字符串 –> 字节。

        recv解阻塞2种方式:1、客户端发过来数据,2、客户端调用close,导致recv解阻塞。
    4、 关闭套接字

       sockfd.close()

     要求:(要求都重点,面试问题)
          1、osi七层模型介绍一下,tcp/ip 模型呢?
          2、tcp服务和udp服务有什么区别
          3、三次握手和四次挥手是什么意思,过程是怎样的

七、tcp传输注意事项

  1、tcp套接字传输注意事项

       1、监听套接字存在客户端即可发起连接,但是最终连接的处理需要accept进行处理
       2、如果连接的另外一端退出,则revc会立即返回空字符串
       3、当连接的另一端退出时,在试图send发送就会产生BrokenPipeError异常。

  2、网络收发缓存区

      缓冲区作用:协调收发(处理)速度,减少交互次数
      send和recv实际上是缓冲区进行交互,发送缓冲期满时就无法发送,接受缓冲区满时recv才阻塞

  3、TCP粘包

    1、产生原因: tcp套接字以字节流方式传输,消息之间没有边界,发送和接收并不能保证每次发送都及时的被接受
    2、影响:如果每次发送内容表达一个独立的含义,此时可能需要处理粘包防止发生歧义
    3、处理方法
         1、每次发送的消息添加结尾标志(人为增加消息边界)
         2、发送数据结构体
         3、协调收发速度,每次发送后都预留接收时间

总结:
   1. osi七层模型是什么?
   2. 三次握手和四次挥手?
   3. tcp和udp区别
   网络概念 : 主机    端口     IP   域名
   套接字 : 网络编程方式
     流式套接字:  tcp
     数据报套接字:udp
   tcp服务端流程:
     socket() ---> bind() ---> listen() ---> accept()--->
     recv/send ---> close()
   客户端
     socket() ---> connect() ---> send/recv --->close()

 

posted on 2018-10-11 19:28  破天荒的谎言、谈敷衍  阅读(453)  评论(0)    收藏  举报

导航