网络编程(后端编程基础)
网络编程
ISO(国际标准化组织)
提出OSI网络通信模型(七层模型)
应用层:提供应用服务,具体的功能由具体的程序体现
表示层:数据的压缩,优化以及加密
会话层:建立应用级连接,选择适当的传输服务
传输层:数据的传输,网络控制
网络层:路由选择,网络互联
链路层:进行数据交互,控制具体消息发送
物理层:提供数据传输硬件保证,网卡,接口设备
四层模型:(TCP/IP模型)
应用层:应用层,表示层,会话层
传输层:
网络层:
物理链路层:物理层,数据链路层
引用自linhaifeng老师的博客图片
通信模型优点:
1、建立了统一的工作流程
2、分层清晰,每一层各司其职
3、降低了通信模块开发过程的耦合度
cookie
高内聚:模块的功能尽可能单一,不要相互掺杂
低耦合:模块之间的关联影响尽可能少
网络协议:网络通信中,双方都遵守的规定
应用层:SMTP HTTP
传输层:TCP UDP
网络层:IP ARP
链路层:PPP
物理层:IEEE
网络编程概念:
网络主机:在网络当中标识一台目标计算机 host
本地使用:'localhost' ip地址为:'127.0.0.1'
网络使用:
'172.88.3.102' #即你的电脑本机的ip地址
既可以本地,也可以网络:"0.0.0.0"
ip地址:网络上一台主机的网络路由位置
IPv4:点分十进制 192.168.1.1 每一部分0-255
IPv6: 128位
格式为X:X:X:X:X:X:X:X,
其中每个X表示地址中的16b,以十六进制表示(由于计算机只能识别二进制)
ip信息的查看
ifconfig : linux ip信息的查看
ipconfig: windows下ip地址的查看
pingp[ip address]:测试网络连接
特殊的ip地址:
127.0.0.1 本机测试ip
0.0.0.0 自动选择合适的本机网卡ip
192.168.1.0 表达一个局域网段
192.168.1.1 通常表示网关地址
192.168.1.255 广播地址
域名:
端口号(port):网络地址的一部分,用于区分一台终端数不同的应用
一个系统中,端口号不能重复使用
取值范围:1 -- 65535
1 -- 255 公共程序端口
256 -- 1023 系统应用端口
1024 -- 65535 自用端口
传输层服务:
1、面向连接的传输服务(TCP协议)
传输特征:
提供可靠的数据传输,可靠性指数据传输过程,无失序,无差错,无重复
实现手段:
在通信过程中需要发送端和接收端建立可靠的连接,通信结束要正常断开连接
连接过程:(即TCP三次握手)
1.客户端向服务端发送标志位变量请求连接
2.服务端收到请求后,回复消息允许建立连接
3.客户端收到回复,发送最终标志连接建立成功
client server
断开连接过程(四次挥手)
1.主动方向被动方发起断开请求
2.被动方收到请求后回复消息准备断开连接
3.被动方准备就绪,再次发送标志位表示可以断开
4.主动方发送最终断开标识
适用情况: 对数据准确性有明确的要求,数据传输文件大,需要确保可靠传输。
例如:文件下载,网页获取,邮件收发
面向无连接的传输服务(基于UDP协议)
传输特征: 提供不可靠的传输服务,不保证传输过程数据的完整性
适用特征:网络较差,对传输可靠性要求不高,或者传输不能建立连接,
例如:视频,群聊,广播
网络编程: 程序运行原理
套接字编程:实现网络编程,
socket模块实现套接字编程
socket套接字分类
流式套接字(tcp协议)SOCK_STRESM
面向连接的传输服务--tcp协议 --可靠
数据报套接字(udp协议)SOCK_DGRAM
phone = socket(socket_family = AF_INET,\
socket_type = SOCK_STREAM,proto=0)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#导入模块 from socket import * addr = ('127.0.0.1',8888) #创建套接字 phone=socket(AF_INET,SOCK_STREAM) #绑定地址 phone.bind(addr)#addr以元祖的形式给出服务器地址 #设置监听套接字 phone.listen(5) 功能:设置监听套接字,建立监听队列 参数:监听队列大小 conn,addr=phone.accept() #功能:阻塞等待处理客户端连接 #返回值:conn客户端连接套接字 #addr:客户端地址 #消息数据的收发 while True: data=conn.recv(buffersize=1024) #功能:阻塞等待接收客户端消息 #buffersize一次最多接收多少字节消息 print('server===>') print(data)#查看接收的数据 x = conn.send(data.upper()) #功能:发送数据 #参数:要发送的内容(byte类型) #返回值x指实际发送数据的大小 conn.close() phone.close() #关闭套接字
客户端流程:
1.创建套接字:
phone = socket()
要求数据传输两端套接字类型必须相同
3.发起连接
phone.connect(addr)
#发起连接请求
#参数:元祖,服务端地址
3.消息的收发:
recv()/send()
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#客户端 from socket import * add = ('127.0.0.1',8888) #创建套接字 phone = socket(AF_INET,SOCK_STREAM) #发起连接请求 server_add = (add) #连接服务端 phone.connect((server_add)) while True: data = input('输入>>>') phone.send(data.encode()) data1 = phone.recv(1024) print(data1.decode())