[python全栈]05.网络编程(1)

目录

  1. OSI七层模型
  2. 模型与网络协议
  3. 网络相关概念
  4. 面向连接的传输服务
  5. 面向无连接的传输服务
  6. 套接字编程
  7. TCP服务端编程
  8. TCP客户端编程

1. OSI七层模型

网络编程 :
	网络功能 : 数据传输
	网络标准 : ISO(国际标准化组织) >>> OSI 模型
					将网络通信工作流程标准化,模块化

OSI 七层模型 (从上层到底层,知道顺序以及每层的作用):
1.应用层 : 
	提供用户服务,具体服务由特定的程序而定
2.表示层 :
	提供数据压缩,优化,加密 
3.会话层 :
	建立应用级的连接,选择传输服务
4.传输层 :
	提供不同的传输服务,流量控制
------------------------------------------
5.网络层 :
	路由选择,网络互联
6.链路层 :
	进行数据转换,具体消息的发送,链路连接
7.物理层 :
	物理硬件,接口设定,网卡路由交换机等
OSI七层模型优点 :
	1.将工作流程标准化
	2.降低了模块间的耦合度,使每一部分可以单独开发,单独工作
高内聚,低耦合 :
高内聚 : 模块功能尽可能单一,不要掺杂
低耦合 : 模块之间尽可能减少关联和影响

2. 模型与网络协议

在实际工作中,7层模型过于冗余,故简化成了以下两种模型:
四层模型
	应用层
	传输层
	网络层
	物理链路层
五层模型(TCP/IP模型)
	应用层
	传输层
	网络层
	物理层
	链路层
数据传输流程 :
					发送(逐层打包)		接收(逐层解析)
					hello
应用层(+应用层首部)	*+hello				hello --->
传输层(+传输层首部) 	*+*+hello			*+hello
网络层(+网络层首部)	*+*+*+hello			*+*+hello
物理链路层-----------------------------> *+*+*+hello

1.发送端由应用层到物理层逐层添加信息头(首部)
	最终在物理层发送
2.中间经过节点(交换机,路由器)转发,发送到接收端
3.在接收端根据发送端的每个信息头进行解析,最终
	消息在应用层展示给接收用户
信息头的添加规则 : 网络协议
网络协议:在网络通信中双方都遵循的规定
		包括建立什么样的网络结构,消息结构,标识代表什么等
常用协议 :
应用层 : TFTP *HTTP DNS SMTP
传输层 : *TCP *UDP
网络层 : IP
物理层 : IEEE

3. 网络相关概念

网络主机 : 在网络中标识一台计算机	HOST
本地使用 : 'localhost' ; '127.0.0.1'(本机测试IP)
网络使用 : '本机IP' ; '0.0.0.0'(当前计算机的可用网卡地址)
查看本机IP : ifconfig(Linux;Unix) / ipconfig(Windows)
IP地址 : 确定一台主机网络位置的地址
		IPv4: 点分十进制 127.0.0.1 ; 每一部分取值范围0~255,共占用32位
		IPv6: 128位
连接测试 : ping ip 测试和某ip地址可否联通
			ping www.baidu.com
特殊 IP 地址 : 127.0.0.1 本地测试IP
				0.0.0.0 使用本地可用IP
				192.168.1.0 表示网段IP
				192.168.1.1 网关IP(路由器IP)
				192.168.1.255 广播地址
域名 : 网络服务器地址的名称(方便记忆)
		通过 DNS 协议将 域名 转换为 IP地址
网络端口号 : 端口是网络地址的一部分,用于区分一个网络主机上的网络应用
			*在一个系统中不同的应用监听各自的端口号
			取值范围: 1 ~ 65535
				1 ~ 255 是一些众所周知的通用端口 如:http server:80
				256~1023 系统应用端口
				1024~65535 自用端口 MySQL:3306
				建议使用 > 10000 的端口
网络字节序 : 数据在网络中传输的标准格式

python 模块 socket :
import socket ; 
			
#获取计算机主机名
socket.gethostname()
			
#通过计算机名获取IP地址 
socket.gethostbyname('localhost') 
			
#通过地址获取主机网络信息
#返回元组('主机名',['别名'],['网络地址']')
socket.gethostbyaddr('www.baidu.com') 

#将IP地址十进制转bytes以及bytes转十进制
socket.inet_aton('192.168.1.2')
socket.inet_ntoa(b'\xc0\xa8\x01\x02')
#>>>b'\xc0\xa8\x01\x02'
#>>>'192.168.1.2'

#获取某个应用的端口信息
socket.getservbyname('mysql')	#>>>3306
socket.getservbyname('ssh')	#>>>22
socket.getservbyname('http')	#>>>80

4. 面向连接的传输服务

传输层服务 :
面向连接的传输服务 :
	基于TCP协议的数据传输
TCP协议 :
	传输特征 : 提供可靠的数据传输,可靠性指数据传输中
				无丢失,无失序,无差错,无重复
	实现手段 : 数据传输断开前都需要进行传输和断开的确认
	
三次握手 : TCP传输在数据传输前建立连接的过程
				客户端(client)			服务端(server)
				SYN=1 Seq=X ----------------->
				<-------------------SYN=1 ACK=X+1 Seq = Y
				AXK = Y+1 Seq = Z ----------->
	1.客户端向服务器发送连接请求
	2.服务器收到请求后,回复确认消息,表示允许连接
	3.客户端收到服务器回复,进行最终标志发送确认连接
