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.可见性

get对所有人可见,数据直接在URL中

7.为什么要区分

从本质上来说,get和post底层都是基于tcp协议,以上规定的不同都是http的建议规范,可以将get的参数放在请求体中,也可以将post的参数放在URL地址里面,但是具体的逻辑处理还是依赖于http服务器,他可能忽略get的请求体,也可能不读取post的URL参数,所以最好按照规范来。

2.跨域问题

1.什么是跨域

当将web项目部署之后,浏览器启动项目之后,当一个页面的ajax想要请求的资源位于不同的域名、端口或协议的路径上,浏览器都认为这是一种跨域行为,会禁止。

2.跨域情况

跨域限制是浏览器行为
在地址栏输入URL不会有跨域限制,浏览器认为是安全的
在ajax中发起请求,会有跨域限制

3.解决方案

使用跨域资源共享(CORS)

  1. html页面ajax中:设置
  2. xhrFields:{withCredentials:true}
  3. spring服务器中可以有两种方式指定可以接受的跨域请求
  4. (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攻击,伪造端主要要伪造源端口和序列号