Cookie 与 网络通讯


通讯协议是什么?(ftp、 http、 https、 file...)

交流的规则
举例:
汉语、英语、法语、德语

(百度百科:通讯协议) 通讯协议是指双方实体完成通讯或服务所必须遵循的规则和约定。经过通讯信道和设备互连起来的多个不一样地理位置的数据通讯系统,要使其能协同工做实现信息交换和资源共享,它们之间必须具备共同的语言。交流什么、怎样交流及什么时候交流,都必须遵循某种互相都能接受的规则。这个规则就是通讯协议。


IP协议 Internet Protocol

(百度百科:IP协议)IP协议是用于将多个包交换网络链接起来的,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的从新组装功能,以适应不一样网络对包大小的要求。
4个字节, 一共32位
子网掩码 的做用? 255.255.255.0  
确认两台计算机是否处于同一网段




TCP、UDP的区别
若是TCP比做是打电话,那么UDP就是在发短信

TCP(Transmission Control Protocol 传输控制协议)是一种面向链接的、可靠的、基于字节流的传输层通讯协议 (通讯以前必须先创建链接)

因而,TCP相对可靠,它创建链接的过程称为3次握手

第一个特色:
     三次握手,创建链接

     
第二个特色:
     全部的消息,须要对方确认送达。
"土豆,土豆,我是茄子,收到请回答"
"茄子,茄子,我是土豆,收到消息"
     当消息发送失败,则对当前消息开始进行重复发送,直至收到回应为止。
"茄子,茄子,我是土豆,我被人油炸了,我更名叫薯片,收到请回答"
............
"茄子,茄子,我是土豆,我被人油炸了,我更名叫薯片,收到请回答,第2遍"
............
"茄子,茄子,我是土豆,我被人油炸了,我更名叫薯片,收到请回答,第3遍"
............
"薯片,薯片,我收到消息"

     所以能够确保数据的准确送达
举例:
局域网游戏,每每都有这样的特色,当多人联机对战时,如有一我的掉线
其余全部玩家进入读秒状态,那么说明玩家和玩家之间采用了TCP协议。
由于对于游戏来说,它不容许丢失任何数据,否则有可能出现两边不一致的状况:
我这边画面一刀把你砍死了,你那边画面却吃了个大血瓶抗住了。。。。。

UDP面向数据报的协议  (不可靠的协议)
(百度百科 UDP)UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无链接的传输层协议,提供面向事务的简单不可靠信息传送服务,

      无需创建链接
      发送消息也无需对方确认
      没法保证数据的发送顺序,以及准确率
数据的发送顺序是 a.........b.........c...........d
因为网路延迟的缘由,对方收到数据的顺序有多是b...........d..........a

UDP一般用于视频、语音等通讯(丢掉了一帧画面是无所谓的)(局域网cs)
相对于TCP“效率”可能会更高

HTTP(无状态的协议)  

基于TCP协议的一种高级协议,  用于客户端和服务器直接的通讯
超文本传输协议 (HTTP,HyperText Transfer Protocol)

Socket
(socket是一种网路通讯模型,由伯克利大学发明,因为其优秀的设计后被各大编程语言所采用)
//如下是JAVA使用socket连接百度服务器,请求首页的代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class ClientSocket {
    public static void main(String[] args) throws Exception {
        Socket skt = new Socket("61.135.169.125",80);
        BufferedWriter bw =  new BufferedWriter( new OutputStreamWriter( skt.getOutputStream() ) );
        bw.write("GET / HTTP/1.1");
        bw.newLine();
        bw.write("Host: www.baidu.com:80");
        bw.newLine();
        bw.write("Content-Type: text/html");
        bw.newLine();
        bw.newLine();
        bw.flush();
        //GET / HTTP/1.1
        //Host: localhost:8080
        //Content-Type: text/html
        BufferedReader br = new BufferedReader(new InputStreamReader(skt.getInputStream()));
        String str = null;
        while( (str = br.readLine()) != null) {
              System.out.println(str);
        }
    }
}


反复观察上面这个SOCKET程序的运行结果,你能看的出来么?这种通讯最大的问题在哪?
问题就在于每次收到返回的页面,链接都断开了。

所以HTTP这种无状态的协议,最大的特色就是,你挂断了电话老子还怎么通信?!
刚刚提交过的用户名密码(登陆动做),
下次请求服务器(例如查询帐户余额),难道还要从新验证身份?

因而cookie就出现了

COOKIE的诞生,为何叫会话跟踪技术

在一次会话从开始到结束的整个过程,全程跟踪记录客户端的状态(例如:是否登陆、购物车信息、是否已下载、是否已点赞、视频播放进度等等)

你把COOKIE就当成是第一次跟服务器链接后,服务器发给你的身份牌,上面就记录跟你有关的信息
之后只要再跟服务器通讯,必须带着这个身份牌
这样一来,关于你是谁? 有没有登录过? 购物车里有什么信息? 服务器固然就很容易知道了。
     
这里面固然还有不少的安全隐患,也有相应的解决办法,这个不在咱们今天的讨论范围。

cookie的核心应用(本意)就是验证身份,顺带存取一些体积小的数据,其主要目的是用于身份的验证
这也是后来H5出现LocalStorage,sessionStorage 的缘由

cookie有哪些特色?(基本都是从安全考虑)

1 只能使用文本文件(防止写入病毒)
     (若是浏览器能够随意在客户端机器上生成文件,好比身份牌是个定时炸弹,安全问题将会变得很是严重)
2 文件有大小限制  4KB (通常状况下,同一域名下为4KB,防止占用空间过大)
     (文件若没有大小限制,好比身份牌的重量是140斤,挂脖子能不能累死?)
