1.1
客户端恶意攻击,只进行两次握手 导致服务器处于等待状态
1.2
有大量的客户端同时访问 (高并发) 服务器处理不过来
listen() 函数中可以指定最大的半连接数量 超出这个数量将会被拒绝
处于半连接状态的链接 会在超时后被丢弃
2
. 粘包问题 网络编程重点
粘包问题只出现在TCP协议中,因为TCP是流式协议,数据之间没有明显分隔
之所以出现粘包
1
. 把时间间隔短的 数据量小的数据 一次性发送
2
. 数据已经到达 接收多了或少了 都会粘包
之所以粘包本质原因就是接收方不清楚数据长度
解决方案就是提前告诉接收方数据长度
1
.发送数据长度
长度信息也会粘包 所以 一定要确保每一次发送的数据信息的长度 所占的字节是固定的
例如
8 或 4
struct 模块就可以把一个python的数据类型 转为二进制 并且字节数固定
q 转为8字节 i 转为4字节
2
.发送真实数据
1
.先接受长度
2
.再接收真实数据
3
. 自定义报头
不仅要传输数据过去 可能还要额外传输一些信息 例如文件名称 大小 md5等等........
报头就是传输数据前 先传输的一个信息 通常用json
本质就是 多传输了一个json数据
1
.先发json数据的长度
2
.在发送json(报头)数据
3
.在发送真实数 也会粘包 所以要把长度放入报头中
json也可以传输二进制 但是json本质是字符串 所以必须把二进制转为字符串 接收方吧字符串转二进制
BASE64 编码
1
.先收报头长度
2
.收报头
3.真实数据
##UDP协议
#什么是UDP协议
用户数据包协议
OSI模型中 属于传输层的协议, 仅用于不要求可靠性,不要求分组顺序且数据量较小的简单传输,力求快
#如何使用
通讯流程类似对讲机 只管发送不管对方是否接受到 甚至不关心对方在不在
1.买对讲机
2.固定频道
3.收发数据
1.买个对讲机
2.指定发送的频道
3.收发数据
与TCP的区别 *****
不可靠传输
不需要建立连接
不会粘包
单次数据包不能太大
代码 :
服务器端
服务器不需要监听 listen
不需要接收请求 accept
收数据 recvfrom(缓冲区大小)
发数据 sendto(数据,地址)
客户端:
不需要建立连接
收数据 recvfrom(缓冲区大小)
发数据 sendto(数据,地址)
#示例1
—————————————服务器.py——————————————————————
from socket import *
# 创建基于UDP的scoket 必须手动指定
server = socket(AF_INET,SOCK_DGRAM)
server.bind(("127.0.0.1",1688))
while True:
data,addr = server.recvfrom(1024)
print("收到来自%s的消息 : %s" % (addr,data))
server.sendto(data.upper(),addr)
# server.close()
—————————————客户端.py——————————————————————
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# UDP 不需要建立链接
# 发送数据时 要指定接受方地址
client.sendto("hello".encode("utf-8"),("127.0.0.1",1688))
data,addr = client.recvfrom(1024)
print("收到来自%s的消息 : %s" % (addr,data))
client.close()
#示例2:在接受的时候 缓冲区大小必须大于数据的长度
—————————————服务器.py——————————————————————
from socket import *
# 创建基于UDP的scoket 必须手动指定
server = socket(AF_INET,SOCK_DGRAM)
server.bind(("127.0.0.1",1688))
# 在接受的时候 缓冲区大小必须大于数据的长度
data,addr = server.recvfrom(1)
print(data)
—————————————客户端.py——————————————————————
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# UDP 不需要建立链接
# 发送数据时 要指定接受方地址
client.sendto("hello".encode("utf-8"),("127.0.0.1",1688))
# client.sendto("world".encode("utf-8"),("127.0.0.1",1688))
client.close()
#示例3:UDP发不了大数据
—————————————服务器.py——————————————————————
from socket import *
server = socket(AF_INET,SOCK_DGRAM)
server.bind(("127.0.0.1",1688))
while True:
data,addr = server.recvfrom(1024*1024)
print(data)
—————————————客户端.py——————————————————————
"""UDP单次数据包不能太大"""
from socket import *
client = socket(AF_INET,SOCK_DGRAM)
data = b""
for i in range(1024 * 60):
data += b"1"
client.sendto(data,("127.0.0.1",1688))
#示例4:多个客户端同时处理
—————————————服务器.py——————————————————————
from socket import *
import time
server = socket(AF_INET,SOCK_DGRAM)
server.bind(("192.168.13.93",1688))
# UDP 可以处理多个客户端 但是并不是真正的同时处理 而是按顺序处理 速度非常快 感觉像是同时处理 叫并发
# 并行 真正同时处理 想要真正的同时运行 必须由多个执行单位
# 模拟一下聊天室
# 客户端发消息来 服务器就把客户端地址存起来
# 再有消息来 服务器循环给每一个人都发一份
# 客户端列表
clients = {}
while True:
try:
data,addr = server.recvfrom(1472)
if addr[0] not in clients:
clients[addr[0]] = addr
try:
print("%s说:%s" % (addr[0],data.decode("utf-8")))
except:
print("编码有问题啊 .....")
# 遍历所有客户端 转发消息给他们
for k,v in clients.items():
server.sendto(data,v)
except Exception as e:
# print(e)
# 如果要限制发消息不能太频繁 思路如下:
# 收到数据后 把你的地址 和发送数据的时间记录下来
# 遍历出所有数据 1888888888 188888888.1 10
# 以当前时间为起始 100 取出消息的时间 如果时间范围为98-100
—————————————客户端.py——————————————————————
多个客户端问题:可以在一个客户端.py模块执行多个窗口来测试
pycharm默认只能开一个问题:界面code下面,有个start标记----选择里面的Edit Configurations---------然后在弹出的窗口右上方打勾
---就可以执行多个客户端
from socket import *
client = socket(AF_INET,SOCK_DGRAM)
while True:
# msg = input("msg:").strip()
client.sendto("client2".encode("utf-8"),("127.0.0.1",1688))
data,addr = client.recvfrom(1472)
print(data)
##DNS服务器
DNS Domain Name System 全称 :域名解析服务器
DNS 是干什么的 :
将域名转换为IP地址 要连接服务器 一定的知道IP \
为什么需要DNS
单独ip不方便记忆 所以我们吧ip和一个域名绑定到一起 域名一串有规律的字符串 www.baidu.com
DNS 是CS结构的server端
DNS 使用的是UDP 协议 因为 传输的数据小 但对速度要求高 一个DNS要服务很多计算机
http:// news.cctv.com /2019/05/29/ARTIXRqlqFBp59eECweiXTUU190529.shtml
协议名称 域名 文件路径
DNS 本质就是一个数据库 里面就存储 域名和ip的对应关系
news.cctv.com
.com 顶级域名
cctv 二级域名
news 三级域名
#进程是什么?
正在运行的程序
进程来自于操作系统 没有操作系统就没有进程
操作系统是什么?
也是一套软件 ,
主要功能
1.控制硬件,隐藏丑陋复杂的硬件细节
2.将无序的硬件竞争变得有序
早些年 计算机同一时间只能运行一个程序,这时候是不可能并发的
要并发 当然需要不同的应用程序 ,如何使多个应用程序同时被运行
这就需要多道技术来支持
##多道技术
#多道技术:为了提高计算机的利用率
1.空间复用 把内存分割为不同区域 ,每个区域装入不同的程序
2.时间复用 当一个程序执行IO操作时,切换到另一个程序来执行
光切换还不行 必须在切换前保存当前的状态 以便与恢复执行
当内存中有多个程序时,必须保证数据是安全的
每个进程之间的内存区域是相互隔离的,而且是物理层面的隔离
有了多道技术
计算机就可以在同一时间处理多个任务(看着像 由于计算远比人块 所以感觉同时执行了)
注意:并不是多道就一定提高了效率
如果多个任务都是纯计算 那么切换反而降低了效率
遇到IO操作才应该切换 这才能提高效率