赞
踩
我的所有学习笔记:https://github.com/Dusongg/StudyNotes⭐⭐⭐
netstat -naup
# -p : 显示pid sudo显示全部
# -a : 显示所有(all)
# -u : 显示udp信息
# -n : 将ip和mac地址写成数字
# -l : 仅列出listen状态的服务
cat /etc/services
可以查看(HTTP:40, HTTPS:443)udp:无连接、不可靠传输、面向数据报
udp报头:双方规定了报文的固定长度
sk_buf
管理多个udp报文首部长度:四位(0-15),基本单位4字节,所以首部长度范围为0-4*15
窗口大小:填写自己接收缓冲区剩余空间的大小(在三次握手时,可以协商窗口大小)
序列号:发送缓冲区中此次发送数据的最后一个下标
确认号:序列号 + 1,表示确认号之前的数据都收到了,下次从该确认号开始发
选项:
- 最大报文长度(MSS): 在TCP连接的建立阶段,可以通过选项告知对方本端能够接收的最大报文长度,从而避免因为报文过长而导致的分片和重组,提高传输效率。
- 窗口扩大因子: 用于在连接建立后通知对端本端接收窗口的扩大情况,从而提高数据传输的效率。
- 时间戳: 可以在选项中包含时间戳信息,用于测量往返时间(RTT),对数据包进行排序等。
- SACK(Selective Acknowledgment): 用于告知对方本端已经正确接收到的数据段,从而提高数据传输的可靠性。
- 窗口比例因子: 用于在连接建立时通知对端本端接收窗口的规模,从而提高数据传输的效率。
六个标记位 -> 区分报文的“类型”:
URG:紧急指针,指向数据的偏移量,紧急数据一般只能站数据的一个字节
send
、recv
的第四个参数设置成MSG_OOB
ACK:确认序号
PSH(push):当接收方缓冲区空间不足,上层没有取走数据时,PSH被设置,提示接收端应用程序立刻从TCP缓冲区里把数据取走
RST:当己方认为链接不一致或链接异常时,要求重新建立链接;RST称为复位报文段(建立链接时、或者正在通信服务端异常时)
SYN:请求建立链接;把携带SYN标识的称为同步报文段
FIN:通知对方,自己要断开链接了
- 验证全双工,如果两次,有一方只能验证收/发其中一种能力
- 如果单次握手:服务端一旦收到SYN就建立连接 --> SYN泛洪
- 如果两次握手:当服务端收到SYN时就必须建立链接并发送ack,并且不知道客户端是否收到ack,导致当客户端没有收到ack并重传SYN时,服务端又会建立一次链接
- 如果时三次握手:第三次握手丢失,此时客户端建立链接,而服务端并没有建立链接,之后客户端重新建立链接,使得建立链接失败导致的后果由客户端承担,减少了服务端处理错误链接的负担
一方关闭链接之后,另一方可能还有数据向对方发送,所以这时ACK与FIN不能同时发送
但是在特定情况下四次挥手可以变成三次挥手
The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow. If a connection request arrives when the queue is full, the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at connection succeeds.
现象,服务端没有accept,客户端和服务端也能建立链接,建立连接的数量是n+1,如果超过这个数量,客户端链接显示ESTABLELISH,而服务端显示SYN_RECV,此时全连接队列满了(服务端收到了客户端的ACK,只是将他丢弃了),服务端将链接存放在半连接队列里,如果长时间没有处理这个半连接,服务端会丢弃该链接
n不能太长?
n不能没有?
主动断开连接的一方,在四次挥手完成之后,进入TIME_WAIT状态,等待一段时间后自动释放;
因此当服务器主动断开,四次挥手之后,服务器无法立即重启
setsockopt
int opt = 1;
setsockopt(listensock, SOL_SOCKET, SO_REUSEPORT | SO_REUSEADDR, &opt, sizeof(opt));
为什么要有TIME_WAIT?
TIME_WAIT等多久? —— 2MSL
MSL(maximum segment lifetime) :一个报文在网络存活的时间
查看$ cat /proc/sys/net/ipv4/tcp_fin_timeout
CLOSE_WAIT状态是被动关闭方收到FIN并进行ACK回复后进入的状态,接下来他会等待上层知道对方要关闭连接后做出处理,当自己也要关闭连接的时候给对方发送FIN,则 进入LAST_ACK状态,而一旦自己上层没有做出处理,则套接字状态会一直处于CLOSE_WAIT, 因此Server端出现大量的CLOSE_WAIT,是由于Server端没有及时的关闭连接导致的。
动态的,和网络状况有关
Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时
时间都是500ms的整数倍。如果重发一次之后, 仍然得不到应答, 等待 2500ms 后再进行重传。如果仍然得不到应答, 等待 4500ms 进行重传. 依次类推, 以指数形式递增。累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接
TCP根据接收端的处理能力,来决定发送端的发送速度,这个机制就叫做流量控制(Flow Control)
第一次怎么保证数据量的合理性:三次握手时交换了窗口大小,协商了双方的接收能力
实际上, TCP首部40字节选项中还包含了一个窗口扩大因子M, 实际窗口大小是 窗口字段的值左移 M 位;
如果丢包了,滑动窗口怎么变化?
由于ack序号sqn表示sqn之前的全部报文都已经收到了,所以运行少量之前的ack丢失
但是如果发送过来的数据报丢了呢?比如上述3001-4000的报文丢失了,那么如果收到了4001-5000,服务端不能将确认序号设置成5001,而必须是3001
如果收到三次重复确认应答,则立即对丢失的报文补发 —— 快重传
已经有了快重传了,为什么还要又超时重传?
发送缓冲区逻辑上为环状结构,不用担心窗口越界问题
当接收方收到报文时,等待一段时间,让应用层取数据,此时缓冲区腾出更多剩余空间,发送ACK时携带窗口大小,下次发送报文时就能发送更多的数据(窗口越大,网络吞吐量越大,传输效率越高)
如果通信双方出现大量的数据包丢失,tcp会判断网络拥塞,此时不能立即对报文进行超时重传(会加重网络拥塞)
如果一个网络发送拥塞,通过这个网络通信的主机都需要发生拥塞控制
实际滑动窗口大小:min(窗口大小,拥塞窗口)
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址存放高字节
pidof
pidof httpd
pidof httpd | xargs kill -9
网络号 = IP地址 & 子网掩码
网段:IP地址通过子网掩码的到的网络号
网关:
网关(Gateway)是在计算机网络中用作连接不同网络的设备或程序。它可以是物理设备,如路由器,也可以是运行网络协议的计算机,用于转发数据包到目标网络中的设备。网关的作用是在**不同网络之间传输数据**,并在需要时执行转换或处理数据的功能。
在互联网中,ISP(Internet Service Provider,互联网服务提供商)通常会提供网关来连接用户的局域网与互联网。局域网中的设备通过网关访问互联网上的资源,网关负责将数据包从局域网传输到互联网,并将来自互联网的响应数据包传输回局域网。
区分同一个局域网中的不同主机
划分碰撞域——减少局域网内的碰撞
arp - a
:查看arp缓存
一个中间人向同一子网的另一个主机发送ARP响应(IP:路由器IP, MAC: 中间人MAC),之后这台主机发送给路由器的报文会发送给中间人主机
host文件:cat /etc/hosts
默认端口号:53
NAT
NAPT路由器的转换表通常在TCP握手时生成,在FIN时删除
frp是一种用于将本地服务暴露到公共网络的工具,通常用于内网穿透。其全称为"Fast Reverse Proxy",是一个开源的、高性能的反向代理应用。通过frp,您可以在外部网络访问本地网络中的服务,而无需公网IP或端口映射。
frp工作原理是在公网服务器上部署一个frp服务器和一个frp客户端,然后在需要暴露的本地服务器上部署一个frp客户端。frp客户端会将本地服务的流量通过加密通道发送到frp服务器,frp服务器再将流量转发到公网访问者。这样,即使本地服务器位于内网或没有公网IP,也能实现被公网访问的效果。
frp可以用于很多场景,比如远程监控、内网穿透、局域网共享等,是一个非常实用的网络工具。
正向代理和反向代理是两种不同的代理服务器配置方式,它们在网络中的作用和工作方式有所不同。
- 正向代理:
- 定义:正向代理(Forward Proxy)是代理服务器在客户端和目标服务器之间的中介,代表客户端向目标服务器发送请求。
- 用途:用于隐藏客户端的真实IP地址,访问被墙的网站,加速访问等。
- 工作方式:客户端向正向代理发送请求,代理服务器将请求转发给目标服务器,然后将目标服务器的响应返回给客户端。
- 反向代理:
- 定义:反向代理(Reverse Proxy)是代理服务器位于目标服务器和客户端之间的中介,代表目标服务器向客户端发送响应。
- 用途:用于负载均衡、安全性、缓存、SSL终结等。
- 工作方式:客户端向反向代理发送请求,反向代理根据配置将请求转发给一个或多个目标服务器,然后将目标服务器的响应返回给客户端。
总的来说,正向代理隐藏了客户端,代表客户端向服务器发送请求;而反向代理隐藏了服务器,代表服务器向客户端发送响应。两者的主要区别在于代理服务器的位置和功能。
SOCKS5(Socket Secure 5)是一种**网络协议**,用于在客户端和服务器之间进行数据传输。它是SOCKS协议的第五个版本,相比之前的版本,提供了更多的功能和安全性。
SOCKS5协议通常用于网络代理服务,允许客户端通过代理服务器访问互联网。与HTTP代理不同,SOCKS代理可以传输各种协议的数据,包括HTTP、FTP、SMTP等,更加灵活。此外,SOCKS5还支持身份验证和UDP转发,提供了更高的安全性和功能性。
使用SOCKS5代理可以帮助用户**隐藏真实IP地址,绕过地区限制访问特定网站**,提高网络安全性等。许多网络工具和软件都支持SOCKS5代理,使其成为一个常用的网络工具。
- 定义:VPN是一种通过公共网络(如互联网)建立私密连接的技术,用于在不安全的网络上创建安全的通信管道。
- 用途:用于保护用户的隐私和安全,突破网络封锁,访问受限制的内容等。
- 工作方式:通过加密和隧道技术,在公共网络上创建一个安全的通信通道,使得通过该通道传输的数据在传输过程中不易被窃听或篡改。
在某种程度上,可以将VPN视为一种正向代理。正向代理(Forward Proxy)是代理服务器在客户端和目标服务器之间的中介,代表客户端向目标服务器发送请求。VPN也是一种将客户端的请求通过代理服务器转发到目标服务器的技术,因此在这个意义上,VPN可以被视为一种正向代理。
然而,VPN(Virtual Private Network,虚拟专用网络)通常具有更广泛的功能和用途,不仅仅局限于将客户端的请求转发到目标服务器,还包括加密通信、保护用户隐私、突破网络封锁等功能。因此,虽然VPN可以看作是一种正向代理,但它的功能和应用场景可能更加多样和复杂。
不同类型套接字接口同一参数类型 —— sockaddr* address
//头文件 #include <sys/type.h> #include <sys/socket.h> // 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器) int socket(int domain, int type, int protocol); // 绑定端口号 (TCP/UDP, 服务器) int bind(int socket, const struct sockaddr *address, socklen_t address_len); // 开始监听socket (TCP, 服务器) int listen(int socket, int backlog); // 接收请求 (TCP, 服务器) int accept(int socket, struct sockaddr* address, socklen_t* address_len); // 建立连接 (TCP, 客户端) int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
int socket(int domain, int type, int protocol);
AF_INET
(ipv4)或AF_INET5
(ipv6)SOCK_STREAM
:流式套接字 —— tcpSOCK_DGRAM
:数据包套接字 —— udpint sockfd_ = socket(AF_INET, SOCK_DGRAM, 0);
tcp control block
/udp control block
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
inet_addr
struct sockarr_in local;
bzero(&local, sizeof(local)); //填充字节
//初始化socket结构体的三个字段
local.sin_family = AF_INET; //域
local.sin_port = htons(port_); //本主机字节序转网络字节序 —— 端口号
local.sin_addr.s_addr = inet_addr(ip_.c_str()); //将ip地址风格的字符串转uint32_t,再转成网络字节序整型in_addr_t
in_addr
与 字符串的转换函数in_addr
inet_addr
inet_aton
in_addr
转IP地址字符串inet_ntoa
:函数返回一个动态开辟的字符指针,放在静态区,不需要手动释放,但是重复调用会覆盖之前的结果,该函数不是线程安全的inet_ntop
:用户自己传缓冲区inet_aton(ip_.c_str(), &(local.sin_addr));
//local.sin_addr.s_addr = inet_addr(ip_.c_str());
//local.sin_addr.s_addr = INADDR_ANY;
int ret = bind(sockfd_, (const struct sockaddr *)&local, sizeof(local));
#define INADDR_ANY ((in_addr_t)0x00000000) //#include<in.h>
local.sin_addr.s_addr = 0;
local.sin_addr.s_addr = INADDR_ANY; //两者效果相同
recvfrom
char inbuffer[size];
struct sockaddr_in client; //输出型参数
socklen_t len = sizeof(client);
sszie_t n = recvfrom(sockfd_, inbuffer, sizeof(inbuffer) - 1, 0, (const struct sockaddr*)&client, &len);
sendto
std::string info(inbuffer);
std::string echo_string = "server echo# " + info;
sendto(sockfd_, echo_string.c_str(), echo_string.size(), 0, (const sockaddr*)&client, len);
listen
:服务器设置为监听状态tcb->status = TCP_STATUS_LISTEN
tcb->syn_queue
和tcb->accept_queue
accept
:获取新连接addr
,addrlen
:获取客户端的socketstruct sockadd_in client;
socklen_t len = sizeof(client);
int sockfd = accept(listensockfd_, (struct sockaddr*)&client, &len); //listensockfd_是服务端类的成员,由socket()初始化
sockfd
可能有多个,而listensockfd_
只有一个,称为监听套接字
popen
UDP_Socket
& TCP_Socket
#include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> //htons #include <string.h> #include <stdlib.h> //atoi #include <iostream> int main(int argc, char* argv[]) { // int port = atoi(argv[1]); // a.out 8888 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in local; memset(&local, 0, sizeof(local)); local.sin_family = AF_INET; local.sin_port = htons(8888); local.sin_addr.s_addr = INADDR_ANY; //0.0.0.0 bind(sockfd, (struct sockaddr*)&local, sizeof(local)); char buffer[1024]{0}; while(true) { struct sockaddr_in client; socklen_t len = sizeof(client); ssize_t ret = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&client, &len); buffer[ret] = 0; sendto(sockfd, buffer, ret + 1, 0, (struct sockaddr*)&client, len); } }
#include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> //htons #include <string.h> #include <stdlib.h> //atoi #include <iostream> #include <unistd.h> int main(int argc, char* argv[]) { // int port = atoi(argv[1]); // a.out 8888 int listenfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in local; memset(&local, 0, sizeof(local)); local.sin_family = AF_INET; local.sin_port = htons(8888); local.sin_addr.s_addr = INADDR_ANY; //0.0.0.0 bind(listenfd, (struct sockaddr*)&local, sizeof(local)); listen(listenfd, 5); char buffer[1024]{0}; while(true) { struct sockaddr_in client; socklen_t len = sizeof(client); int clientfd = accept(listenfd, (struct sockaddr*)&client, &len); int ret = read(clientfd, buffer, sizeof(buffer)); buffer[ret] = 0; write(clientfd, buffer, ret); } }
通过在命令末尾加上 &
将一个进程启动成后台进程
jobs
: 查看后台任务
fg
: 将后台任务提到前台
ctrl + z
: 将一个前台进程暂停,之后将这个暂停的进程提到后台,将bash进程自动提到前台
bg
:将一个暂停的后台进程运行在后台
PGID
:进程组id,任务和进程组的关系:一个任务被一个进程组执行
SID
:会话id(session id) : bash进程的进程id
TTY
:控制终端
TTY是指终端设备,通常是用户与计算机交互的界面。每个进程都可以有一个关联的TTY。TTY可以是物理终端(如键盘和显示器),也可以是虚拟终端(如SSH会话或终端仿真器)。TTY的相关信息可以通过
/dev/tty
或/dev/pts/*
来表示。
TPGID
:终端进程组ID,TPGID
的主要作用之一是确定前台进程组。在一个终端会话中,只有一个进程组是前台进程组,它接收来自终端的输入,当用户在终端中启动一个新的命令时,该命令通常会成为前台进程组的一部分,从而接收来自终端的输入
linux中一个会话和bash进程的关系:
在Linux中,一个会话(session)是一个用户与系统进行交互的一段时间。一个会话可以包含一个或多个进程,而这些进程通常与一个终端(terminal)相关联。终端是用户与系统进行文本输入和输出的界面,可以是物理终端、虚拟终端(比如终端仿真器,如xterm、gnome-terminal等)或者通过SSH等方式远程连接的终端。
每个进程都有一个唯一的进程ID(PID),而在一个会话中,有一个进程被认为是"控制终端"的拥有者。通常,这个进程是用户登录时启动的shell进程,比如bash。该shell进程成为会话的领头进程(session leader)。
与这个会话相关的进程,无论是直接子进程还是孙子进程,都共享同一个会话ID(SID)。这使得它们能够共享一些会话级的属性,比如控制终端、作业控制等。
当你启动一个终端并登录系统时,通常会话开始,一个shell进程成为领头进程,而你与该shell的交互都属于这个会话。当你在该终端中运行其他命令时,它们将成为这个会话的子进程。
在一个会话中,可以通过
ps
命令或者pstree
命令查看进程树,这有助于理解会话与进程之间的关系。例如,你可以使用以下命令查看当前会话中的进程树:ps -ejH
- 1
或者使用
pstree
命令:pstree
- 1
总的来说,一个会话是一个用户与系统交互的时间段,而相关的进程树则包括会话领头进程和其衍生的子进程。 Bash进程通常是会话的领头进程,而其他在Bash中运行的命令则是该会话的子进程。
当一个会话(session)终止时,会话中的所有进程都会收到
SIGHUP
信号(挂起信号)。这通常发生在用户从控制终端注销(logout)时。收到SIGHUP信号后,进程会有不同的行为取决于进程对该信号的处理方式:
- 默认情况下,大多数进程会终止(terminate)。
- 某些进程可能会忽略
SIGHUP
信号,继续运行。这通常是后台进程(daemon)所采取的策略,以便继续在后台执行。因此,会话终止可能导致会话中的后台进程终止或继续运行,具体取决于这些进程的信号处理方式。
后台进程和守护进程的主要区别在于其目的和特性:
- 目的:
- 后台进程:后台进程是指不与终端直接关联的进程,它们可以在后台运行而不影响用户终端的操作。这种设计使得用户可以在终端上执行其他任务而不受后台进程的影响。
- 守护进程:守护进程是一种特殊的后台进程,其设计目的是在系统启动时启动,并在系统关闭时关闭。它们通常用于执行系统级任务,如网络服务、日志记录等。
- 控制终端:
- 后台进程:后台进程不与任何控制终端直接关联。
- 守护进程:守护进程也不与任何控制终端直接关联,它们通常在启动时会调用
setsid
函数创建一个新的会话,从而使守护进程脱离终端控制。- 生命周期:
- 后台进程:后台进程的生命周期与其父进程(通常是一个终端会话)相关联。
- 守护进程:守护进程的生命周期通常与系统的启动和关闭相关联,它们在系统启动时启动,在系统关闭时关闭。
创建守护进程 ——将自己变成一个独立的会话
int main() { //忽略其他异常信号 signal(SIGCLD, SIG_IGN); signal(SIGPIPE, SIG_IGN); signal(SIGSTOP, SIG_IGN); if (fork() > 0) exit(0); //父进程退出 setsid(); //创建新的会话 //该守护进程可能服务于其他进程,需要更改进程的工作目录 chdir(cur_cwd); //由该进程创建的会话不因该占用IO,所以需要“关闭”,即将stdin、stdout、stderr重定向到/dev/null int fd = open("/dev/null", O_RDWR); //O_RDWR:以读写方式打开 if (fd > 0) { dup2(fd, 0); dup2(fd, 1); dip2(fd, 2); close(fd); } }
数据传输方式:
安全性:
数据长度限制:
数据类型:
幂等性:
缓存处理:
GET:可以被缓存,可以被收藏为书签,可被历史记录保存。
POST:不能被缓存,不应该被收藏为书签,不会保存在历史记录中。(即,我们为什么无法从浏览器历史记录中查找到POST请求)
POST 请求通常用于提交表单、执行操作等,这些请求可能会改变服务器状态,因此不适合保存在历史记录中,以免用户在未经意的情况下重复执行这些操作。
另外,POST 请求中的数据通常是通过请求体传输的,而不是像 GET 请求那样在 URL 中可见,所以即使保存了请求的 URL,也无法完整地还原出 POST 请求所携带的数据。因此,为了避免用户的隐私泄露和意外操作,浏览器通常不会将 POST 请求保存在历史记录中。
使用场景:
- GET:从服务器获取资源。GET 方法应该只用于获取数据,不应该对服务器上的资源产生其他影响。
- POST:向服务器提交数据,用于创建新资源。POST 方法通常用于提交表单数据或上传文件。
- PUT:向服务器上传更新资源的表示。PUT 方法通常用于更新已经存在的资源,客户端需要提供完整的资源表示。(可以上传数据)
- DELETE:从服务器删除资源。DELETE 方法用于删除服务器上的资源。
- HEAD:与 GET 方法类似,但服务器只返回头部信息,不返回实际数据。HEAD 方法通常用于获取资源的元数据,如大小或修改日期。
- PATCH:对资源进行部分修改。PATCH 方法用于对资源进行局部更新,客户端提供要修改的部分及其新值。
- OPTIONS:获取目标资源支持的通信选项。OPTIONS 方法用于查询服务器支持的方法和其他功能,常用于跨域请求中的预检请求。
- TRACE:追踪请求-响应的传输路径。TRACE 方法用于在目的服务器端发起一个测试,以查看客户端发送的请求在传输过程中是否被修改。
- CONNECT:建立用于代理服务器的隧道连接。CONNECT 方法用于建立与目标资源的双向连接,通常用于加密连接的代理服务器。
HEAD
请求,服务器返回的响应头都会有 body 数据。3xx
类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。
301 和 302 都会在响应头里使用字段 Location
,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。
4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。
5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。
Content-Type: 数据类型(text/html
、application/json
、image/jpg
)
Content-Length:Body部分长度
Host:客户端告知服务器请求的资源是在哪个主机的的哪个端口上
User-Agent:用户的操作系统和浏览器版本信息
referer:当前页面是从哪个页面跳转过来的
Location:重定向的地址
Connection:
Set-Cookie
:服务器向客户端发送,浏览器收到将cookie写入文件,之后客户端向服务器发送http报文会自动携带cookie;cookie文件:内存级:cookie存放在浏览器进程的虚拟内存中;文件级:cookie存放在浏览器的的某个路径下(磁盘中)
domain:可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。
path:Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。
httponly:如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性,但不是绝对防止了攻击
secure:该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。
expires:指定了coolie的生存期,默认情况下cookie是暂时存在的,他们存储的值只在浏览器会话期间存在,当用户退出浏览器后这些值也会丢失,如果想让cookie存在一段时间,就要为expires属性设置为未来的一个过期日期。现在已经被max-age属性所取代,max-age用秒来设置cookie的生存期
通过session得到session id,存放再服务端,有服务端管理,避免了cookie内容被窃取
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对
称加密,也称为单密钥加密,特征:加密和解密所用的密钥是相同的
常见对称加密算法:DES、3DES、AES、TDEA、Blowfish、RC2等
特点:算法公开、计算量小、加密速度快、加密效率高
公钥加密-私钥解密;私钥解密-公钥解密
需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥
(private key,简称私钥)
常见非对称加密算法(了解):RSA,DSA,ECDSA
特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对
称加密解密的速度快。
此时当其他方拿到公钥,也无法会信息解密
服务端在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书申请者信息、公钥信
息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明服务端
公钥的权威性
CA机构签名,客户端验证,防止证书被篡改
等
公钥加密-私钥解密;私钥解密-公钥解密
需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥
(private key,简称私钥)
常见非对称加密算法(了解):RSA,DSA,ECDSA
特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对
称加密解密的速度快。
[外链图片转存中…(img-8i5waVtf-1711710069811)]
此时当其他方拿到公钥,也无法会信息解密
[外链图片转存中…(img-3ybQ0IhQ-1711710069812)]
服务端在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书申请者信息、公钥信
息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明服务端
公钥的权威性
[外链图片转存中…(img-COzrVvED-1711710069812)]
CA机构签名,客户端验证,防止证书被篡改
[外链图片转存中…(img-mi65httk-1711710069812)]
[外链图片转存中…(img-O90fWJ72-1711710069812)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。