赞
踩
(1)HTTP实际上是一种无状态协议,HTTP的每次请求/响应之间是没有任何关系的,但你在使用浏览器的时候发现并不是这样的 ; 比如当你登录一次爱奇艺后,就算你把爱奇艺网站关了甚至是重启电脑,当你再次打开爱奇艺网站时,CSDN并没有要求你再次输入账号和密码,这实际上是通过cookie技术实现的,点击浏览器当中锁的标志就可以看到对应网站的各种cookie数据。
(2)HTTP是一种无状态协议,不会记录用户的登陆状态。当你在B站刷视频时,每点击一个页面都要一次登陆身份认证,这样来说对于用户太麻烦。有一种独立技术来帮我们支持,这种技术目前现在已经内置到HTTP协议当中了,叫做cookie。
Cookie本质是一个文件
cookie文件可以分为两种,一种是内存级别的cookie文件,另一种是文件级别的cookie文件:
引入SessionID后的好处
当浏览器访问我们的服务器时,如果服务器给浏览器的HTTP响应当中包含Set-Cookie字段,那么当浏览器再次访问服务器时就会携带上这个cookie信息。
因此我们可以在服务器的响应报头当中添加上一个Set-Cookie字段,看看浏览器第二次发起HTTP请求时是否会带上这个Set-Cookie字段。
(1)代码
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <cstring>
- #include <unistd.h>
- #include <sys/wait.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- using namespace std;
-
- int main()
- {
- //创建套接字
- int listen_sock = socket(AF_INET, SOCK_STREAM, 0);
- if (listen_sock < 0){
- cerr << "socket error!" << endl;
- return 1;
- }
- //绑定
- struct sockaddr_in local;
- memset(&local, 0, sizeof(local));
- local.sin_family = AF_INET;
- local.sin_port = htons(8081);
- local.sin_addr.s_addr = htonl(INADDR_ANY);
- if (bind(listen_sock, (struct sockaddr*)&local, sizeof(local)) < 0){
- cerr << "bind error!" << endl;
- return 2;
- }
- //监听
- if (listen(listen_sock, 5) < 0){
- cerr << "listen error!" << endl;
- return 3;
- }
- //启动服务器
- struct sockaddr peer;
- memset(&peer, 0, sizeof(peer));
- socklen_t len = sizeof(peer);
- for (;;){
- int sock = accept(listen_sock, (struct sockaddr*)&peer, &len);
- if (sock < 0){
- cerr << "accept error!" << endl;
- continue;
- }
- if (fork() == 0){ //爸爸进程
- close(listen_sock);
- if (fork() > 0){ //爸爸进程
- exit(0);
- }
- //孙子进程
- char buffer[1024];
- recv(sock, buffer, sizeof(buffer), 0); //读取HTTP请求
- cout << "--------------------------http request begin--------------------------" << endl;
- cout << buffer << endl;
- cout << "---------------------------http request end---------------------------" << endl;
-
- #define PAGE "index.html" //网站首页
- //读取index.html文件
- ifstream in(PAGE);
- if (in.is_open()){
- in.seekg(0, in.end);
- int len = in.tellg();
- in.seekg(0, in.beg);
- char* file = new char[len];
- in.read(file, len);
- in.close();
-
- //构建HTTP响应
- string status_line = "http/1.1 200 OK\n"; //状态行
- string response_header = "Content-Length: " + to_string(len) + "\n"; //响应报头
- response_header += "Set-Cookie: XiaoMi_MIUI\n"; //添加Set-Cookie字段
- string blank = "\n"; //空行
- string response_text = file; //响应正文
- string response = status_line + response_header + blank + response_text; //响应报文
-
- //响应HTTP请求
- send(sock, response.c_str(), response.size(), 0);
-
- delete[] file;
- }
-
- close(sock);
- exit(0);
- }
-
- //爷爷进程
- close(sock);
- waitpid(-1, nullptr, 0); //等待爸爸进程
- }
- return 0;
- }
(2)运行服务器后,用浏览器访问我们的服务器,此时通过Fiddler可以看到我们的服务器发给浏览器的HTTP响应报头当中包含了这个Set-Cookie字段
(3)我们也可以在浏览器当中看到这个cookie,这个cookie的值就是我们设置的XiaoMI_MIUI,此时浏览器当中就写入了这样的一个cookie。
(4)然后我们输入用户名和密码并提交,此时相当于第二次访问我们的服务器,此时通过Fiddler可以看到,由于我们提交表单参数用的是POST方法,因此这里的参数是通过正文的形式提交的,更重要的是第二次的HTTP请求当中会携带上这个cookie信息。
(1)加密的方式可以分为对称加密和非对称加密:
(2)非对称加密,加密算法复杂,效率比较低。对称加密比较快。
(3)数据如何加密
数据加密过程如下:
(1)相关概念
①数字证书颁发过程:
②消息摘要(Message Digest)又称作数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了, 因此消息摘要保证了消息的完整性 . 消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print)
(2)远端服务器的认证问题
如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告
如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
(3)中间信息被篡改问题
1.问题: 一个response只有一个body,只能带回来一份资源,一个网页有成百上千个元素,我们今天要把所有元素获得怎么办呢?假设网页中有99张图片,有1个Html怎么获取?
先获取html, html里面有很多标签证明它用了99张图片,依次把99张图片都拿过来才是一个完整的网页。
2.为什么刚开始用短连接,不用长连接呢?
3.这样做(长连接)的好处是什么? 提高效率
4.链接的打开和关闭是受谁控制的? 应用层
TCP提供了建立和关闭链接的功能,致于要不要建立,和释放是由应用层决定的,HTTP有能力控制链接的打开与关闭
5.基于长连接我们可以只基于一条信道,建立一次释放一次就可以实现传送多种网络资源构成─张完整网页。这样能明显减少建立和释放连接的成本,大大提高效率。
6.怎么证明我们需要长连接? 请求和响应的报头中有一个字段Connection : keep alive
7.链接建立和释放是有成本的,OS层面客户端和服务器要创建对应的数据结构。
`
8.短连接一个请求一个响应,长连接可能有多个请求多个响应,多个请求同时发送在网络里面跑,但是接受的时候还是一个一个的接收。不管发送多少请求,我们读到的第一个永远是请求行,第二步一直按行读取,读到空行证明把第一个请求的请求报头读完了,然后读正文(Content - length有长度,不可能多读/少读);下次再度一定是另一个的请求行。
9.为什么今天发的请求有很多,为什么到达服务器先收的是第一行,有没有可能第一行卡在了网上,先收到的是第二行?应用层收到的永远是有序的,传输层不一定,有许多机制可以保证它的有序性。客户端发送第一行,第二行...服务器确实可能受到的是第二行,第一行...但对方向应用层交付的时候必须是第一行,第二行...因为数据乱序本身是可靠性的一种,必须保证按序到达,这个是有TCP保证的。HTTP压根不关心收到的数据变乱的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。