概念
-
-
不变的:mac地址(在网卡上),能够唯一标识你这台机器
-
变化的:ip地址,能够更好地更方便的找到你这的机器
-
-
局域网
-
一个局域网内:
-
交换机:只理解mac地址,不理解ip地址,通过arp协议获取目标mac地址进行通信
-
交换机三种工作方式:
-
广播
-
单播
-
组播
-
-
arp协议:地址解析协议。广播的方式发送数据包,获取目标主机的mac地址(计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网头,然后通过以太网协议发送)
-
网段:ip地址前三位,用子网掩码判断,见后图
-
-
局域网之间:
-
路由器:可以理解IP地址
-
网关:ip前两位
-
-
-
IP地址
-
ipv4:四位点分十进制(实际是四个八位二进制)
-
公网地址:需要我们自己购买
-
内网地址:保留字段
-
192.168.0.0 — ~.255
-
172.16.0.0 — 172.31.255.255
-
10.0.0.0 — ~.255
-
-
特殊的ip地址:
127.0.0.1:本地回环地址,回到自己计算机,测试用
-
查看自己ip:ipconfig/ifconfig
-
ipv6:六位冒分十六进制(FFFFFF:FFFFFF:FFFFFF:FFFFFF:FFFFFF:FFFFFF)
-
网络开发结构
-
C/S架构:需要安装一下
client:客户端
server:服务端
好处:功能更完善,可以离线使用,安全性更高
-
B/S架构:
browser:浏览器
server:服务端
好处:不用安装就可以使用,统一PC端用户的入口
-
两者的关系:B/S也是C/S的一种
-
端口port:用来连接电脑的应用
socket套接字
两个模块
server模块
1 import socket 2 3 sk = socket.socket() # 创建一个server端的对象 4 sk.bind(('127.0.0.1',9001)) # 给server端绑定一个地址 5 sk.listen() # 开始监听(可以接收)客户端给我的连接了 6 7 conn,addr = sk.accept() # 建立连接 conn是连接 8 conn.send(b'hello') 9 msg = conn.recv(1024) 10 print(msg) 11 conn.close() # 关闭连接 12 13 sk.close()
client模块
1 import socket 2 3 sk = socket.socket() 4 sk.connect(('127.0.0.1',9001)) 5 6 7 msg = sk.recv(1024) 8 print(msg) 9 sk.send(b'byebye') 10 11 sk.close()
osi七层协议(应表会传网数物)
-
osi5层协议(前三层为一层)
应用层 python (内容)
传输层 port udp tcp 四层路由器 四层交换机 (端口)
网络层 ipv4 ipv6 路由器 三层交换机 (ip)
数据链路层 mac arp协议 网卡 二层交换机 (mac)
物理层 转化交流电信号
一层一层封装,一层一层解析,每层都有自己封装解析的内容,封装与解析顺序相反
-
tcp和udp
-
tcp(全双工)(语音聊天/视频聊天) — 线下缓存高清电影/qq远程控制/发邮件
-
先建立连接,然后才能通信
-
占用连接,可靠(消息不会丢失),实时性高,慢
-
建立连接 — 三次握手
请求连接服务SYN,同意ACK
-
断开连接 — 四次挥手
请求结束服务FIN
为什么握手三次,挥手四次?
-
可能有遗留数据没有传送完,所以断开的两步必须分开
三次握手四次挥手实例
-
-
udp(发消息) — 在线播放视频/qq发消息/微信消息
-
不需要建立连接就可以通信
-
不占用连接,不可靠(消息因为网络不稳定丢失),快
-
-
包的导入
导入一个包(文件夹)相当于执行了这个包下的__init__
文件并不相当于把这个包下的所有文件都导入进来了
-
要想直接导入某个包(文件夹)下的文件
-
import as语句
1 # import glance.api.policy as policy 2 # policy.get()
-
from import
1 # from glance.api import policy # 直接从一个包中导入文件 2 # policy.get() 3 # from glance.api.policy import get # 直接从包的文件中导入函数名/变量名 4 # get()
-
-
进阶:绝对导入,相对导入
-
绝对导入:以glance作为起始
-
当你需要写一个功能,这个功能不是直接运行的,而是被别人导入之后使用的,这种情况如果你的这个独立功能形成文件夹,文件夹内的所有文件都需要使用相对导入
-
-
相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)在相对导入时不能执行文件
-
但是如果我们自己开发一个项目,这个项目有一些文件是需要直接运行的,这种情况下不适合用相对导入,适合用绝对导入
-
-
-