3 数量限制 (个别浏览器)
     (通常浏览器,限制大概在50条左右,你家的门禁卡里能存的下一部蓝光高清么?
4 读取有域名限制 (同源策略,必须是同一个来源才能获取,保证数据安全)
     不可跨域读取,只能由来自 写入cookie的 同一域名 的网页可进行读取。
     简单的讲就是,谁写的cookie,谁才有权利读取
     (身份牌是我发你的,固然只有我能读取,你媳妇儿的手机自动链接了邻居老王家的wifi,你知道这意味着什么吗?)
5 时效限制
     每一个cookie都有时效,最短的有效期是,会话级别: 就是当浏览器关闭,那么cookie当即销毁
     (安全学基本理论:密码锁每次打开都须要从新输入密码,输入一次密码,之后就再也不验证,就没有安全可言
          问: 信用卡为何会有过时时间?     
     )

Cookie的流程图




若是有时候,咱们须要这个网页长时间跟服务器保持链接,好比说即时通信、语音、视频等等

HTML5的websocket,试图解决这个问题

在websocket没有诞生以来,解决这个问题是极为困难的。

一般有两种作法:ajax轮询和 comet技术

第一种:ajax轮询
        var getting = {

        url:'server.php',

        dataType:'json',

        success:function(res) {

         console.log(res);

}

};

//关键在这里,Ajax定时访问服务端,不断获取数据 ,这里是1秒请求一次。

window.setInterval(function(){$.ajax(getting)},1000);



第二种 : comet技术

这个是利用了HTTP协议的1.1版本中新推出的长链接
咦?这名字听上去好像不错,若是链接能够长时间保持不断开,那问题不就解决了吗?

其实长链接仅仅只是延长了链接时间,能够在一次链接中出现不少个request和response
可是在即时通信这样的功能里面,因为客户端不知道消息什么时候发过来?
咱们须要服务器主动的向客户端推送消息。但长链接并不能作到这一点。

由于在HTPP协议的特色中,服务器的response必须是在收到了客户的request后才能产生的
说白了,你请求一次,服务器返回一次,你不请求,服务器不能主动返回

因而,高手们想到了这样一个办法



"有新消息吗? 不!我不听!不要告诉我没有!等有新消息了你再回答我!"   //第一次requrest,长链接已经开始
............过了一会
"有新消息了" //服务器返回,第一次response
"哈哈哈,好兴奋"//客户端接收结果并处理,此时链接没有断开
"还有新消息吗?等有新消息了再回答我吧!" //第二次requrest
............过了一会
"有新消息了" //服务器再次返回,第二次response

这样作看起来,好像是服务器主动发送了消息,其实每次咱们都要先发请求,只不过没有消息的时候这个请求被阻塞了而已
很差的地方在于,它消耗了大量程序资源,程序除了处理业务逻辑,还要负责管理这个请求



WebSokcet是一种HTTP1.1协议的加强版,就像socket程序同样,消息能够随时发送,随时接受

咱们的服务器从被动的返回,变成了主动的发送

"有新消息吗?有了通知我"   //第1次requrest,链接上了
............过了一会
"有新消息了"  // 第1次response,链接保持中...
............过了一会
"又有新消息了"   // 第2次response, 链接保持中...
............又过了一会
"又有新消息了"   // 第3次response, 链接保持中...

它还有一个巨大的好处就是, 这个链接的保持能够再也不由程序处理
想象这样一个场景:
Twitter上有成千上万的用户,每秒钟有几十万人同时跟服务器作链接,作信息交换。程序能处理的了这么多的链接么?

因而咱们考虑这样一种模型:




google浏览器对cookie要求比较严格,file协议下(无域名)的cookie操做是不被容许的
手动更改电脑时间,当cookie到期后不会消失,只是取不出来,由于cookie过时时间实际上是一个倒计时的定时器
清空cookie,一、覆盖(同一路径下) 二、到期时间设置为当前session
document.cookie ="";(会自动转为字符串)

cookie 中的 path 做用域同 全局变量与局部变量的做用域关系相似

var Cookie = {
	get: function(key){
		var cookiestr = document.cookie;
		var list = cookiestr.split("; ");
		for(var i=0; i<list.length; i++){
			var kvs = list[i].split("=");
			if(kvs[0]==key) {
				return kvs[1];
			}
		}
		return null;
	},
	set: function(key,value,expires,path){//键、值、存在时间(数字、字母、日期)、路径
		if( (typeof expires == "number") || (typeof expires == "string")) {
			expires = Number(expires);
			if(isNaN(expires)) {
				expires = undefined;
			} else {
				var d = new Date();
				d.setDate(d.getDate()+expires);
				expires = d;
			}
		} 
		if( !(expires instanceof Date) && typeof expires == "object") {
			expires = undefined;
		}
		document.cookie = key+"="+value+";" + (expires?"expires="+expires+";":"") + (path?"path="+path+";":"");
	}
}

注:cookie中只能存文本,所以不能存取对象,可用JSON.stringify() 和JSON.parse() 转换后存取

jquery.cookie.js 使用:

//Query操做cookie的插件,大概的使用方法以下
$.cookie('the_cookie'); //读取Cookie值
$.cookie(’the_cookie’, ‘the_value’); //设置cookie的值
$.cookie(’the_cookie’, ‘the_value’, {expires: 7, path: ‘/’, domain: ‘jquery.com’, secure: true});//新建一个cookie 包括有效期 路径 域名等
$.cookie(’the_cookie’, ‘the_value’); //新建cookie
$.cookie(’the_cookie’, null); //删除一个cookie
相关文章
相关标签/搜索