同源策略HTTP TCP/IP 报文解析
同源策略
浏览器有一个很重要的概念–同源策略(Same-Origin Policey)>。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(JavaScript、ActionScript) 在没有明确的授权情况下,不能读写对方的资源。
简单来说,浏览器不允许包含腾讯页面的脚本访问阿里巴巴页面的数据资源,会受到同源策略的限制。
协议
端口默认状态下,可以不写
https://www.baidu.com:443/ 443
协议 域名 端口
http://www.w3school.com.cn:80/ 80
协议 域名 端口
http://localhost:80/demo/index.html
协议 域名 端口
默认是端口是80 但是如果改成8080.在输入网址的时候必须带上端口8080
https是在http下加入了一个ssl层,是http的一个安全版本,有加密的信息。
三个但凡有一个不一样,都不允许拿资源
url(资源定位器)的构成
协议://域名(端口号、参数、查询等)
域名
https://zhidao.baidu.com/ 百度知道
域名是倒着来解析的
(中国默认的顶级域名是.cn) .com 顶级域名 (如果是按国际来分.com也可以作为一级域名)
baidu.com 二级域名 (一)
zhidao.baidu.com 三级域名 (二)
顶级域名分为两类: 按照国家来分的顶级域名 .cn(中国) .us(美国) .jp(日本)
,按照国际来分的顶级域名 .com(商业机构)
.net(从事互联网服务的机构)
.org(非赢利性组织)
.com.cn(国内商业机构)
.net.cn(国内互联网机构)
.org.cn(国内非赢利性组织)
www 二级域名前缀 表示万维网维护的。
最开始,Internet提供的主要服务有万维网(www)、文件传输(FTP)电子邮件(E-mail)、远程登陆(Telnet)等。也就是说,那个时候www(World Wide Web)是标是这是一个需要你用浏览器来访问的网页服务,而不是需要你用telnet访问的bbs,或者ftp工具访问的文件传输服务。所以那个时候,网站主业的域名前面要用www。
baidu有哥服务区为他服务,不同的子域名对应处理不同服务的服务器。现在,把任务分配到对台服务器,不需要子域来区分了。http://google.com一个地址背后有多台服务器支持运作。还用www是为了尊重用户的习惯。其实国外已经不用写www了。除了尊重用户的习惯还有其他的原因(技术层面)
如果不加www,可以叫做裸域名。裸域名是只能绑定DNS的a记录,不能绑定c记录。
a记录就是服务器的一个IP。域名绑定a记录,就是告诉DNS当你输入域名的时候,给你引导项设置的DNS a记录所对应的服务器。简单来说,就是域名对应的IP地址。
比如就是www.baidu.com 的ip地址
c记录是别名 www.baidi.com可以起别名(小名),baidu.com 当用户直接输入baidu.com的时候,也可以跳转到百度页面。没有www,是不能有别的名字的,也就是说不能有别的名字和他指向同一个IP。
有www的,裸域的cookie作用域范围大。
DNS解析域名为IP地址过程:
在客户端当中输入https://www.baidu.com ,当前客户端会有一个DNS客户端,DNS客户端会获取到当前域名,然后向DNS服务器端发送一个检查报文。DNS服务器会根据域名解析出来一个唯一的IP地址(倒着解析,从.com开始)。DNS服务器会把解析好的IP地址,发送给DNS客户端(本机)。一旦浏览器收到DNS服务器解析的IP地址之后,就可以向该IP地址定位,发送http请求。(也就是向服务器发送请求)
端口
如果把IP地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有多个。
就像是到银行一样,地址指向的是银行。进入银行之后,会有好多个窗口,每个窗口干的是不同的业务,也就是说每个端口对应的是不同的服务。
浏览器网页服务的默认的端口号都是80,因此只需输入网址即可,不用输入“:80”
ajax受到同源策略的限制
当在浏览器里面输入一个url,发生了什么
简单归纳:
1.浏览器通过DNS域名解析到服务IP(ping www.baidu.com)
2.客户端(浏览器)通过TCP协议建立到服务器的TCP连接(三次握手)
(HTTP请求只有通过TCP的三个握手之后,才能与服务器建立连接。 HTTP请求是基于TCP协议的)
3.客户端(浏览器)向web服务器端(HTTP)服务器发送HTTP协议包(报文),请求服务器里面的资源文档(telnet模拟)
4.服务器向客户端发送HTTP协议应答包
5.客户端和服务器断开(四次挥手),客户端开始解释处理HTML文档
(三次握手,四次挥手都是TCP协议下的)
三次握手:
1,先客户端发送连接,请求报文。
2,服务器接受连接后回复ACK报文,并为这次连接分配资源。
3,客户端接受到ACK报文后,也向Server端发送ACK报文,并分配资源,这样TCP连接就建立了。
四次挥手:
1.客户端发起中断连接请求,也就是发送FIN报文,服务器端接受到FIN报文之后。意思是说“我客户端没有数据要发给你了”,如果你还有数据没有发送完成,则不必着急关闭(Socket),可以继续发送数据。
2.服务器发送ACK,“告诉客户端,你的请求我收到了,但是我还没准备好,请继续等我的消息”。
wait:这个时候客户端就进入到FIN-WAIT状态,继续等待服务器端的FIN报文。
3.当服务器端确定数据已经发送完成,则向客户端发送FIN报文,“告诉客户端,好了,我这边数据发完了,准备好关闭连接了”。
4.客户端收到FIN报文后,“就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ACK后进入TIME-WAIT状态,如果服务器端没有收到ACk可以重传”。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端以正常关闭,那好,我客户端也可以关闭连接了。ok。TCP连接就这样关闭了。
(FIN关闭连接,ACK响应)
TCP/UDP(传输协议)
面向连接的TCP
TCP(Transmission Control Protocol,传输控制协议),是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立一个有效的连接。一个TCP必须要经过三次“对话”才能建立起来。
面向非连接的UDP协议
UDP(User Data Protocol,用户数据协议)是与TCP向对应的协议。它是面向非连接的协议,它不于对方建立连接,而是直接把数据包发过去。
“面向非连接”就是在正式通信前不必与对方建立连接,不管对方状态就直接发送,与手机短信非常相似。(一般在实时视频,实时语音会用到,讲究实时性)
http(请求报文,响应报文) 通过报文进行沟通
请求报文: 请求头 请求行 请求主体
请求行: 请求方法(GET POST DELETE HERD TRACE OPTION)
请求资源(url)
请求协议版本(HTTP/1.1)(1.0或者1.1,1.0一次只能发送一个请求,然后断开。
现在基本都是1.1,因为1.1可以维持长连接,在一定的
时间内,协议不会断开)
请求头: (主要用来设置信息)
Accept
Referer(从哪个页面访问过来的)
Accept-Language(一种语言,计算机的语言 BOM讲)
User-Agent(用户代理,包含客户端浏览器的一些信息 BOM讲)
Content-Type(发送该请求的编码类型)
Host (当前主机名,端口)域名
Content-Length(当前请求内容长度)
Connection:Keep-Alive(1.1的一个标志,长连接)
Cache-Control(缓存)
Cookie(设置缓存来用的,之后会讲)
请求主体: 表单提交数据如:name=ainee&age=18;
响应报文: 响应头 响应行 响应主体
响应行: 响应协议版本号(HTTP/1.1) 响应状态码(200) 响应状态文字(ok)
http://tool.oschina.net/commons?type=5 (响应状态码)
响应头
Server (服务器信息)
Content-Type(返回数据的编码格式)
Transfer-Encoding
Date(数据返回时间)
响应主体(响应的数据)
状态码:
3xx(比如当前资源,由于服务器要升级,或者怎样。它暂时把资源迁移到别的服务器下,这个时候,访问这个网址,他会帮你临时重定向到其他的网址。所以这个时候,向这个网址发送请求的时候,他也会给你一个响应,只不过这个响应的状态 码不是200,也不是其他信息,而是一个301或者302,这个时候,拿到他让你跳转的这个地址之后,浏览器自动的跳转到另一个服务器当中。重新定向到另一个位置,也不一定是另一个服务器,也可以是浏览器连接到你的缓存,也可以是另外的服务器)
常见的http状态码:
成功状态码: 200 服务器成功返回内容
301/302 临时/永久重定向
304 资源未被修改过(实现缓存,重新定向到浏览器的缓存资源当中)
失败状态码:404 请求内容不存在
500 服务器暂时不可用
503 服务器内部错误
请求方法GET POST的区别
在http协议里实际上没有区别
除了功能上的区别
1.GET使用URL或Cookie传参,而POST将数据放在请求主体中。?NAME=aniee&AGE=18
(GET请求的请求主体是看不到数据的,他的数据都拼接到url后边了,当作一个虚拟的链接了)
2.GET的URL会有长度的限制(url地址栏是不允许无限输入的,是有限制的),POST可以传输很多数据。(但是也是有限制的(Content-length),要考虑服务器的安全性。防止恶意攻击,会频繁的大量的往服务器里传递数据的话,会把服务器搞崩溃的。传递数据的时候,除了图片,不会达到几兆这么多)
3.POST比GET安全。(只是相对小白而言)
浏览器缓存机制
304
浏览器如何获取缓存资源
通过请求头和响应头的属性
请求头:
if-None-Match:匹配etag,如果它修改了 不取缓存
if-Modified-Since:将先前服务器端发过来的最后修改时间戳发送回去
响应头:
etag—> 标记图片资源
last-Modified(服务器最后修改的时候)和etag配合使用
第一次发送请求的时候,服务器会给你一个响应报文,响应报文当中就会有etag属性。etag属性中包含了该资源中图片的唯一标识,这个标识就代表这个图片。第二次再请求这个网址的时候,需要确定服务器中图片的资源是否有更新。所以会把第一次请求的那个etag值,拿过来,在请求头if-None-Match字段中发过去,服务器拿到这个if-None-Match唯一标识的图片信息之后,会拿这个东西跟他服务器中的图片资源进行对比,如果一样,说明没有更新。他就会给你一个304响应,说明这个图片我没有更新过,你直接拿你浏览器中的缓存就好,第二次就不用返回图片资源了,节省了带宽。如果标识对不上,就会把新的图片返回给你,浏览器会把新的图片标识存好。为下一次请求使用。
etag和if-None-Match的工作原理是在HTTP Respone中添加etag信息。当客户端再次请求该资源时,将在HTTP Resquest中加入if-None-Match信息(etag的值)。如果服务器验证资源的etag没有改变(该资源没有改变),将返回一个304状态;否则,服务器将返回200状态,并返回该资源和新的etag
max-age=2592000, 在2592000秒时间之内,再次发送请求的时候,不会再去服务器进行请求,而是直接走缓存,也就是给他设置一个缓存的时间。
referer :一般指,你从那个网站点击来的,就是你从那个网址中跳转过来的。
网站统计用户从何点击来