Python网络编程零基础1

版权声明:转载请声明 https://blog.csdn.net/dirckes8813/article/details/84887673

1. 网络的概念

1)网络:多个节点通过特定的介质联系起来
         的一种关系
2)计算机网络:以计算设备作为节点
               通信线路作为介质的网络
3)互联网(英特网)
   把许多的网络连在一起的网络
4)起源:起源于冷战

2. 网络功能

1)数据与信息的传输
2)资源的共享
3)打破时空的限制

3. 网络分类:

   范围
   1)局域网:小范围网络,位于同一个网段的网络
   2)城域网:比局域网范围稍大的网络
   3)广域网:更大范围的网络

用户群体

   1)专用网:针对特定用户,例如军用网、金融网
   2)公用网:针对公众的

4. 网络性能的衡量指标

1)带宽:通信信道支持的最高数据传输频率
        单位:Mb/s, Kb/s, Gb/s
    100M 100Mbits
    b ==> bits   二进制位
    B ==> Byte   字节(8bits)

2)传输速率:每秒传输多少个bits数据

3)吞吐量:单位时间内通过某个网络的数据量

4)时延:发送到完成接收之间的时间差
- 传输时延:从发送到发送完成的时间
- 传播时延:电磁波、电信号在介质中传输
            所必须的时间
- 处理时延:网络数据交换节点进行
            存储、转发时候所需的时间
    - 排队时延:网络节点队列分组、排队所经历
            的时间

      * 路由器(router):网络核心设备

5. 网络编程的几个术语

1)服务器:提供网络服务的一方
2)客户端:请求服务的一方
3)通信:数据传输或交换的过程
4)协议(protocol):一组规则,数据的组织、
      编码、传输、校验、解析规则
  a =====> a

6. 网络通信的过程

   客户端          服务器
   请求服务        接收请求
                   解析请求
		   处理请求
		   返回响应
   显示响应结果

7. 网络通信要解决的问题

   		客户端---------服务器

   如何找到对方---------如何让对方找到自己
   如何联系对方---------如何让对方联系自己
   如何进行数正确传输---------如何进行数正确传输
   如何让对方正确理解自己的意思
   如何结束对话---------如何结束对话

   1)查阅域名系统(如果知道IP,可以直接连接对方)
     www.baidu.com(域名)===>119.75.217.26(IP)  
       域名系统:DNS
       服务器到域名系统注册、备案

   2)客户端主动向服务器发出连接请求
      服务器接收客户端发出的连接请求
      (三次握手)

   3)正确传输:通信协议来保证

   4)如何正确理解对方意思:应用协议来保证

   5)释放连接:释放资源(四次挥手)

**8. 协议**
   - 一组规则,规定了数据组织、编码、发送、
     传输、解析的标准
   - 由权威的机构制定或通信双方约定
   - 通信的参与方都必须遵守

9. ISO/OSI七层参考模型

   ISO:国际标准化组织
   OSI:开放式系统互联参考模型

   功能:网络通信过程的标准化
         把网络通信过程分为7个层次
	 每个层次完成特定的任务
	 
分解:分解过程,分解规模,降低复杂度

   优点:分解问题规模,降低复杂度
         各司其职
	 解耦

   #### TCP/ IP七个层次:
   
	    7 应用层(Application):
	      提供用户服务,具体定义程序或服务的功能
	      常用的应用协议有:
		http(用于超本文传输)
		pop3(邮件接收)
		smtp(邮件发送)
		telnet(远程登录)
		ftp(文件传输协议)
	
	    6 表示层(Presentation):
	       数据的压缩、优化、加密
	
	    5 会话层(session):
	       建立应用的连接,选择合适的传输服务
	
	    4 传输层(Transportation):
	       负责进程到进程间的通信
	       保证可靠性传输、差错校验、流量控制
	
	    3 网络层(Network):
	       负责主机到主机之间的通信
	       路由选择(寻址)、分段、网络互连
	
	    2 数据链路层(Data Link):
	       负责相邻主机间的通信
	       进行数据交换、控制消息收发、链路的连接
	
	    1 物理层(Physical):
	       定义机械、电器、物理标准
	       硬件特性、物理接口标准、传输介质

