异常,网络编程
异常 网络编程
异常:
异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止)
异常分两种:逻辑错误,语法错误
没运行时,语法错误会被python解释器检测到,
程序运行时,会报逻辑错误
常用语法:
try except
网络编程:
C/S架构,client 客户端 server服务器
实现服务端软件与客户端软件基于网络通信
B/S架构,browser 浏览器,server
实现网络编程的两大条件:
1.物理介质:光纤,光缆,网线,无线电波
2.互联网协议
互联网协议:osi七层,osi五层,osi四层
osi七层:
应用层,表示层,会话层、
传输层
网络层
数据链路层
物理层
osi五层:
应用层,传输层,网络层,数据链路层,物理层
osi四层:
应用层,传输层,网络层,网络接口层
物理层:发送电信号(本质发送二进制,0,1)
数据链路层:
单纯的发二进制没有任何意义,必须规定电信号多少位一组,每组什么意思
数据链路层功能:定义了电信号的分组方式,根据以太网协议(ethernet)
ethernet规定:
①一组电信号组成一个数据报,称为“帧”
②每一数据帧分成:报头head和数据data两部分
head包含18字节:源地址6个字节,目标地址6个字节,数据类型6个字节
data包含至少46字节最大1500字节
故帧的长度为64字节到1518字节,超过最大限制就会分片发送
源地址和目标地址为mac地址,以太网规定接入internet的电脑必须有网卡,每块网卡出厂时都会被烧录了一个世界上唯一的mac地址
mac地址是用来确认局域网内一台计算机位置
有了mac地址,以太网采取广播的方式进行通信:即拿到消息后给局域网内的每台计算机都发一份,各计算机拆包时发现mac地址是自己的才会查看信息,但是如果所有的通信都采用广播的方式的话,那么1台机器发送的包全世界都会受到,这将不仅仅是效率低的问题,这会是一场灾难,即广播风暴
网络层:
网络层功能:引入一套新的地址来区分不同的局域网,即网络地址
遵循IP协议:ipv4,ipv6
1.范围0.0.0.0 - 255.255.255.255
2.1个ip地址通常写成四段十进制数,例如172.16.10.1
故ipv4位四段十进制数,ipv6为6段十进制数
在局域网呢,我们可以自己设置ip地址,故可能重复,ip并不能判定两台电脑是否在同一个局域网中
子网掩码:表示子网络特征的一个参数
是用来标识一个ip地址的哪些位是代表网络位,哪些位是主机位,子网掩码不能单独存在,必须结合ip地址使用
子网掩码只有一个作用,就是将某个ip地址分成网络地址和主机地址
子网掩码决定的是一个子网的电脑数目,计算公式是2的n次方,其中,我们可以把n看成是最后一个1后面有多少个0。如255.255.255.0转换成二进制,那就是11111111.11111111.11111111.00000000,后面有8个0,那n就是8,255.255.255.0这个子网掩码可以容纳2的8次方台pc,也就是256台,但有两个ip是不能用的,那就是最后一段不能为0和255,减去这两个,就是254台。
我们再来看一个例子:
255.255.248.0这个子网掩码可以最多容纳多少台电脑?
算法:
把将其转换为四段二进制数(每段8位,不足8位前面填0补齐)
11111111.1111111.11111000.00000000
然后,数数后面有几个0,一共是有11个,那就是2的11次方,等于2048,这个子网掩码最多可以容纳2048-2=2046台电脑。
如何确认多台电脑是否处于1个局域网中:
将ip地址和子网掩码转换为二进制,并进行按位与运算(即同为1变为1),将得到的结果转换为十进制
如果大家的十进制相同,则处于同一局域网中
ip地址分类:A类地址,B类地址,C类地址,D类地址,E类地址
A:1个字节的网络地址和3个字节的主机地址组成(即子网掩码255.0.0.0)
地址范围由1.0.0.0到126.0.0.0 A类网络有126个,每个网络能容纳1亿多主机
B:2个字节的网络地址和2个字节的主机地址组成(即子网掩码255.255.0.0)
地址范围由128.0.0.0到191.255.255.255,B类网络16382个,每个网络可容纳6万多个主机
C:3个字节网络地址和1个字节主机地址组成(即子网掩码255.255.255.0)
地址范围由192.0.0.0到233.255.255.255 c类网络209万,每个网络可容纳254个主机
D:多点广播,Multicast
E:备用地址
回环地址127.0.0.1又称本机地址,将自己电脑设为服务器的时候使用
ARP(地址解析)协议:用于获得目标主机的mac地址
功能:广播的方式发送数据包,获取目标主机的mac地址
前提:每台主机的ip都是已知的,即arp可以通过ip地址解析出目标主机的mac地址
在通信之前,目标主机的ip是一定可以或得的,目标主机的mac是一定拿不到的
拿到目标主机的ip地址后,arp会封一个包
源mac:本机mac
目标mac:12位都为F,FFFFFFFFFFFF
源ip:本机ip
目标ip:可以获得
交换机拿到这个包,一看到12位都是FFFFFFFFFFFF就知道是广播包,
通过子网掩码可以判断出本机ip和目标ip是否处于同一个局域网内,如果处于同一局域网呢,就广播,目标主机拆包时发现是自己的ip就将mac地址返回给源主机,交换机有mac地址学习功能,会记录下此mac地址与对应端口的联系,
如果发现不是同一个子网,就会给该子网的网卡发送,目标网卡拿到包后在它的局域网呢广播,目的主机拆包发现是自己的ip就将mac返回给网卡,网卡返回给源主机的网卡,这样就拿到了mac地址,可以进行通信了
通过网络层的ip协议我们可以定位到目标属于哪一个子网,通过arp协议获得目的主机mac地址,我们就可以找到我们需要通信的主机
传输层:
我们要完成的是应用程序到应用程序的通信,故此时找到了计算机,还需要有协议让我们找到应用程序
TCP/UDP协议
功能:建立端口到端口的通信
端口范围:0-65535 其中0-1024为系统占用端口
uploading-image-375797.png
TCP 安全,效率低,好人协议,谁发请求都会,客户端不回应继续发请求,syn洪水攻击
UDP不可靠传输协议,效率高
#服务端
import socket
soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买电话
soc.bind(("127.0.0.1",8080))#绑卡
soc.listen(5)#开机,监听
conn,cliend_addr = soc.accpet()#等待电话连接,阻塞操作,三次握手
#收发消息
msg = conn.recv(1024)
conn.send(msg.upper())
conn.close()#挂电话
soc.close()#关机
#客户端
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",8080))#拨电话,地址,三次握手
client.send("hello".encode("utf-8"))#发信息
client.recv(1024)#接收信息,会阻塞
client.close()#关机