<!-- 一个 http 全过程的问题,把所有HTTP相关知识点都带过一遍 -->
<!-- http 全过程 -->
<!--
输入域名(url) -》 DNS映射为IP -》TCP三次握手 -》HTTP响应 -》(浏览器跟踪重定向地址) -》服务器处理请求 -》服务器返回一个html响应 -》(视情况决定释放TCP连接) -》客户端解析HTML -》获取嵌入在HTML中的对象重新发起http请求
-->
<!--
同源策略
同源需满足的条件
协议相同
域名相同:a.b.c.com 和a.b.d.com域名相同吗?
端口相同
非同源受限的行为:
cookie localStorage indexDB无法获取
DOM无法获得
ajax请求不能发送
跨域方法:
双向跨域:
1、降域(二级和以上有共同部分)
所谓将于就是寻找到最后面的域名相同的部分留下
a.b.c.com
d.a.c.com
降域后统统改为b.c.com或者c.com
存在的问题:
安全性,当一个站点被攻击,相同域名的站点也会被攻击
重复性,所有需要跨域的都要修改document.domain=‘’
ajax不受降域影响,还是需要iframe在一个页面引入另一个页面的形式
不可更改性,一旦降域就无法回去
2、location.hash
a向b传送数据
baidu.com/a/html 中的iframe的src="google.com/b.html#paco",b.html监听到 url变化触发相应操作
b向a传送数据
google.com/b.html 中隐藏一个iframe,设置src="baidu.com/proxy.html#data" data为要传输的数据,proxy.html是和a.html同域名下的,是a b之间的代理,负责监听url变化就修改a的url,a监听到url变化了就做出相应操作
b.html
try{
parent.location.hash='data'
}catch(e){
var ifrproxy=document.createElement('iframe');
ifrproxy.style.display='none';
ifrproxy.src='http://www.baidu.com/proxy.html#data';
document.body.appendChild(ifrproxy);
}
proxy.html:
//因为 parent.parent(即baidu.com/a.html)和baidu.com/proxy.html属于同一个域,所以可以改变其location。hash的值
parent.parent.location.hash=self.location.hash.substring(1);
3、HTML5的postMessage 方法
a向b发送数据
baidu.com/a.html
window.onload=function(){
var ifr=document.getElementById('ifr');
var targetOrigin='http://www.google.com'
ifr.contentWindow.postMessage('hello world!',targetOrigin);
};
google.com/b.html
var onmessage=function(event){
var data=event.data;//消息
var origin=event.origin://消息来源地址
var source = event.source;//源window对象
if(origin == 'http://www.baidu.com'){
console.log(data);//hello world!
}
};
if(typeof window.addEventListener != 'undefined'){
window.addEventListener('message',onmessage,false);
}else if(typeof window.attachEvent !='undefined'){
//for ie
window.attachEvent('onmessage',onmessage)
}
同理可以b向a postMessage
单向跨域:
1、jsonp
先看看两种用法
<script>
function foo(data){
console.log(data);
}
</script>
<script src="http://www.google.com/getUsers.js?callback=foo"></script>
回调函数
<script src="http://www.google.com/getUsers.php?flag=do&time=1"></script>
参数
问题:只支持get请求
2、服务器代理
服务器没有同源策略,在数据提供方没有jsonp,window.name协议的支持,使用服务器代理。
在baidu.com下配置一个代理proxy即baidu.com/proxy/将ajax绑定到代理下发送http请求,此时http请求是在服务端进行的,梧桐苑限制
3.CORS
var url="http://api.alice.com/cors";
var xhr=createCORSRequest('GET',url);
xhr.send();
//非简单请求
var url='http://api.alice.com/cors';
var xhr=createCORSRequest('PUT',url)
xhr.setRequestHeader(
'X-Custom-Header','value'
);
xhr.send();
另外: 对于CORS的支持需要服务器和客户端之间的协调
4、window.name
5、webSocket
需要服务器的支持,源在白名单
6、Access-Controll-Allow-Origin
http和https协议有什么区别,重点解释https?
http+加密+认证+完整性保护=https
http:应用层的无状态,超文本传输协议。端口为80;
HTTPS:只是http通信接口部分用SSL和TLS协议替换。http直接和TCP通信,而HTTPS是用SSL所以是先和SSL通信,再由SSL和TCP通信。端口为443
SSL协议提供的安全通道有以下三个特性:
机密性:SSL协议使用密钥加密通信数据。
可靠性:服务器和客户都会被认证,客户的认证是可选的。
完整性:SSL协议会对传送的数据进行完整性检查。
cookie、sessionStorage、localStorage有什么不同?
cookie存在客户端,可以发送给服务器,数据大小限制为4k
seesionStorage,localStorage存储在本地,不可以发送给服务器,数据大小为5M
localStorage只能手动清除数据
sessionStorage关闭会话窗,数据就被清除了
HTML5本地存储分为;
webStorage(localStorage/sessionStorage)
indexDB
DNS解析域名为IP
浏览器缓存中找
系统缓存中找
路由器缓存中找
ISP DNS缓存中找
TCP三次握手
client ----》 server:SYN(发起一个TCP连接,同步报文)
server ----》client:SYN+ACK(应答报文,表示已创建连接)
client ----》server:ACK(应答报文,表示收到已连接)
四次挥手;
由客户端发起的关闭连接
client ----》server:FIN(请求关闭连接)
server ----》client:ACK(收到了连接,但不会立即关闭,等到报文都发送完在恢复一个fin);
server ----》client:FIN;
client ----》server:ACK(收到关闭)
由服务端发起的关闭连接
当http设置了keepalive定时关闭,服务端会在结束数据传送后关闭TCP连接
http请求
请求行
请求头
空行
请求包体(只有POST请求有包体)
get/post区别
请求参数:get参数附在URL后面?隔开,POST参数放在包体中
大小限制:GET限制为2048字符,post无限制
安全问题:GET参数在URL中,不如POST安全
浏览器历史记录:GET可以记录,POST无记录
缓存:GET可被缓存,post无
书签:GET可被收藏为书签,post不可
数据类型:GET只能ASCII码,post无限制
http响应
状态行
响应头
响应包体
http状态码
1xx:表示可续发请求
2xx:表示成功
202成功
204成功 不返回实体主体
206成功 执行了一个范围请求
3xx:表示重定向
301永久重定向,增加SEO排名
302临时重定向 禁止POST变为GET
303另一个URL
304判断是否要更新缓存 请求头部携带if-modified-slice自从上次更新距这次多久
307临时重定向
4xx:表示客户端错误
400客户端语法错误
401请求未经授权
403服务器拒绝服务
404请求资源不存在
5xx:服务器端错误
500不可预期的错误
503此时不能提供服务 稍后恢复正常
释放TCP连接
header中的connecton:close
服务器主动关闭TCP,客户端被动关闭连接
header中的connecton:keeplive
连接保持一段时间,可以连续发送http请求
客户端解析HTML
onload ready区别:
ready表示文档加载完毕,不包括图片
onload表示都加载完毕
-->
<!--
当输入www.google.com时,页面发生了哪些事情:
1、域名解析
域名解析检查顺序为:浏览器自身dns缓存 --》 OS自身的DNS缓存 --》 读取host文件 --》 本地域名服务器 --》 权限域名服务器 --》 根域名服务器。如果有且没有过去,则结束本次域名解析,域名解析成功之后,进行后续操作
2、tcp 3次握手简历连接
3、建立连接后,发起http请求
4、服务器端响应http请求,浏览器得到http请求的内容
5、浏览器解析html代码,并请求html代码中的资源
6、浏览器对页面进行渲染,展现在用户面前
-->
http协议详解
最新推荐文章于 2020-08-19 15:57:39 发布