1.网络编程
1.1 网络基础
1)Mac地址:网卡地址,每张网卡都有全球唯一的mac地址
2)IP地址:Internet Protocol Address,能够更方便找到你的电脑,四位点分十进制数
(1)公网地址:需要申请购买的可以被直接访问的IP地址
(2)内网地址(保留字段):
(a)192.168.0.0 — 192.168.255.255
(b)172.16.0.0 — 172.31.255.255
(c)10.0.0.0 — 10.255.255.255
(3)特殊IP:127.0.0.1本地回环地址,回环经过网卡,但不过交换机。
(4)查看IP地址:ipconfig/ifconfig
3)交换机(Switch):只认识Mac地址,不认识IP地址。
交换机工作原理:局域网中电脑A通过IP地址访问电脑B,电脑A会把自己的IP、Mac和电脑B的IP发给交换机。交换机不能通过IP找到电脑B,交换机会在局域网内发出广播,其他电脑收到关播后,发现不是找自己的,会忽略该广播;电脑B收到广播后,会把自己的IP和Mac地址传给交换机,交换机再把电脑B的信息传给电脑A,此时电脑A就能访问电脑B了。在这个过程中交换机会在缓存中保存电脑A和电脑B的IP地址和Mac地址,下次电脑A再访问电脑B时就不用广播了,通过缓存中的IP和Mac地址直接访问(单播)。这个过程就是ARP协议。
ARP协议:地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理(Mac)地址的一个协议。
4)路由器(Router):多个局域网通过路由器相互连接, 路由器可以识别IP地址。
5)网关:路由器连接局域网的端口就是网关,路由器上端口的IP就是网关IP。同一个局域网内所有的电脑共享同一个网关
6)子网掩码:也是IP地址,用来判断两台电脑在不在一个局域网内
IP1:192.168.12.1 = 11000000. 10101000.00001100.00000001
IP2:192.168.13.1 = 11000000. 10101000.00001101.00000001
网关:255.255.255.0 = 11111111.11111111.11111111.00000000
IP1和网关进行与运算(数字和1与得原数字,数字和0与得0),得到:
11000000. 10101000.00001100.00000000 = 192.168.12.0
IP2和网关进行与运算得到:192.168.13.0
两者运算结果不同,说明IP1和IP2不在同一个局域网内。
7)IPV6:范围:0:0:0:0:0:0:0:0 — FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF 共128位。为了实现IPv4-IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示
8)端口:是虚拟的,取值范围:0 — 65535,用于区分电脑上不同的应用程序
1.2 CS和BS架构
1)CS架构:client(客户端)server(服务器)
优点:可以离线使用、功能更完善、安全性更高
2)BS架构:browser(浏览器)server(服务器)
优点:不用安装就能使用,统一PC端用户的入口
3)未来发展趋势:B/S架构
1.3 socket(套接字)实现
1)概念
socket (套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
2)socket实现代码
1.4 参考模型
1.4.1 OSI参考模型(7层模型)
开放系统互连参考模型 (Open System Interconnect 简称OSI),为开放式互连信息系统提供了一种功能结构的框架。它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
1.4.2 tcp/ip五层模型
将OSI 7层参考模型最上面的三层合并成应用层,就是TCP/IP五层模型
应用层:python等应用
传输层:port、tcp、udp 设备:四层路由器、四层交换机
网络层:IPv4、IPv6 设备:路由器、三层交换机
数据链路层:Mac、arp协议 设备:网卡、二层交换机
物理层:电信号,传递0101 设备:网线、集线器
1.4.3 tcp和udp
1)tcp(Transmission Control Protocol):需要先建立连接才通信
(1)特点:面向(占用)连接、可靠(数据不会丢失)、实时性高、全双工、效率低(速度慢,收到消息要发回执)
(2)适用场景:语音聊天、视频聊天、远程控制、发邮件
(3)建立连接:三次握手,建立全双工通信
(4)断开连接:四次挥手
四次挥手不能像三次握手一样合并成三次,因为客户端发送结束请求后,服务器回复确认信息,但此时可能服务器还在向客户端传递数据,因此服务器的确认信息和断开请求信息不能合并成一条,所以需要四次挥手。
2)udp(User Datagram Protocol):不需要建立连接就能通信
(1)特点:不占用连接、不可靠(数据因网络不稳定丢失)、实时性差、效率高(速度快)
(2)适用场景:发消息(QQ、微信)、在线播放视频
3)tcp和udp流程图
1.5 tcp协议代码
1)和多个客户端通信
通过循环,可以实现和多个客户端通信。
但要求前一个客户端通信断开后,才能和下一个客户端通信
recv(1024)不是接收1024个字节,而是最多接收1024个字节
2)和客户端多通信一些内容
b”xxx”只能将ascii码转化成二进制。
如果想要传输中文等需要使用code的方法,接收到数据后要使用decode
3)可以和多个客户端通信,每次通信可以相互聊天,双方可以主动结束会话。
1.6 tcp作业:客户端使用tcp协议上传小文件
进阶:上传大文件
发送数据或文件的相关内容组成json,先发json长度,再发json,最后发数据或文件。接收端可以根据json中存储的数据或文件的长度,接收数据。
1.7 udp协议代码
1)udp协议通信代码
2)udp协议多人、多信息、可退出通信。udp可以实现1对多实时通信(多个客户端可以一起和server通信)
1.8 udp作业:基于udp协议的多人聊天。
自动识别用户(不能用ip和port区分用户)。不同用户使用不同的颜色显示。
进阶需求:几个客户端,通过server中转实现相互通信
1.9 粘包
1.9.1 tcp socket通信的底层原理
由于tcp协议需要发送回执,为了提高效率操作系统会将信息保存在缓存中,定时一起发送。没有被及时接收的数据也会存储在缓存中。
1.9.2 粘包代码
1.9.3 粘包出现原因
只有tcp协议会出现粘包,因为tcp协议的传输是流式传输,消息之间没有边界,并且还有一大堆优化算法。
粘包可以在一下两种情况发生:
1)发生在发送端:两条消息很短,并且发送的间隔时间很短
2)发生在接收端:多条消息由于接收不及时,在接收方的缓存中堆在一起导致粘包
1.9.4 解决粘包问题
解决粘包问题的本质:设置边界
1)设置接收长度,避免粘包
设置接收长度等于发送长度,可以确定边界,解决粘包问题。
解决了粘包问题,但通常无法提前知道接收数据长度
2)自定义协议,先传递规定位数的数据长度
该方法解决了传递数据长度问题,但如果数据长度超过9999,就无法处理了。
1.9.5 struct模块
该模块可以把一个类型(如数字)的数据,转成固定长度的bytes。
struct处理整数范围:-2147483648 <= number <= 2147483647(231)≈2G字节
可以使用struct模块替换我们自制的零操作,让struct转换数据长度
1.9.6 终极解决方案
使用struct包传递数据长度,struct包的长度固定为4位
1.10 验证客户端的合法性
1)客户端和服务器分别加密,验证客户端合法性
(1)服务器生成随机字符串
(2)服务器将字符串发给客户端
(3)服务器和客户端分别加密计算
(4)客户端将计算结果发给服务器
(5)服务器比较计算结果,判定是否合法
hexdigest():生成十六进制摘要
digest():生成摘要(默认二进制)
2)使用hmac模块简化代码
使用hmac算法比标准hash算法更安全,可以使用hmac模块代替hashlib模块,还可以简化代码
(1)hmac可以直接对秘钥和数据进行加密,只需一步
(2)使用hmac生成的摘要是二进制字符串,可以直接传输,不用转码
1.11 可以并发的tcp协议server:socketserver
1)socket模块和socketserver模块
(1)socket模块是底层模块
(2)socketserver模块基于socket模块
socketserver模块功能:tcp协议server端处理并发的客户端请求
2)使用socket无法实现并发,只能排队等待
3)使用socketserver解决并发问题
需要把模板背下来:
(1)创建类,继承socketserver.BaseRequestHandler
(2)在创建的类中重写handle方法
(3)handle方法中接收self.request类
(4)使用接收的self.request类作为连接对象,在handle方法中编写代码
(5)创建socketserver.ThreadingTCPServerl类的对象,传入server ip和第一步创建的类
(6)调用第5步创建对象的serve_forever()
1.12 网络编程作业:文件上传和下载
(1)登录+下载文件:
用户必须登录才能下载
用户是否登录应该记录在服务器
用户可以自己选择上传还是下载
(2)用socketserver实现上面的功能并发
升级版代码:https://www.cnblogs.com/Eva-J/articles/7642557.html
1.13 网络编程作业:ftp
https://www.cnblogs.com/Eva-J/articles/7642557.html