七层模型的特点:

   1. 建立了统一的网络工作流程
   2. 每个层次功能清晰,各司其职
   3. 方便了网络产品开发,推动了网络发展
   4. 没有实现

TCP/IP四层模型

   应用层(应用层、表示层、会话层)
   传输层
   网络层
   物理链路层(物理层、数据链路层)

五层模型

   应用层(应用层、表示层、会话层)
   传输层
   网络层
   数据链路层
   物理层

10. 封装、解封

   封装:每个层接收上一层传递的数据
         加入本层的控制信息(包头)
	 并且传递给下一层
   解封:每层接收下一层传递的数据
         读取并去掉本层的控制信息
	 并且将数据传给上一层

11. 数据包如何寻找路径

- 每个网络节点都有一个IP地址(全球唯一)
- 数据封包的过程中
  包含了数据的源地址、目的地址
- 网络转发设备,根据包头中记载的目的地址
  进行路径的查找(路由表)
  如果路由表包含到达目的主机的路径,则发送
  如果路由表不包含到达目的主机的路径
  则转发给下一个节点
  每个数据包包含一个生命周期值,每经过一个
  转发节点,该值就减1,如果该值为0还未
  转发到目的地址,该包就会被丢弃

12. IP地址

1)用32bits保存(IPV4)
11111111 11111111 11111111 11111111(真实)
255.255.255.255 (点分十进制表示法)
每部分的取值0~255
* ipconfig(windows)
  ifconfig(Linux/Unix)

IP地址构成:网络地址 + 主机地址

        172.40.91.140
* 掩码:255.255.255.0

 255转换成二进制:
 11111111 11111111 11111111 00000000
 
 掩码前面连续为1的部分是网络地址
 其它部分为主机地址

 私网地址:预留的一部分地址段,内网使用
A类:10.0.0.1--10.255.255.254
B类:172.16.0.1--172.31.255.254
C类:192.168.0.1--192.168.255.254

 特殊IP地址:
 127.0.0.1   代表本机地址(回环地址)
 0.0.0.0     本机绑定的所有IP地址  
 
 主机地址全部为1:表示广播地址
 例如:192.168.0.5 (C类)
       192.168.0.255  (主机部分全部为1)
        表示192.168.0网段的广播地址
	
 主机地址全部为0,表示网络地址(网段)
 例如:192.168.0.5 (C类)
       192.168.0.0 (主机部分全为0)
        表示192.168.0这个网段

 练习:有IP地址 192.168.10.25
       掩码:255.255.252.0
   
   求:网络地址
       求广播地址
  计算方式:
  第一步:将IP转换成二进制
    11000000 10101000 00001010 00011001
  第二步:将掩码转成二进制
    11111111 11111111 11111100 00000000

  第三步:取出前22bits为网络地址
          后面部分全部替换成0,转换成10进制
    11000000 10101000 00001000 00000000
   192.168.8.0  (网络地址)

    22bits后面部分全部换成1,转换成10进制
    11000000 10101000 00001011 11111111
       192.168.11.255 (广播地址)

13. 端口

  1)作用:区分或标记不同的服务/应用
  2)长度:16bits,1~65535
  3)说明:
     1~1023  系统保留使用
     1024~65535  应用
  4)常见端口:
     80    HTTP服务端口
     21    FTP服务端口
     22    SSH(加密远程登录)端口
     23    telnet端口
     3306  MySQL默认端口

     linux下使用下面的命令查看端口是否打开
        netstat -an | grep 端口号

     对于远程主机,连接远程的主机端口,看是否成功
	可以使用netcat,telnet工具连接端口

14. 传输层(TCP、UDP)

1)TCP:传输控制协议
        提供可靠传输
        数据无丢失、无重复、无差错

   如何实现可靠传输
      - 面向连接的传输方式
  - 每个数据包都有一个序号,用来
    保证数据传输中不丢包、不重复
  - 流量控制

   连接建立过程(三次握手)
     - 客户端向服务器发起连接请求
   并且带上自己当前的序号N
 - 服务收到连接请求后,产生一个应答
   带两个序号
          N+1:期望客户端下一个包的序号
      K:自己的序号 
 - 客户收到应答后,再给服务器一个应答
   带上序号K+1(期望服务器下一个包序号为
   K+1)

   断开连接:四次挥手
     - 主动方发送断开请求
 - 被动方收到请求,立即返回
   表示准备断开
 - 被动方处理完消息,完成断开准备
   发送报文,表示可以断开
 - 主动方收到指令,发送报文确认断开
   
   适用场景:数据量较大、可靠性要求高
       例如:网页访问,文件下载,网络游戏

