网编

网络编程

概念

  1. 两个地址

    1. 不变的:mac地址(在网卡上),能够唯一标识你这台机器

    2. 变化的:ip地址,能够更好地更方便的找到你这的机器

  2. 局域网

    1. 一个局域网内:

      1. 交换机:只理解mac地址,不理解ip地址,通过arp协议获取目标mac地址进行通信

      2. 交换机三种工作方式:

        1. 广播

        2. 单播

        3. 组播

      3. arp协议:地址解析协议。广播的方式发送数据包,获取目标主机的mac地址(计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网头,然后通过以太网协议发送)

      4. 网段:ip地址前三位,用子网掩码判断,见后图

    2. 局域网之间:

      1. 路由器:可以理解IP地址

      2. 网关:ip前两位

     

  3. IP地址

    1. ipv4:四位点分十进制(实际是四个八位二进制)

    2. 公网地址:需要我们自己购买

    3. 内网地址:保留字段

      1. 192.168.0.0 — ~.255

      2. 172.16.0.0 — 172.31.255.255

      3. 10.0.0.0 — ~.255

    4. 特殊的ip地址:

      127.0.0.1:本地回环地址,回到自己计算机,测试用

    5. 查看自己ip:ipconfig/ifconfig

    6. ipv6:六位冒分十六进制(FFFFFF:FFFFFF:FFFFFF:FFFFFF:FFFFFF:FFFFFF)

网络开发结构

  1. C/S架构:需要安装一下

    client:客户端

    server:服务端

    好处:功能更完善,可以离线使用,安全性更高

  2. B/S架构:

    browser:浏览器

    server:服务端

    好处:不用安装就可以使用,统一PC端用户的入口

  3. 两者的关系:B/S也是C/S的一种

  4. 端口port:用来连接电脑的应用

socket套接字

两个模块

server模块

 1  import socket
 2  3  sk = socket.socket()          # 创建一个server端的对象
 4  sk.bind(('127.0.0.1',9001))  # 给server端绑定一个地址
 5  sk.listen()                   # 开始监听(可以接收)客户端给我的连接了
 6  7  conn,addr = sk.accept()  # 建立连接 conn是连接
 8  conn.send(b'hello')
 9  msg = conn.recv(1024)
10  print(msg)
11  conn.close()     # 关闭连接
12 13  sk.close()

client模块

 
 1 import socket
 2  3  sk = socket.socket()
 4  sk.connect(('127.0.0.1',9001))
 5  6  7  msg = sk.recv(1024)
 8  print(msg)
 9  sk.send(b'byebye')
10 11  sk.close()

osi七层协议(应表会传网数物)

  1. osi5层协议(前三层为一层)

    应用层 python (内容)

    传输层 port udp tcp 四层路由器 四层交换机 (端口)

    网络层 ipv4 ipv6 路由器 三层交换机 (ip)

    数据链路层 mac arp协议 网卡 二层交换机 (mac)

    物理层 转化交流电信号

    一层一层封装,一层一层解析,每层都有自己封装解析的内容,封装与解析顺序相反

  2. tcp和udp

    1. tcp(全双工)(语音聊天/视频聊天) — 线下缓存高清电影/qq远程控制/发邮件

      • 先建立连接,然后才能通信

      • 占用连接,可靠(消息不会丢失),实时性高,慢

      • 建立连接 — 三次握手

         

        请求连接服务SYN,同意ACK

      • 断开连接 — 四次挥手

         

        请求结束服务FIN

      为什么握手三次,挥手四次?

      • 可能有遗留数据没有传送完,所以断开的两步必须分开

      三次握手四次挥手实例

       

    2. udp(发消息) — 在线播放视频/qq发消息/微信消息

      • 不需要建立连接就可以通信

      • 不占用连接,不可靠(消息因为网络不稳定丢失),快

包的导入

导入一个包(文件夹)相当于执行了这个包下的__init__文件并不相当于把这个包下的所有文件都导入进来了

  1. 要想直接导入某个包(文件夹)下的文件

    1. import as语句

      1  # import glance.api.policy as policy
      2  # policy.get()
    2. from import

      1  # from glance.api import policy    # 直接从一个包中导入文件
      2  # policy.get()
      3  # from glance.api.policy import get # 直接从包的文件中导入函数名/变量名
      4  # get()
  2. 进阶:绝对导入,相对导入

    1. 绝对导入:以glance作为起始

      • 当你需要写一个功能,这个功能不是直接运行的,而是被别人导入之后使用的,这种情况如果你的这个独立功能形成文件夹,文件夹内的所有文件都需要使用相对导入

    2. 相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)在相对导入时不能执行文件

      • 但是如果我们自己开发一个项目,这个项目有一些文件是需要直接运行的,这种情况下不适合用相对导入,适合用绝对导入

      •  

原文地址:https://www.cnblogs.com/zhangxiangning/p/10268768.html