复习
1.半连接数
2.粘包问题
3.自定义报头
详解:
1.半连接数:指的是没有完成的链接
1.1原因:1.1.1客户端恶意攻击,只进行了两次握手,导致服务器处于等待状态
1.1.2有大量的客户同时访问(高并发)服务器处理不过来
1.2listen()函数中可以指定最大的半连接数量,
1.2.1超出这个数量将会被拒绝
1.2.2处于半连接状态的链接,超时后会被丢弃
2.粘包问题:----------网络编程重点
2.1异常出现位置:
粘包问题只出现在TCP协议中, 因为 TCP是流式协议,数据间没有明显分隔
2.2.之所以出现粘包 ,常见两种情况:
2.2.1.把时间间隔短的,数据量小的数据,一次性发送(TCP的优化机制)
2.2.2.数据已经送达,接受多了或者少了 都会粘包
本质原因:接收方不清楚数据长度
解决方案:提前告知接收方数据长度
2.3具体架构分析:
发送方
1.发送数据长度
长度信息也会粘包,所以一定要确保每一次发送的数据信息的长度, 所占的字节是固定的
例如:8或4 q转为8字节 (c中longlong)i转为4字节(c中的int)
struct模块就可以把一个python的数据类型转换为二进制字符串,并且字节数固定
2.发送真实数据
接收方
1.先接受长度
2. 再接收真实数据
3.自定义报头
不仅要 传输数据过去 可能还需要额外传输一些信息,
例如:文件名称,大小 md5 等等....
概念:报头就是传输前,先传输的一个信息 通常用json
本质 就是多传输json数据
发送:
1.先发json数据的长度
2.在发送json(报头)数据
3.在发送真实数 也会粘包 就是要把长度放到报头中
注:1.json也可以传输二进制, 但是json 的本质是字符串 所以必须把二进制转为字符串,接收方把字符串转换为二进制
2.base64是网络上最常用的用于传输8Bit字节码的编码方式之一,base64就是一种基于64可打印来表示二进制数据的方法
接收:
、 1.先接收报头长度
2.收报头
3.真实数据
今日内容
1.UDP协议
2.与TCP区别
3.DNS服务器
4.进程----进入并发编程的学习
5.操作系统
6.多道技术
详情:
1.UDP协议---用户数据报协议
什么是UDP协议?
用户数据包协议
OSI模型中 属于传输层的协议, 仅用于不要求可靠性,不要求分组顺序且数据量较小的简单传输,力求快,
如何使用?
通讯流程类似对讲机 只管发送不管对方是否接受到 甚至不关心对方在不在
1.买对讲机
2.固定频道
3.收发数据
1.买个对讲机
2.指定发送的频道
3.收发数据
2.与TCP区别
代码:
不可靠传输
不需要建立连接
不会粘包
单次数据包不能太大
服务器:
服务器不需要监听 listen
不需要接收请求 accept
收数据 recvfrom(缓冲区大小)
发数据 sendto(数据,地址)
客户端
不需要建立连接
收数据 recvfrom(缓冲区大小)
发数据 sendto(数据,地址)
3.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 三级域名
<<<<<<<<<<<<<<<<<网络编程结束>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<并发编程开始>>>>>>>>>>>>>>>>>>>>>>>>
4.进程----进入并发编程的学习
正在运行的系统,是一种抽象概念,进程 来自于操作系统,没有操作系统就没有进程
5.操作系统
操作系统是什么?
也是一套软件 ,
主要功能
1.控制硬件,隐藏丑陋复杂的硬件细节
2.将无序的硬件竞争变得有序
6.多道技术
多道技术:为了提高计算机的利用率
1.空间复用 把内存分割为不同区域 ,每个区域装入不同的程序
2.时间复用 当一个程序执行IO操作时,切换到另一个程序来执行
光切换还不行 必须在切换前保存当前的状态 以便与恢复执行
当内存中有多个程序时,必须保证数据是安全的
每个进程之间的内存区域是相互隔离的,而且是物理层面的隔离
有了多道技术
计算机就可以在同一时间处理多个任务(看着像 由于计算远比人块 所以感觉同时执行了)
注意:并不是多道就一定提高了效率
如果多个任务都是纯计算 那么切换反而降低了效率
遇到IO操作才应该切换 这才能提高效率