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操作才应该切换    这才能提高效率