参考:https://blog.csdn.net/CodeBlues/article/details/120048111
HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。
HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。
HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交互数据的隐私与完整性。
HTTPS默认工作在TCP协议443端口,它的工作流程一般如下方式:
截至 2018 年 6 月,Alexa 排名前 100 万的网站中有 34.6% 使用 HTTPS 作为默认值,互联网 141387 个最受欢迎网站的 43.1% 具有安全实施的 HTTPS,以及 45% 的页面加载(透过Firefox纪录)使用HTTPS。2017 年3 月,中国注册域名总数的 0.11%使用 HTTPS。
根据 Mozilla 统计,自 2017 年 1 月以来,超过一半的网站流量被加密。
关于TCP的三次握手以及四次挥手可参考链接:https://blog.csdn.net/qq135595696/article/details/123978933
我们都知道HTTPS能够加密信息,以免铭感信息被第三方获取,所以很多银行网站或电子邮箱等安全级别较高的服务都会采用HTTPS协议。
客户端发起HTTPS请求
就是用户在浏览器(客户端)里输入一个HTTPS网址,然后连接到服务器的443端口。
服务端配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(StartSSL就是一个不错的选择,有1年的免费服务)。
传输证书
这个证书其实是公钥,只是包含很多信息,如证书的颁发机构,过期时间等。
客户端解析证书
这部分工作是客户端的TLS完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,则会生成一个随机值,然后用证书对该随机值进行加密,把随机值当作锁头锁起来,这样除非有钥匙,不然是看不到所背后的内容的。
传输加密信息
这部分传输的信息是用证书进行加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密。
服务端解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
客户端解密信息
客户端用之前生成的私钥解密服务端传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。
乘积最大是3*3*3*3*2=162,当分成的数尽可能接近e时,其乘积最大。
路程上虽说小圆的周长是大圆三分之一,但是小圆绕大圆圆周滚动一周这一圈也要算进去,所以3+1=4。
若不考虑调度和切换时间,则完成两个作业需要的时间最少是?
注意:这道题中,P1和P2是不能同时进行 IO 的,正确的流程为:
以上共有10个字母,每一个字母都代表阿拉伯数字中 0-9 中的一个,已知D = 5,请计算出 N字母代表的数字。
TIPS:广义表除了头之外其它全为尾,只能取头(head)或除头以外的所有元素(tail)。
哈夫曼树没有度为1的结点,且权值所在结点都是叶子结点。二叉树中度为2的结点数比叶结点少1,即由权值总数为n,知道叶子结点数为n,又度为2的结点为n-1个,故共有n+n-1=2n-1个。
n个顶点的树一定有n-1条边,所以需要发去掉m - (n - 1) = m - n + 1条边。
可参考:https://blog.csdn.net/rosefun96/article/details/96974507
卡特兰数:C(2n,n)/(n+1) = 70 / 5 = 14
杨氏矩阵查找算法。
bool stepWise(int mat[][N_MAX], int N, int target,
int &row, int &col)
{
if (target < mat[0][0] || target > mat[N-1][N-1])
return false;
row = 0;
col = N-1;
while (row <= N-1 && col >= 0)
{
if (mat[row][col] < target)
row++;
else if (mat[row][col] > target)
col--;
else
return true;
}
return false;
}
参考链接:https://blog.csdn.net/sinat_38972110/article/details/82221517
int Gcd(int a, int b)
{
if (0 == b)
{
return a;
}
else
{
return Gcd(b, a % b);
}
}
int max(int a, int b) { return a > b ? a : b; }
int maxPoints(vector<Point>& points)
{
int ans = 0;
int cnt = 0;
int overLap = 0;
int dx = 0;
int dy = 0;
int g = 0;
for (int i = 0; i < points.size(); i++)
{
cnt = 0;
overLap = 0;
map<pair<int, int>, int> line;
for (int j = i + 1; j < points.size(); j++)
{
dx = points[i].x - points[j].x;
dy = points[i].y - points[j].y;
if (0 == dy && 0 == dx)
{
overLap++;
continue;
}
g = Gcd(dx, dy);
dx /= g;
dy /= g;
cnt = max(cnt, ++line[make_pair(dx, dy)]);
}
ans = max(ans, cnt + overLap + 1);
}
return ans;
}
3D的情况是类似的,唯一不同是多个维度,所以斜率(准确得说是方向向量)用(dx,dy,dz)表示。
struct Point
{
int x;
int y;
int z;
Point() : x(0), y(0), z(0) {}
Point(int a, int b, int c) : x(a), y(b), z(c) {}
};
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
int gcd(int a, int b, int c) { return gcd(gcd(a, b), c); }
int max(int a, int b) { return a > b ? a : b; }
int maxPoints(vector<Point>& points)
{
int ans = 0;
for (int i = 0; i < points.size(); i++)
{
int cnt = 0, overLap = 0;
map<pair<pair<int, int>, int>, int> line;
for (int j = i + 1; j < points.size(); j++)
{
int dx = points[i].x - points[j].x;
int dy = points[i].y - points[j].y;
int dz = points[i].z - points[j].z;
//判断两点是否重合
if (dx == 0 && dy == 0 && dz == 0)
{
++overLap;
continue;
}
//计算最简方向向量并存入map容器中,同时更新cnt
int g = gcd(dx, dy, dz);
dx /= g;
dy /= g;
dz /= g;
cnt = max(cnt, ++line[pair<pair<int, int>, int>(pair<int, int>(dx, dy), dz)]);
}
//统计该基准点下的最大共线点数量
//cnt+重合点+基准点自身
ans = max(ans, cnt + overLap + 1);
}
return ans;
}