2)UDP:用户报文协议
特点:无连接、不可靠传输
适用:数据量小、可靠性要求不高的情况
例如:QQ发送文字信息,DNS

  1. 服务器、客户端工作流程
    1)服务器
    创建socket -> 绑定地址 -> 监听 -> 接收请求
    循环收发数据 ->
    关闭连接

2)客户端
创建socket -> 发起连接 -> 收发数据 -> 关闭

==== 套接字socket的使用 ====

1. 什么是套接字
  1)用于计算机网络通信的一种接口
     利用socket可以在系统软件实现数据的收发
     最早由加州大学伯克利分校开发
     是目前计算机网络通信的基础、标准
     计算机双方要通信,必须建立在socket上

  2)套接字的类型
     - 流式套接字(SOCK_STREAM)
       + 面向连接、可靠传输、数据无差错的收发序列
       + 流量控制功能
       + 数据被看成字节流,长度无限制,多个数据包
         同时流入
    - 数据报套接字(SOCK_DGRAM)
       + 无连接、不可靠传输、数据可能丢包、重复
       + 数据构成为一个个独立的报文
         每一次发送数据就是一个数据报

  3)socket主要函数   
    - 创建:sokcet(socket_family=AF_INET,
                   socket_type=SOCK_STREAM,
		   proto=0)
	 参数:
	   socket_family  地址族类型,默认AF_INET
	   socket_type  套接字类型
	                SOCK_STREAM 流式套接字
			SOCK_DGRAM  数据报套接字
	  proto     子协议类型,默认填写0

- 绑定:bind
    格式:bind(address)
参数:address  地址元组
      第一个值为IP地址
      第二个值为端口地址

- 监听:listen
    格式:listen(backlog)
参数:backlog  未接收连接请求个数
      超过该值,则会拒绝后面的请求

- 接受连接:accept
    格式:sockfd, addr = s.accept()
功能:阻塞,等待客户端连接
      如果有新的连接,接受连接并返回
      返回两个参数
        sockfd: 新创建的socket,用于数据传输
	addr: 客户端地址

- 发送:send
  格式:send(data)
  参数:要发送的消息,要求bytes
  返回:返回实际发送的字节数

- 接收:recv
  格式:data = s.recv(buffersize)
  参数:buffersize 表示最多接收多少字节
  返回值:返回接收到的数据
          如果对方发送完成或关闭连接
      返回None

- 连接:connect(只能在客户端使用)
  格式:connect(address)
  参数:address  服务器地址

- 关闭连接:close
  格式:s.close()


基础只是参考前面博客


###基于TCP复制文件代码

服务端
# 建立Socket
from socket import *
sk = socket()
# 绑定
sk.bind(('0.0.0.0',9999))
# 监听
sk.listen()
# 阻塞等待缓冲区数据
conn,addr = sk.accept()
print('客户端连接已建立:',addr[0])
# 接收数据
try:
    f =  open('ss.jpg','wb')
    while True:
        fs = conn.recv(1024)
        print('文件接收完毕')
        if not fs:
            break
        else:
            f.write(fs)
    f.close()
except:
    print('文件打开失败!')
#关闭连接
sk.close()
conn.close()

# 建立Socket 连接
客户端
from socket import *
sk = socket()
sk.connect(('127.0.0.1',9999))
#读取文件
try:
    f = open('D:/Vscode/Mon02Demo/NetServer/Demo4/work/s.jpg','rb')
    while True:
        fs = f.read(1024)
        
        if not fs:
            break
        else:
            print(fs)
            sk.send(fs)
    f.close()
except:
    print('文件读取失败')
sk.close()

猜你喜欢

转载自blog.csdn.net/dirckes8813/article/details/84887673