四次挥手 : TCP传输在连接断开前进行断开确认的过程
				客户端(client)			服务端(server)
				a
	1.主动方发送报文告知对方要断开连接
	2.被动方收到请求后立即返回报文告知已经准备断开
	3.被动方准备就绪后再次发送报文告知可以断开
	4.主动方发送消息,确认最终断开
	
TCP应用场景 : 适用于传输较大的文件,网络状况良好
			需要保证传输可靠性的情况
比如 : 网页的获取,文件下载,邮件传输,登录注册

5. 面向无连接的传输服务

基于 UDP 协议的传输
传输特点 : 不保证传输的可靠性,传输过程没有连接和断开的流程
			数据收发自由
UDP使用场景 :网络情况较差,对传输可靠性要求不高,需要提升传输效率
			不变连接,需要灵活收发消息  
比如 : 网络视频,群聊,广播发送
OSI 七层模型 ; TCP / IP 模型
TCP 服务 ; UDP 服务有什么区别
三次握手和四次挥手

6. 套接字编程

Python socket 模块
socket 套接字编程
 目标 : 根据 socket模块提供的接口函数,进行组合使用
 		完成基于TCP或者UDP 的网络编程
 套接字 : 完成上述目标的一种编程手段,编程方案
 套接字分类 :
 	流式套接字(SOCK_STREAM):传输层基于TCP协议的套接字编程方案
 	数据报套接字(SOCK_DGRAM):传输层基于UDP协议的套接字编程方案
 	底层套接字(SOCK_RAM):访问底层协议的套接字
 	
*面向连接的传输---TCP协议---可靠的---流式套接字
*面向无连接传输---UDP协议---不可靠---数据报套接字

7. TCP服务端编程

socket--->bind--->listen--->accept--->send/recv--->close
						 个---------------------------|
1.创建套接字
sockfd = socket.socket(sock_family = AF_INET,
					sock_type = SOCK_STREAM,
					proto = 0)
参数 : socket_family : 选择地址族类型 AF_INET (IPV4)
		socket_type : 套接字类型SOCK_STREAM 流式 / SOCK_DGRAM 数据报
		proto : 选择子协议类型,通常为0
返回值 : 返回套接字对象

2.绑定服务端地址
sockfd.bind(addr)
功能 : 绑定IP地址
参数 : 元组(ip,port)
		IP =  
		localhost 可以被本机用 127.0.0.1访问
		127.0.0.1 同上
		本机IP  192.168.205.127可以被别人用192.168.205.127访问
		0.0.0.0可以被别人用192.168.205.127也可以自己用127.0.0.1访问
		
3.设置监听套接字
sockfd.listen(n)
功能 :将套接字设置为监听套接字,创建监听队列(TCP需要)
参数 :n表示监听队列大小
*一个监听套接字可以连接多个客户端套接字

4.等待处理客户端连接请求
connfd,addr = sockfd.accept()
功能 : 阻塞等待处理客户端连接
返回值 : connfd 客户端连接套接字
		addr 连接的客户端地址
*阻塞函数 : 程序运行过程中遇到阻塞函数则暂停运行
			直到某种阻塞条件达成再继续运行
			如 input(' ') ; sockfd.accept() 

5.消息收发
connfd.recv(buffersize)
功能 : 接受对应客户端消息
参数 : 一次最多接受多少字节
返回值 : 接受到的内容
*如果没有消息则会阻塞

n = connfd.senf(data)
功能 : 发送消息给对应客户端
参数 : 要发送的内容必须是 bytes格式
返回值 : 返回实际发送消息的大小

6.关闭套接字
sockfd.close()
功能 : 关闭套接字

eg:
Linux/Windows 使用telnet客户端测试
cmd>>> telnet 127.0.0.1 8888

#tcp server.py
from socket import *

#创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)

#绑定地址
sockfd.bind(('localhost',8888))

#设置监听
sockfd.listen(5)

#等待接受连接
print("waiting for connect...")
connfd,addr = sockfd.accept()
print("connect from",addr)

#收发消息
while True:
	data = connfd.recv(1024)
	if data ==  b'##' :
		break
	print(data)
	n = connfd.send(b'Receive your message')

#关闭套接字
connfd.close()
sockfd.close()

8. TCP客户端编程

类似 telnet 作用
socket--->bind--->connect--->send/recv--->close

TCP客户端
1.创建套接字
	*必须相同类型的套接字才能通信
2.建立连接
	sockfd.connect(server_addr)
	功能 : 建立连接
	参数 : 元组,服务端地址
3.消息收发
	*消息收发要和服务端配合,避免两边都出现recv阻塞
4.关闭套接字

eg:

#tcp client.py
from socket import *

#创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)

#发起连接
server_addr = ('127.0.0.1',8888)
sockfd.connect(server_addr) 
#收发消息
while True: 
	data = input('发送>>>')
	sockfd.send(data.encode())  #转换为bytes格式
    if data ==  '##' :
        break
	data = sockfd.recv(1024)
	print("接收到",data.decode())

#关闭套接字
sockfd.close()

复习 :

OSI七层模型 和 TCP/IP 模型
三次握手和四次挥手过程
TCP和UDP的区别
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值