概述
注:网络编程并非是python独有的
一、网络编程
1.网络的功能:数据的传输
2.iso:国际标准化组织,非盈利公益机构,制定了osi七层模型
作用:使网络通信工作流程标准化。
osi七层模型:
应用层:提供用户服务,具体功能由应用程序实现。一般用python写的小程序都是应用层程序,在主板上的叫罗版开发,在主板之上的叫操作系统开发,操作系统之上的就是操作驱动开发,操作系统之上的是应用开发。
表示层:数据的压缩、优化、加密。比如QQ发消息,一般是发送一个包,里面包含你的头像、昵称、发送的信息、时间等等,且一般发送的包一般会有加密来保证安全。
会话层:建立用户级的连接,选择适当的传输服务。(应用于应用之间的连接)应对不同的传输需求来选择不同的传输服务。
传输层:提供传输服务。UDP和TCP。
网络层:做路由选择,网络互联。路由选择:网络消息传输需要有一定的介质,比如无线、有线网线,消息传输出去需要经过一个个的路由节点,主要是选择路由节点路径。比如现在发消息会从网卡发送出来经过本地的路由网关,然后再经过一个个路由节点送到目标主机上。
链路层:进行数据交换,控制具体数据的发送。所有的数据都要转换为01二进制发送,这就是链路层的作用,发送时是以数据帧为单位。
物理层:提供数据传输的硬件保证,如网卡、接口、传输介质。
作为python工程师一般是涉及使用前四层即应用层、表示层、会话层、传输层。网络运维工程师会涉及到网络层、链路层。
对外的网络传输都在用这个七层模型,但是对内网络,有些公司可能会制定自己的网络模型。
优点:
1.建立了统一的工作流程
2.分部清晰,各司其职,每个步骤分工明确。
3.降低了各个模块之间的耦合度,便于开发。编程讲究高内聚,低耦合。
注:
高内聚:功能的单一性,即模块的功能尽可能单一,不相互掺杂。
低耦合:模块之间尽可能少的相互影响,好处:修改一个模块时不需要再修改其他模块。
封装:将一个功能的代码封装为一个模块,提高代码的复用性。
TCP/IP四层模型:
实际工作当中是简化为四层模型,即TCP/IP四层模型,五层模型是将物理链路层分为物理层和链路层两部分。
背景:实际工作中工程师无法按照七层模型要求操作,逐渐演化为更符合实际情况的四层模型
应用层:集中了应用、表示、会话的功能。
传输层:
网络层:
物理链路层:因为链路层依托于(离不开)硬件设备,于是就合并了。
我们写的程序主要是应用层、传输层主要是操作系统,网络层和物理链路层有相应的网络工程师负责。
3.数据传输过程
应用层发送信息并添加一个应用层首部信息打包,然后发送给传输层;传输层会将这个消息添加传输层头部信息,然后传给网络层;网络层将接受到信息添加一个头部信息,然后发送给物理链路层;物理链路层接受后会添加一个包含IP之类的头部信息并打包;物理链路层发送这个信息给路由器,然后通过层层的交换机路由器节点,每个节点读取头部信息来确定下一个节点,最后到目标主机;目标主机接收到后,会根据物理链路层、网络层、传输层、应用层顺序进行层层解包,获得传输的信息。
传输过程中节点越少,包头部信息解析的越少,传输的也就越快。
【1】发送端由应用程序发送消息,逐层添加首部信息,最终在物理层发送消息包。
【2】发送的消息经过多个节点(交换机,路由器)传输,最终到达目标主机。
【3】目标主机由物理层逐层解析首部消息包,最终到应用程序呈现消息。
4.网络协议
网络协议:在网络数据传输过程中,双方或大家都遵守的一个规定,包括建立什么样的数据结构,什么样的特殊标志等。
每一层都有自己的协议(除了表示层和会话层),每一层的首部信息都是由协议来规定的。
TCP/IP协议族
应用层 TFTP HTTP SNMP(自检协议) FTP SMTP DNS(域名解析) ftp Telnet
传输层 TCP UDP
网络层 IP ICMP RIP OSPF BGP
5.网络概念
【1】网络主机(host)
功能:标识一台主机在网络中的位置(地址)。
主机本地地址:'localhost'或'127.0.0.1'
主机网络地址:linux使用ifconfig查看主机网络地址(inet地址),windows使用ipconfig来查看主机网络地址(以太网适配地址/无线地址),这个是路由器分配的,百度IP显示的是由运营商分配的。
自动获取地址:'0.0.0.0'自动匹配当前主机合适的网卡地址,比如同一台主机上有AB两个程序,B的地址为0.0.0.0,A可以用本地主机地址或外网地址访问B,其他主机也可以通过外网访问,根据不同的访问地址进行自动更改。
【2】IP地址
功能:确定一台主机的网络路由位置。
IP唯一:公网IP唯一,一个局域网内IP不重复,各个局域网都有上一级网段,根据上一级网段IP和局域网IP寻找目标主机。
结构:
IPV4 点分十进制表示 用三个.将IP地址分为四个部分,每个点取值范围是0-255,一个IPV4地址占32位,总共有2的32次方个IP地址储量。
IPV6 占128位,以十六进制来表示
特殊IP:
127.0.0.1 本机测试IP
0.0.0.0 自动获取本机网卡地址
xxx.xxx.xxx.0 通常表示一个网段(同一个局域网内表示一个网段)
xxx.xxx.xxx.1 通常表示一个网关(网关一个局域网内交换机的地址)
xxx.xxx.xxx.255 通常用作广播地址
【3】域名:
定义:给网络服务器地址起的名字
作用:方便记忆,表达一定的含义
* ping [ip]:测试和某个主机是否联通
DNS:是个应用层协议,虽然是通过域名访问服务器,实际上域名需要先转换成地址,这个其实在应用层就完成了,每一台主机都会有一个DNS地址,然后访问DNS服务器,DNS会将域名和IP先注册相对应,然后返回相应的内容
【4】端口号(port):
作用:端口是网络地址的一部分,用于区分主机上不同的网络应用程序。每个应用程序会监听一个端口,来进行数据的接受。
特点:一个系统中的应用监听端口不能重复。
取值范围:1 —— 65535
1 —— 1023 一般是系统应用或者大众程序监听端口
1024 —— 65535 自用端口,建议使用一万以上的端口
二、传输层服务:
面向连接的传输服务(TCP)
1.传输特征:提供了可靠的数据传输,可靠性指数据传输过程中无丢失,无失序,无差错,无重复。
2.实现手段:在通信前建立数据连接(三次握手),通信结束要正常断开连接(四次挥手)。
【1】三次握手(建立连接):
client(客户端) sever(服务端)
1.客户端向服务器发送消息报文请求连接;
2.服务器收到请求后,回复报文确定可以连接;
3.客户端收到回复后,发送最终报文连接建立。
【2】四次挥手(断开连接):
1.主动方发送报文请求断开连接;
2.被动方收到请求后,立即回复,表示准备断开;
3.被动方准备就绪,再次发送报文表示可以断开了;
4.主动方收到确定,发送最终报文完成断开。
3.适用情况:对数据传输准确性有明确要求,传输文件较大,需要确保可靠性的情况。比如:网页获,文件下载,邮件收发。
面向无连接的传输服务(UDP):
1.传输特点:不保证传输的可靠性,传输过程没有连接和断开,数据收发自由随意,数据传输效率较高。
2.适用情况:网络较差,对传输可靠性要求不高,如网络视频、群聊,广播。
三、socket(套接字编程)
1.套接字 基于TCP或UDP协议的编程方案,实现网络编程进行数据传输的一种技术手段。
2.python去实现套接字编程,只需要import socket,这个socket是python标准模块,不需要另外安装。
3.套接字分类
流式套接字(SOCK_STREAM):特征是以字节流方式传输数据,实现tcp网络传输方案。
数据报套接字(SOCKET_DGRAM):以数据报形式传输数据,实现udp网络传输方案。
面向连接 —— TCP协议 —— 可靠的 —— 流式套接字 —— 字节流形式
无连接 —— udp协议 —— 不可靠 —— 数据报套接字 —— 数据报形式
cookie:
dir结果中,全大写的可以认为是常量,全都小写的一般是属性变量或者是属性方法(函数),双下则是特殊方法
函数三要素:功能、参数、返回值。设计或了解一个函数从三要素入手。
__init__对象的初始化函数
4.tcp套接字编程:
【1】服务端流程:
服务端是等待被访问的,一个服务端可以同时连接多个客户端。
1.创建套接字
sockfd = socket.socket(socket_family = AF_INET,socket_type = SOCK_STREAM,proto = 0) #socket模块下面还有一个socket类,并不是函数
功能:创建套接字
参数:
socket_family 网络地址类型 默认值AF_INET表示IPV4 AF_INET6表示IPV6 AF_UNIX表示本地套接字
socket_type 套接字类型 默认值SOCK_STREAM表示流式套接字 SOCK_DGRAM表示数据报套接字
proto 筛选子协议 通常为0 因为TCP、UDP协议都没有子协议
返回值:套接字对象 或者说是实例化一个套接字对象
2.绑定地址
sockfd.bind(addr)
功能:绑定本机网络地址
参数:二元元祖(ip,port) 元祖格式 ('localhost',8888) ('127.0.0.1',8888) ('xxx.xxx.xxx.xxx',8888) ('0.0.0.0',8888) IP必须为str格式
没有返回值
3.设置监听
sockfd.listen(n)
功能:将套接字设置为监听套接字,确定监听队列大小 (一个监听套接字可以连接多个客户端,但是连接的过程需要一个一个来,队列就是连接过程有些延迟,让其他想连接但未连接的先等待,linux系统下不管用,因为linux自动设置了队列值,windows下和mac下可以正常使用)
参数:监听队列大小,必须为整数
4.等待处理客户端连接请求
connfd,addr = sockfd.accept()
功能:阻塞等待处理客户端请求
返回值:返回了有两个值的元祖
connfd 客户端连接套接字
addr 连接的客户端地址
sockfd 负责连接客户端 connfd负责和客户端通信
*阻塞函数:程序运行过程中遇到阻塞函数则暂停执行,直到达成某种条件后继续运行
5.消息收发
data = connfd.recv(buffersize)
功能:接受客户端消息,bytes格式
参数:每次最多接受消息的大小,即多少个字节,是一个整数
返回值:接收到的内容
n = connfd.send(data)
功能:发送消息
参数:要发送的内容 ,bytes格式
返回值:发送的字节数
*
str >>> bytes string.encode()
bytes >>> str bytes.decode()
6.关闭套接字
socket.close()
功能:关闭套接字
import socket
#创建套接字
sockfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定地址
sockfd.bind(('0.0.0.0',9999))
#设置监听
sockfd.listen(3)
#等待处理客户端连接
print('waitting for connect...')
connfd,addr = sockfd.accept()#操作系统帮我们自动完成三次握手
print('connect from:',addr)#打印客户端地址
print('cilenct socket:',connfd)#客户端连接套接字
#收发消息
data = connfd.recv(10240) #最多接受10240个字节的消息 #如果没有消息接受到,recv也会阻塞
print('Receive messages:',data.decode())#打印接受的消息
mass = input('>>')
n = connfd.send(mass.encode()) #英文也可以在前面加一个b,中文不可以
print('send %d bytes'%n)
#关闭套接字
connfd.close() #和客户端连接断开,操作系统帮我们完成四次挥手
sockfd.close()
【2】客户端流程
1.创建套接字
必须创建和服务端相同类型的套接字
2.请求连接
sockfd.connet(server_addr)
功能:连接服务器
参数:元组 服务器地址
3.收发消息
注意防止两端阻塞,recv send要配合使用,一方先recv再send,一方先send再recv。
4.关闭套接字
import socket
#创建套接字
sockfd = socket.socket()
#请求连接
server_addr = (('127.0.0.1',9999))
sockfd.connect(server_addr)
#收发消息
data = input('please input:n>>>')
sockfd.send(data.encode())
if data == 'exit':
socket.close()
data = sockfd.recv(10240)
print('from server:',data.decode())
#关闭套接字
将以上两行代码放到一台主机上,通过使用两个终端窗口即可访问。
最后
以上就是过时镜子为你收集整理的python3 网络编程的全部内容,希望文章能够帮你解决python3 网络编程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复