1.GET和POST
1.安全和幂等
从名字来看,get用于获取数据,post用于提交数据,所以get是安全且幂等的,一般不会产生副作用
post可能改变服务器资源状态,不符合安全性和幂等性
2.缓存
2.get会被浏览器主动缓存,下一次请求传输的数据相同就会使用缓存,post不会
3.URL长度
3.get请求参数放在url之后?开始,&分隔不同参数,get的URL长度具有限制,post没有
4.TCP报文
get方法只会发送一个TCP数据包,请求头和请求体一起发送,因为请求体一般是空的
post会发送两个TCP数据包,优先发送请求头,服务器返回100响应码之后,继续发送请求体
5.字符编码的限制
get只能发送ascll字符,post没有限制,可以发送二进制数据
6.可见性
7.为什么要区分
从本质上来说,get和post底层都是基于tcp协议,以上规定的不同都是http的建议规范,可以将get的参数放在请求体中,也可以将post的参数放在URL地址里面,但是具体的逻辑处理还是依赖于http服务器,他可能忽略get的请求体,也可能不读取post的URL参数,所以最好按照规范来。
2.跨域问题
1.什么是跨域
当将web项目部署之后,浏览器启动项目之后,当一个页面的ajax想要请求的资源位于不同的域名、端口或协议的路径上,浏览器都认为这是一种跨域行为,会禁止。
2.跨域情况
跨域限制是浏览器行为
在地址栏输入URL不会有跨域限制,浏览器认为是安全的
在ajax中发起请求,会有跨域限制
3.解决方案
使用跨域资源共享(CORS)
html页面ajax中:设置
xhrFields:{withCredentials:true}
spring服务器中可以有两种方式指定可以接受的跨域请求
(1)使用@CrossOrigin注解,指定哪些源可以访问,哪些方法可以访问(GET,POST等)
4.HTTP 1.0 1.1 2.0 3.0
(1)Http1.0:可以发送任意格式的文件,相比http0.9只支持GET方法,扩展了post方法,head(和get类似,但是只请求页面的首部)方法
缺点:每次连接都要建立TCP,明文传输
(2)Http 1.1:
引入了长连接,
管道机制(同一个TCP连接中可以同时发送多个请求,不用使用请求-响应-请求这种串行化方式),
分块传输(断点传输,服务端可以只传输对象的一部分)。
新增了put,delete等方法。
缓存处理方面:除了1.0的If-Modify-since和expire字段还新增了,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
缺点:会有队头阻塞:服务器只有处理完一个请求的响应,才会进行下一个请求的响应,数据未压缩
(3)Http 2.0:
和1.0 1.1的文本传输方式不同,2.0使用二进制传输
会在http和tcp两层之间增加一个分帧层;
多路复用,通过标识不同的帧属于不同的数据流(一个流就是一个请求),从而克服之前队头阻塞的缺点
支持服务器的推送;
还支持头部压缩,直接发送header压缩后的key值,节约带宽
(4)http 3.0
http2.0通过多路复用解决了http层面的队头阻塞,但是没有解决TCP层面的队投阻塞(即TCP某个丢包会影响所有包的返回)
5.UDP的可靠传输
udp本身是不保证可靠的,要实现udp的可靠传输,就可以自己在应用层定义收到每个udp包都要发送ack,类似于tcp的机制,但是不会有tcp的慢启动拥塞控制的缺点
6.TCP的各个字段
源端口
目的端口
序列号/确认号
数据偏移:代表首部长度
控制位:
ACK:确认标记
PSH:收到就将其和缓存中的数据立即交给应用程序,也叫做急迫位
SYN/FIN:用于建立/断开连接
RST:用于关闭异常的TCP连接,发送RST不用像挥手那样等待缓冲区发送完毕,接受RST也不用恢复ACK
RST攻击,伪造端主要要伪造源端口和序列号