通信协议是什么?(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,1、覆盖(同一路径下) 2、到期时间设置为当前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











Cookie 与 网络通信的更多相关文章

  1. Windows Store App 网络通信 HttpWebRequest

    如果希望更好地控制HTTP请求,可以使用System.Net类库中的HttpWebRequest类,该类对HTTP协议进行了完整的封装,并且提供了很多对HTTP协议中的 Header.Content和 ...

  2. 跨平台网络通信与server编程框架库(acl库)介绍

    一.描写叙述 acl project是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及server编程框架,同一时候提供很多其它的有用功能库.通过该库 ...

  3. 从网络通信角度谈web性能优化

    衡量一个网站的性能有多个指标,DNS解析时间,TCP链接时间,HTTP重定向时间,等待服务器响应时间等等,从用户角度来看,就可以归结为该网站访问速度的快慢.也就是说性能等于网站的访问速度. 早些年Am ...

  4. 这一次带你彻底了解Cookie

    前言 网络早期最大的问题之一是如何管理状态.简而言之,服务器无法知道两个请求是否来自同一个浏览器.当时最简单的方法是在请求时,在页面中插入一些参数,并在下一个请求中传回参数.这需要使用包含参数的隐藏的 ...

  5. 网络通信 --> 互联网协议(二)

    互联网协议(二) 一.对上一节的总结 我们已经知道,网络通信就是交换数据包.电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信.数据包的结构,基本上是下面这样: 发送 ...

  6. session/token/cookie/socket区别

    Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象 ...

  7. 网络基础之网络协议篇---CS架构--网络通信--osi 协议---套接字socket--粘包

    1 C\S 客户端/服务器架构: .硬件 C/S架构 (打印机) .软件 C/S 架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...

  8. volley框架下发送和读取cookie

    首先volley本身不支持cookie,但是volley又非常好用(比如封装了网络请求的实现,内部支持并发, 不用我们再额外设计网络管理异步处理,网络请求不应在UI线程等等),那既想使用volley又 ...

  9. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

随机推荐

  1. Zookeeper(四)Hadoop HA高可用集群搭建

    一.高可就集群搭建 1.集群规划 2.集群服务器准备 (1) 修改主机名(2) 修改 IP 地址(3) 添加主机名和 IP 映射(4) 同步服务器时间(5) 关闭防火墙(6) 配置免密登录(7) 安装 ...

  2. 2656: [Zjoi2012]数列(sequence)(递归+高精度)

    好久没写题了T T NOIP 期中考双血崩 显然f(x)=f(x>>1)+f((x>>1)+1),考虑每次往x>>1递归,求出f(x),复杂度O(logN) 我们设 ...

  3. [bzoj3238]差异(后缀数组+单调栈)

    显然我们可以先把len(Ti)+len(Tj)的值先算出来,再把LCP减去.所有len(Ti)+len(Tj)的值为n*(n-1)*(n+1)/2,这个随便在纸上画一画就可以算出来的. 接下来问题就是 ...

  4. python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承                                                                          继承是一种创建新的类的方式,在pyth ...

  5. 如何在 ASP.NET 应用程序中实现模拟用户身份(在ASP.NET中以管理员身份运行网站)

    前言 在实际的项目开发中,我们可能会需要调用一些非托管程序,而有些非托管程序需要有更高的身份权限才能正确执行.本文介绍了如何让IIS承载的ASP.NET网站以特定的账户执行,比如Administrat ...

  6. 音视频处理之H264编码标准20170906

    一. H264基础概念 1.名词解释 场和帧 :    视频的一场或一帧可用来产生一个编码图像.在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场. 片:             每个图象中,若干 ...

  7. Codeforces Round #404 (Div. 2)A B C二分

    A. Anton and Polyhedrons time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  8. 04-树6. Huffman Codes--优先队列(堆)在哈夫曼树与哈夫曼编码上的应用

    题目来源:http://www.patest.cn/contests/mooc-ds/04-%E6%A0%916 In 1953, David A. Huffman published his pap ...

  9. C#获取Json字符串中的某个值

    问题描述: json数据格式{"resCode":0,"resMag":"aaa","data":[{"par ...

  10. Data science blogs

    Data science blogs A curated list of data science blogs Agile Data Science http://blog.sense.io/ (RS ...