网络编程之基础篇一

时间:2022-12-17 22:22:55

1.软件开发的架构:

  1) C/S 架构:client server, 客服端与服务器端架构,这种架构是从用户层面来划分的,这里的客户端泛指客户端应用程序exe,程序要先安装,对用户的电脑操作系统环境依赖较大

  2)B/S 架构:browser server, 浏览器端和服务器端架构,

2.IP地址:

  ip地址是一个32位二进制数,通常被分割为48位二进制数(就是4个字节).ip地址通常用’点分十进制’表示,

  :100.4.5.6, 每一位都是0-255之间的十进制整数. 转为二进制:01100100.00000100.00000101.00000110

  mac地址是全球唯一的,网卡内置的地址;

  arp协议是通过目标ip地址来获取mac地址的

3.osi七层模型:

  七层分法: 物理层-数据链路层-网络层-传输层-会话层-表示层-应用层

  五层分法: 物理层(传电信号)-数据链路层(arp协议)-网络层(ip协议)-传输层(TCP/UDP)-应用层(ftp/http/https)

  四层分发: 网络接口层-网络层-传输层-应用层

4.socket概念:

  1)socket是应用层TCP/IP协议族通信的中间软件抽象层,他是一组接口.设计模式中,socket其实就是一个门面模式,

它把复杂的TCP/IP协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,socket去组织数据,以符

合指定的协议.

2)其实站在我们的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连

接和通信。也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这

台机器上的一个应用程序。所以只要确立了ipport就能找到一个应用程序,并使用socket模块来与之通信。

3)socket套接字,又称:伯克利套接字或bsd套接字.一开始,套接字被设计用在同一台主机上多个应用程序之间的通

讯。这也被称进程间通讯,IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型.

文件型套接字(AF_UNIX):  unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接

字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信.

网络型套接字(AF_INET):  所有地址家族中,AF_INET是使用最广泛的一个.

5.TCPUDP:

  TCP: 可靠的,面向连接的协议,传输效率低全双工通信,面向字节流

  UDP: 不可靠的,不面向连接的协议,传输效率高,面向报文,无拥塞控制,可一对多,多对多,多对一.

6.套接字(socket)初使用:

  首先,TCP是基于链接的,因此必须先启动服务端,然后再启动客户端去链接服务端.

 server服务器端:

    sk=socket.socket()       实列化一个套接字对象

    sk.bind((192.168.88.88,6613))  把地址绑定到套接字

    sk.listen()     监听链接

    conn,addr=sk.accept()  接受客户端链接

    ret=conn.recv(1024)  设置接受用户端信息多少

    print(ret)   打印客户端信息

    conn.send(b’xxx’) 向客户端发送信息

    conn.close()  关闭客户端套接字

    sk.close()   关闭服务器套接字

 client客户端:

      sk=socket.socket()  创建客户端套接字

      sk.connect(‘192.168.88’.88,6613) 尝试连接服务器

      sk.send(b’xxxx’)

      ret=sk.recv(10000) 对话

      print(ret)    打印获得的信息

     sk.close()   关闭客户端套接字

 

7.socket() 参数整理:

  默认: sk = socket.socket(family = AF_INET, type=SOCK_STREAM)

  

  family参数: AF_UNIX(基于文件形式的套接字)

                    AF_INET(基于网络形式的套接字)

  type 参数: 一种是基于TCP协议    SOCK_STREAM

                   一种是基于UDP协议   SOCK_DGRAM

8.打印进度条:print('\r'+ i*'=' + '>' + str(i*2) + '%',end='')  ifor i in range(51)里的

 

补充知识点:

1.交换机的通信方式:  广播,  单播,  组播

  功能:组成局域网,将数据以点对点或点对多的方式发送给目标

  路由器的功能: 跨网段的数据传输,为下联设备分配ip地址

2.TCP粘包原因:

  什么是粘包: 发送端发送数据后,接收端不知道该接收多少,所以导致数据混乱

  原因: 和包机制(nagle)  与  拆包机制.  都是发生在发送端的

3.操作系统本质就是个软件,只不过是用来直接操作硬件的,这是其特殊之处

4.进程的理论:

    进程是一个动态的概念,理解为正在运行的程序

    xx.sh  表示是个shell脚本文件       xx.bat  表示是个批处理脚本文件

    xx.out 表示Linux系统中的可执行文件    xx.exe  表示win系统中的可执行文件

    xx.lib  表示库文件            xx.dll   表示是个库

5.multiprocessing 内置模块,python提供,用于多进程编程

6.TCP只允许在同一个时间内,只能由一个客户端和服务器保持连接

  UDP允许一个服务器和多个客户端同时通信

  TCP协议的三次握手和四次挥手简述:

         三次握手: 第一次请求一定是客户端先发起!!!

                客户端向服务端发送请求连接

                服务端回复确认收到请求,并要求也连接客户端

               客户端回复服务器确认连接

       四次挥手: 谁先发起都可以,这里以客户端为例来说明

              客户端发起断开连接的请求,并表示我已没有数据发送,你有数据继续发,我继续收

             服务端回复确认收到

             服务端再次回复一个确认断开的连接请求

             客户端回复一个确认收到

  补充:syn=1代表请求建立连接;ack=1代表确认连接;seq=12..3是个序列号;fin=1代表请求断开链接

          TCP协议为什么比UDP协议可靠,主要原因是TCP会保留发送出去的数据备份,等另一端确认收到后才会销毁

    掉备份,如一段时间内没有收到回复,则重新再发送一次,UDP无此机制

网络编程模块统计:

socket套接字模块,  subprocess调用系统cmd窗口模块,  struct转定长数模块(packunpack)

1) struct模块示列:  import  struct

  y=struct.pack(‘类型’,数字) 把任意长度的数字转为固定4bytes长度的二进制

  num=struct.unpack(‘类型’,y)[0] 4bytes长度二进制反解成原数字,注意,反解出来的是个包含一个元素的

                   元组,含的这个元素就是转换前的数字,要使用就通过索引取出即可

    2)subprocess模块使用示列:

      r=subprocess.Popen( ‘cmd命令’ , shell=True,   #表示调用shell窗口去运行前面的命令

                                         stdout=subprocess.PIPE  #用来保存正确命令执行后的结果,结果为bytes类型

                                         stderr=subprocess.PIPE)  #用来保存错误命令执行后的结果,结果为bytes类型

      print(r.stdout.read().decode(‘gbk’))           #得到正确内容

      print(r.stderr.read().decode(‘gbk’))            #得到错误内容