小杰python(six day)——网络编程
1.网络协议模型
网络协议模型主要分成两类:
1.OSI模型:
OSI协议模型由ISO(国际标准化组织)提出的,是一种理想化模型,主要包含7层结构。
2.TCP/IP协议族:
TCP/IP是互联网上的工业标准,也是我们目前互联网的基础,它确保了不同类型的计算机和网络能够相互通信。
自下而上介绍一下每一层的作用:
网络接口和物理层:屏蔽硬件差异,向上层提供统一的操作接口。
网络层:提供端对端的传输,可以理解为通过IP寻址机器。
传输层:决定数据交给机器的哪个任务去处理
应用层:应用协议和应用程序的集合
2. IP地址
IP地址(Internet Protocol Address),即互联网协议地址,是分配给每一台联网计算机或设备的唯一标识符。通俗的讲,IP地址就是每台联网设备的身份证,它使得网络中的设备能够相互识别并进行通信。目前IP地址有两种:IPv4和IPv6。
IPV4地址
IPv4地址由32位二进制数组成,为了方便记忆,通常以**点分十进制**表示,即将32位二进制数分成4组,每组8位,中间用小数点分隔,例如:192.168.1.1。IPv4地址由两部分组成:**网络号**和**主机号**,但是随着网络的不断发展,网络设备的增多,IPv4地址空间有限,现在已经接近枯竭
IPV6地址
用于解决IPv4地址枯竭的问题。IPv6使用128位地址,这极大地扩展了地址空间。IPv6地址通常表示为八组四位十六进制数,每组之间用冒号隔开,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334。
(1)IPV4地址分类
3. 端口号
是计算机网络中用于标识特定网络服务或应用程序实例的数字,是一个16位的二进制数,其取值范围是0-65535。
http:应用层协议,BS架构下浏览器和服务器之间通信,80、8080
mqtt:物联网协议,1883
在同一台计算机上,通过端口号可以区分不同的应用程序或服务。
公认端口:端口号0-1023,这些端口被永久性地分配给特定的服务或应用程序。例如,HTTP服务通常使用80端口,HTTPS使用443端口。
注册端口:端口号1024-49151,这些端口可以被注册给特定的应用程序或服务,但不像公认端口那样固定不变。
动态或私有端口:端口号49152-65535,这些端口一般用于临时的客户端应用程序,也可以被服务器用于某些特定的服务。
4. TCP 和 UDP
相同点:
两个协议是都是传输层协议
不同点:
TCP是传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议;通过序列号、确认机制、校验和、流量控制、拥塞控制灯方式保证了它的高可靠性;主要应用在文件传输、电子邮件、web浏览器等领域。(流式套接字)
UDP是用户数据报协议(UDP,User Datagram Protocol)是一种无连接的、不可靠的、基于数据报的传输层通信协议;它具有传输速度快、比较轻量的特点;主要应用在实时多媒体传输、广播组播通信、简单的网络应用、快速数据传输等领域。(数据报套接字)
5. TCP 编程
C/S架构:client/server
B/S架构:browser/server
(1)编程步骤
服务端、客户端
(2) socket 模块
socket(套接字)是网络通信中的一个抽象概念,它是计算机之间进行通信的端点。在 Python 中,使用`socket`模块可以创建不同类型的套接字,实现客户端与服务器之间的通信。
import socket
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
功能:创建套接字
参数:family:指定地址族
socket.AF_INET:这是最常见的地址族,表示IPV4地址。使用这个地址族创建的套接字可以在互联网上与其他IPV4主机进行通信。
socket.AF_INET6:表示IPV6地址。
type:套接字类型
socket.SOCK_STREAM:面向连接的流式套接字,如TCP
socket.SOCK_DGRAM:无连接的数据报套接字,如UDP
proto:协议编号,通常为0,表示自动选择合适的协议。
fileno:如果指定了文件描述符,则使用该文件描述符创建套接字,而不是创建新的套接字,通常不指定。\
返回值:套接字对象
(3)常用方法
bind(address)
功能:将套接字绑定到指定的地址和端口
参数:address:是一个元组,包含ip地址和端口号
如:('127.0.0.1', 8888)
listen(backlog)
功能:开始监听连接请求
参数:backlog:可以挂起的最大连接数量
sockfd, addr = accept()
功能:等待客户端的连接,这个方法会一直阻塞到有客户端连接
返回值:返回一个新的套接字对象和客户端的地址,新的套接字对象可以用于与客户端进行通信,而客户端的地址通常是一个元组,包含客户端的 IP 地址和端口号。
connect(address)
功能:连接到指定的地址。`address`是服务器的地址和端口号组成的元组。
send(data)
功能:发送数据
参数:data:要发送的字节数据,如果发送字符串需要先进行encode编码
返回值:实际发送的字节数
buf = recv(bufsize)
功能:接收数据
参数:bufsize:指定一次最多接收的字节数
返回值:接收到的字节数据。接收到的是字节串,需要使用decode进行解码。
注意:如果没有数据可接收,这个方法会阻塞,直到有数据到来或者连接关闭。如果连接关闭,返回一个空字节串
close()
功能:关闭套接字
ipcomfig
查询计算机ip地址
(4)示例代码
服务器代码:
import socket as st# 创建套接字(用于连接的套接字)
sfd = st.socket(st.AF_INET, st.SOCK_STREAM)# 绑定(ip和端口号与socket进行绑定)
sfd.bind(('192.168.50.19', 8888))# 监听(5:最大监听个数)
sfd.listen(5)# 等待客户端的连接(用于通信的套接字,对方的地址信息)
confd, addr = sfd.accept()
print('连接成功')# 接收数据
buf = confd.recv(32)
# 对接收到的字节流进行解码为字符串
print(buf.decode())
客户端代码:
import socket as st# 创建套接字
sfd = st.socket(st.AF_INET, st.SOCK_STREAM)# 连接服务器
sfd.connect(("192.168.50.19", 8888))# 将字符串编码成字节流后发送出去
buf = 'hello'
# sfd.send(b'hello')
sfd.send(buf.encode())
(5)字符的编码和解码
编码 encode()
解码 decode()
在处理文件、网络通信或处理二进制数据时,会涉及到字符串和字节流的转换,这时就用到字符的编码和解码过程。
编码指将字符串转换为字节流的过程,使用字符串的 encode() 方法
解码指将字节流转换为字符串,使用字节流的 decode() 方法
6. UDP 编程
(1)编程步骤
sendto(data, address)
sendto(data, address)
功能:发送数据
参数:data:要发送的数据
address:一个二元组,包含目标地址和端口号
buf, addr = recvfrom(bufsize, flags)
功能:接收数据
参数:bufsize:要接受的最大字节数
flags:一个可选参数,和系统有关,使用默认值即可
返回值:是一个元组,包含接收到的字节数据、对方地址和端口号。