HTTPS是基于对称加密和非对称加密的;
对称加密和非对称加密:
这样的机制会出现中间人攻击的问题,为了解决这个问题,加入了数字证书和数字签名
数字证书是由权威CA机构颁发的:一般有证书持有者、证书持有者的公钥等信息
如何防止证书在颁发过程中不被篡改:我们把证书内容生成一份“签名”
数字签名的制作过程撕:
浏览器验证过程:
然后HTTPS的工作过程:
一种无状态,以请求、应答方式运行的协议,他使用可扩展的语义和自述描述消息格式、与基于网路的超文本信息系统灵活的互动
客户端发送一个HTTP请求,HTTP的请求格式如下:
请求行:描述请求或响应的基本信息
请求头:使用key-value形式更加详细的说明报文
空行:
请求数据:实际传输的数据、不一定是文本、可以是图片、视频等二进制数据
常用头字段:
host:标识当前的链接是和哪一个服务建立的: referer来源的判断
server:哪一种类型的服务器 data 时间
content-type:请求头 了解什么类型的数据 connection:
http1.0
(1)get:特定的资源发出请求,本质就是一个发送一个请求来取得服务器的某一资源
(2)head:发送一个和get请求相一致的响应,不过响应体不会被返回,这一方法不传输整个响应内容,只是为了回去报头
(3)post:提交数据(例如上传文件),该请求可能会修改数据的内容,会增加数据的种类等等,就像insert一样,创建新的内容
http 1.1新增
(4)put:向服务器发送数据,修改数据的内容但是不会增加数据的种类,就想updata一样
(5)delete:删除url标识的资源,delete请求后指定资源会被删除,delete也是幂等的
(6)options:允许客户端查看服务器的性能
(7)trace:回显服务器收到的请求,主要用于测试或诊断
(8)patch:对put方法的补充,用来对已知资源的更新
patch出现的比较晚,和put请求类似,同样用于资源的更新,但是有两点不同:
(9)connect:HTTP1.1中预留的能够将链接改为管道方法的代理服务器
1.主要作用
将人们熟悉的网址翻译成电脑理解的IP地址,这个过程叫做DNS域名解析
而且一个域名往往对应最后多个IP地址
2.HTTP流程
3.DNS流程
解释一下域名 www.tmall.com
顶级域名: .com .net
次级域名:.tmall 这一级域名是可以注册的
主机名(host):三级域名 用户在自己的域里边为服务器分配的名称 用户可以任意分配
Hosts是一个没有扩展名的系统bai文件,可以用记事本等工具打开,其作用就是zhi将一些常用的网址域dao名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。
CNAME和CDN加速
解析流程就是分级查询:
递归查询:
然后本地名称服务器继续按照前面介绍的方法一次次地向三级、四级名称服务器查询,直到最终的对应域名所在区域的权威名称服务器返回到最终的记录给本地名称服务器。然后再由本地名称服务器返回给DNS客户,同时本地名称服务器会缓存本次查询得到的记录项。
post向指定资源提交数据,post可能会导致新的资源建立和已有资源的修改
patch是对put方法的补充,put会像指定资源上传最新内容,相当于更新
patch出现的比较晚 和put请求类似,同样用于资源的更新,
但是 1 patch用于资源的部分更新,put用于资源的整体更新
2 当资源不存在的时候,patch会创建一个新的资源,而put只会对已在资源进行更新
http1.1的新特性:
http2.0的特性:
http1.0的长链接和http2.0的多路复用有什么区别:
HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行
什么是服务端推送?
服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。
为什么需要头部压缩?
假定一个页面有100个资源需要加载(这个数量对于今天的Web而言还是挺保守的), 而每一次请求都有1kb的消息头(这同样也并不少见,因为Cookie和引用等东西的存在), 则至少需要多消耗100kb来获取这些消息头。HTTP2.0可以维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。具体参考:HTTP/2 头部压缩技术介绍
HTTP2.0多路复用有多好?
HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为 TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。
HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升
虚拟IP的实现原理:
虚拟IP就是一个未分配给真实主机的IP,也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个虚拟IP。
使用这两个IP中的任意一个都可以连接到这台主机,所有项目中数据库链接一项配置的都是这个虚IP,当服务器发生故障无法对外提供服务时,动态将这个虚IP切换到备用主机。
其实现原理主要是靠TCP/IP的ARP协议。因为ip地址只是一个逻辑地址,在以太网中MAC地址才是真正用来进行数据传输的物理地址,每台主机中都有一个ARP高速缓存,存储同一个网络内的IP地址与MAC地址的对应关系。
以太网中的主机发送数据时会先从这个缓存中查询目标IP对应的MAC地址,会向这个MAC地址发送数据。操作系统会自动维护这个缓存。这就是整个实现的关键。
传统c++使用new和detele去释放,而c++11引入了智能指针的概念,使用了引用计数的方法,让程序员不再去手动释放内存
解决思路:利用c++中一个对象出了作用域会自动析构,因此我们在构造函数申请空间,在析构函数(离开作用域)释放空间,这样,减轻了程序员在编码过程中,考虑资源释放的问题 ,这就是RAII。
RAII依托栈和析构函数,来对所有的资源-堆在内,进行管理,对RAII的使用,使得c++不需要类似于java那样的垃圾收集方法,有效的对内存进行管理
具体而言,c++提供了三种智能指针,正确合理的使用可以帮助大家管理资源
//利用编译器会自动帮我们调用构造和析构函数
//
class A {
public:
A() {
cout << "构造函数"<
int main() {
//方法1
string ip = "www.baudu.com";
istringstream s(ip);
string word;
string ans = "";
while (getline(s, word, '.')) {
ans = '.' + word + ans;
}
cout << ans.substr(1) << endl;
//方法2
string temp = "";
string res = "";
for (int i = 0; i < ip.size();i++) {
while (ip[i] != '.'&& i!=ip.size()) {
temp += ip[i++];
}
res = '.' + temp + res;
temp = "";
}
cout << res.substr(1) << endl;
system("pause");
return 1;
}
时针在钟面上没分钟转0.5° 分针没分钟转6°
表盘一格是 90/15 = 6°
分针转60分钟 时针转6*5 = 30度 分针转15分钟 时针转7.5度
九点15分的度数等于 180 减去因为时针因为分针转了15的而动的度数: 180-7.5 = 172.5°
ip地址:(<网络号><主机号>)
概念:
TCP包是没有ip地址的,那是ip层的事,但是有源端口和目的端口
tcp需要四个元组来表示同一个链接(src_ip, src_port, dst_ip, dst_port)
注意上图中的四个非常重要的东西:
TCP可靠传输的机制
保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的
校验:
计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。
发送方:在发送数据之前计算检验和,并进行校验和的填充。
接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对。
注意:如果接收方比对校验和与发送方不一致,那么数据一定传输有误。但是如果接收方比对校验和与发送方一致,数据不一定传输成功。
伪首部概念
序号:
TCP会把每一个字节编一个序列号,发送的时候是以报文段为单位,把一些字节流放在一起组成一个报文段,然后发送出去,报文段大小也是不定的,报文段的大小取决于链路层的最大传输单元MTU决定
确认:
发送方在收到确认号字段为4的确认报文之后才会把123字节删除,然后发送456 78
但是456丢失了 只收到了78
虽然收到了78字段,78字段还是会正常接收,返回确认号还是4开头的确认报文段,重新发送456,如果收到456,下一个确认报文段填的是9
重传:
超时重传:
原理是发送某一个数据之后就开启一个定期器,在一定时间内没有得到发送的数据报的ACK报文,那么就重新发送数据,知道发送成功为止;
影响超时重传机制协议效率的一个关键参数是重传超时时间(RTO,Retransmission TimeOut)。RTO的值被设置过大过小都会对协议造成不利影响。
(1)RTO设长了,重发就慢,没有效率,性能差。
(2)RTO设短了,重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
连接往返时间(RTT,Round Trip Time),指发送端从发送TCP包开始到接收它的立即响应所消耗的时间。
快重传:
TCP采用自使用算法,动态改变重传时间RTTs(加劝平均时间)
GBN SR协议
三次握手和四次挥手
为什么要两次握手?
1.为了保证正常通信,两次握手之后,客户端知道自己的接收和发送功能是正常的,服务端不知道自己的发送能力是否正常,第三次握手之后,服务端收到了回应,三次握手之后就可以正常通信了
2.第三次握手防止已经失效的连接请求传送到B,因此产生错误,A发出连接请求,但是因为请求报文丢失而收到确认,于是A再重传一次请求连接,后来收到了确认建立了连接,但是报文并没有丢失,而是延迟到达了,本来是失效的报文段,但是B以为是A新的连接,只要B发出确认连接就建立了,由于A没有发出建立连接的请求,一次不会理财b的确认,不会向B发出确认,并一直等待A发来的数据。
为什么四次挥手?
1.可靠的终止连接 ,如果最后一次ACK丢失了,服务端就会重传这个FIN请求,客户端收到之后,重新开始2MSL定时器,服务端收到之后,两方正常的关闭,如果没有2MSL的话,就会服务端无法正常关闭
2.让网络中延迟的重复报文消失,避免干扰新链接
为什么是2MSL?
分析:
1. ACK从A到B最多经过1MSL,超过这个时间B会重发FIN
2. B重发的FIN最多经过1MSL到达A
结论:如果B重发了FIN,且网络没有故障(重发的FIN被丢弃或错误转发),那么A一定能在2MSL之内收到该FIN,因此A只需要等待2MSL。
流量控制
概念:接收方根据自己的接收缓存的大小,动态的调整发送窗口大小
1)最基本的传输可靠性来源于“确认重传”机制。
2)TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。
3)发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。
4)接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传
为了防止死锁(最后一次服务器发给客户端的报文,窗口设置为400但是丢失了),TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续定时器。
如果定时器到期了,就发送一个零窗口探测报文段,接受放收到探测报文段,就给出自己的当前窗口值。
拥塞控制
出现拥塞的条件:需求的总和>可用资源
拥塞控制的四种算法:
慢开始、拥塞避免、快重传、快恢复
假定:数据单方向传送,发生窗口取决于拥塞程度
swnd 接收窗口:接收方根据接收缓存设置的值,并告知发送方,并反映接收方容量
cwnd 拥塞窗口:发送方根据自己的估算的网络拥塞程度而设置的窗口值,反映网络当前容量
慢开始:cwnd的值从1开始指数规律增长,1-2-4-8,到达慢开始门限的时候,该用拥塞避免
拥塞避免:拥塞窗口的值线性加1 当发生超时重传的时候判断网络发生了拥塞
此时将满开始门限设置为当前拥塞窗口的一半,另一方面讲拥塞窗口的值设置为1
所谓快重传:就是如果收到三个重复确认,立马进行重传,而不是等超时重传计时器超时再重传
快恢复:发送方收到三个重复确认,执行快恢复
拥塞窗口和慢开始门限都设置为但钱窗口的一半,再执行拥塞避免算法
map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。
unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的
红黑树的旋转:
两个进程对共享空间的访问必须是互斥的,操作系统只提供共享空间与同步互斥工具
基于数据结构的共享:比如在共享空间中可以放一个长度为10的数组,这种共享方式速度慢、限制多,是一种低级通信方式
基于存储区的共享:在内存中画出一块共享存储区、数组的形式、存放位置都有进程控制而不是操作系统,相比之下,更快是一种高级通信方式
https://www.cnblogs.com/wuyepeng/p/9748889.html
两个或者多个进程共享一定的存储区,就如同malloc向不同进程返回了指向同一个物理’内存区域的指针。当一个进程改变这块区域中的内容的时候,其他进程都会察觉到这个更改,因为数据不需要拷贝,所以比较快。
2.管道通信
管道是指连接读写进程的一个共享文件,叫pipe文件,其实就是在内存中开辟一个大小固定的缓冲区,
管道是一种最基本的IPC机制,有pipe函数创建,
#include
int pipe(int filedes[2]);
管道作用于有血缘关系的进程之间,通过fork来传递,它有一个读端一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。所以管道在用户程序看起来就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]),向这个文件读写数据其实是在读写内核缓冲区。pipe函数调用成功返回0,调用失败返回-1。
1.父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。
2.父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。
3.父进程关闭管道读端,子进程关闭管道写端。父进程可以往管道里写,子进程可以从管道里读,管道是用环形队列实现的,数据从写端流入从读端流出,这样就实现了进程间通信
3.消息队列
进程间的数据交换只能以格式化的消息为单位,进程通过操作系统提供的“发送消息、接收消息”
消息头包括进程ID、消息类型、消息长度等格式化的消息(计算机网络的报文其实就是一种格式化的消息)两种原语进行交换
直接通信:直接将消息挂到缓冲队列上
间接通信:消息先发送到中间实体上,接收进程从信箱中取
对 32 位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4G(2的32次方)。针对 Linux 操作系统而言,最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF)由内核使用,称为内核空间。而较低的 3G 字节(从虚拟地址 0x00000000 0xBFFFFFFF)由各个进程使用,称为用户空间。
为什么需要区分内核空间与用户空间?
在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。
所以,CPU 将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令。比如 Intel 的 CPU 将特权等级分为 4 个级别:Ring0~Ring3
其实 Linux 系统只使用了 Ring0 和 Ring3 两个运行级别(Windows 系统也是一样的)。当进程运行在 Ring3 级别时被称为运行在用户态,而运行在 Ring0 级别时被称为运行在内核态
https://www.cnblogs.com/helloworldcode/p/11105924.html
用于创建一个进程、所创建复制进程的代码段、数据段、bss段、堆、栈等所有用户信息,在内核中操作系统重新为其申请了一个PCB,并使用父进程的PCB进行初始化;
父进程创建完子进程后,子进程运行到终止时刻(例如,调用exit()
函数,或者运行到main
中的return
语句时,都会将返回的值传递给 操作系统)此时如果父进程还在运行,子进程并不会立即被销毁,直到这些值传到了产生该子进程的父进程,也就是说,如果父进程没有主动要求获得子进程的结束状态值,操作系统就会一直保存该进程的相关信息,并让子进程长时间处于僵尸状态
https://www.cnblogs.com/caidi/p/6698168.html
都是I/O多路复用的机制,IO多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就位,能够通知程序进程相应的读写操作,本质上都是同步IO,这个读写过程是阻塞的;
关于epoll的区别:
是基于事件驱动的I/O方式,相对于select和poll来说,epoll没有描述符个数限制,使用一个文件描述符管理多个描述符,将用户关心的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次
水平触发:默认工作模式,即当epoll_wait检测到某描述符事件就绪并通知应用程序时,应用程序可以不立即处理该事件;下次调用epoll_wait时,会再次通知此事件
边缘触发:当epoll_wait检测到某描述符事件就绪并通知应用程序时,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次通知此事件。(直到你做了某些操作导致该描述符变成未就绪状态了,也就是说边缘触发只在状态由未就绪变为就绪时通知一次)
1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
DNS劫持:
一般而言,用户上网的DNS服务器都是运营商分配的,所以,在这个节点上,运营商可以为所欲为。
例如,访问http://jiankang.qq.com/index.html,正常DNS应该返回腾讯的ip,而DNS劫持后,会返回一个运营商的中间服务器ip。访问该服务器会一致性的返回302,让用户浏览器跳转到预处理好的带广告的网页,在该网页中再通过iframe打开用户原来访问的地址。
HTTP劫持:
在运营商的路由器节点上,设置协议检测,一旦发现是HTTP请求,而且是html类型请求,则拦截处理。后续做法往往分为2种,1种是类似DNS劫持返回302让用户浏览器跳转到另外的地址,还有1种是在服务器返回的HTML数据中插入js或dom节点(广告)。
get是用来获取数据的,post是提交数据的
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
常见的HTTP相应状态码
char *xstrncpy(void *dest, void *src, int n) {
int i;
char *p1 = (char *)dest;
char *p2 = (char *)src;
while (n--) {
*p1++ = *p2++;
}
/*
for (int i = 0; i < n; i++) {
dest[i] = src[i];
}
*/
return (char *)dest;
}
int main() {
char dest[] = "asdasdasda";
char src[] = "123456";
xstrncpy(&dest[4], src, 5);
int str;
int s;
cin >> str;
cin >> s;
cout << str << s << endl;
cout << dest << endl;
system("pause");
return 1;
}
HTTP1.0和HTTP1.1:
HTTP1.1和HTTP2.0:
Android的开发技术很多,在开bai始学du习的时候不可能一次性全部学会zhi,也没有必要dao一开始都全部学会,但是有些技术是非常常用的,需要在开始时打好基础,这些技术时:
1、Activity生命周期
虽然Android中有四大组件,但是不可否认Activity是最常用的。所以熟练掌握Android的生命周期是必须的。其实生命周期就是记住 Activity的那些方法在什么时候被系统调用,这样才可以把对应的逻辑代码写到合适的方法内部去。
至于服务和广播组件可以稍微缓一下,到实际使用的时候再学习都可以。
2、界面开发技术
界面开发是一种基本的技术,几乎所有的程序里面都需要用到。在Android开发中界面开发分为3种:
1)使用xml文件布局
使用xml首先对于界面进行布局,然后在Activity里面进行引用是最常见的应用软件开发技术,这种方式使用的最大,需要学习的内容也最多。学习时需要熟悉:
a)五种Layout布局
深刻理解五种布局组织控件的方式是一个基本的基础,这样你才可以在实际的界面中灵活的使用每种布局结构,构造出需要的界面。
b)常用控件
控件有很多,至少要知道每种控件是做什么的,至于里面的特定参数和方法可以学要的时候再去查
c)界面美华
系统的控件很多时候无法满足要求,需要通过添加背景更换图片等进行美化,要熟悉每种控件如何去美华。
掌握了上面的内容,通过布局的嵌套就可以制作出各种界面,如果在熟悉include的使用就可以减少xml的重复,方便后期的修改和维护了。
2)使用代码动态创建
有些时候需要动态的创建一些布局和控件,这个就需要使用LayoutInflater去创建一些动态的界面了。
3)自己绘制界面
游戏中常用,继承SurfaceView自己绘制。
3、数据存储技术
Android中的数据存储方式有3种:
1)SharedPrefereneces存储
对于简单的数据可以使用该方式存储,以键值对的方式存储一些基本的数据。
2)文件存储
将数据以文件的形式存储,可以是手机自身的存储也可以是SD卡,文件的数据格式自己定义。
3)SQLite数据库存储
使用标准SQL语句进行操作,复杂数据的首选。
4、网络编程
现在的Android程序不需要联网的已经不多了。所以网络编程也是必须的,一般的公司都会封装有自己的联网结构,但是基本的联网还是要熟悉。
1)HTTP联网
使用Http联网+Json数据格式是现在很多客户端的首选。
2)Socket联网
至于蓝牙等连接方式则可以在项目需要的时候学习。
对于手机的系统功能,如拨打电话、发送短信、读取系统参数等则可以根据需要在学习,不麻烦的。
其次,手机软件相关
Android开发不同于普通的电脑软件开发,需要了解手机的操作习惯,知道手机的屏幕不大、内存有限,电池有限等,在实际开发和设计时尽量考虑。
示例:
方法是get请求,URL是/search/users?q=zhangsan,协议为HTTP1.1
请求行下面部分全都是请求头部,我们可以看到 host为 api.github.com,连接方式为长连接等信息。值得注意的是我们这个例子中是不存在请求数据的
POST中URL为空,协议版本也是HTTP1.1
和get不一样的地方在于它的请求参数是位于请求数据中的,可以看到 name=Professional%20Ajax&publisher=Wiley 就是它的请求数据。并且我们要注意到在请求数据和请求头之间是空出一行的,这是必不可少的。
还在问get和http
get方法的特点:
1.在上述的例子中:api.github.com/search/users?q=JakeWharton就是一个非常典型的 **GET **请求的表现形式,即请求的数据会附在 URL 之后(放在请求行中),以 ? 分割 URL 和传输数据,多个参数用 & 连接
2.除此之外,根据 HTTP 规范,GET 用于信息获取,而且应该是安全和幂等的 。
3.get是被浏览器自动缓存的,如果下一次传输的数据相同,那么就会返回缓存中的内容,以求更快的传输数据
4.get中的URL一般有长度限制,但是需要注意的是HTTP没有规定GET的长度,这个长度限制主要是浏览器和web服务器决定的,并且各个浏览器对长度的限制也各不相同。
5.GET一次产生一个TCP数据包,浏览器会把请求头和请求数据一起出去,服务器响应200 ok
POST的特点:
1.post表示可能会改变服务器资源上的请求,例如我们在刷知乎的时候对某篇文章进行点赞就是提交的post请求,因为他改变了服务器中的数据,所以他是不安全的幂等的
2.post将请求信息放在请求数据中的,所以它的请求数据没有长度限制
3.POST会产生两个TCP数据包,浏览器会先将请求头,发送给服务器,待响应100 continue,浏览器再发送请求数据,之后再响应200 ok(返回数据),这么看GET传输是比post快一些,但是实际传输速度基本相同