我们平时可以上网通讯,是因为互联网协议(TCP/IP协议族)。如何探测到通讯目标,使用什么语言进行通讯,怎样结束不同的硬件,操作系统之间的通讯等都需要有一套规则来约束。我们把这种规则称为协议。把互联网相关的协议集合起来总称为互联网协议(TCP/IP协议族)。
分层
通常我们把协议分为四层。
分层的好处:每一层只需要关心自己的协议。修改一处不需要整个替换,只把该层的变动替换掉就好。并且每一层设计相对简单。
1链路层
电脑通讯需要组网(以局域网为例)。这一层的作用就是用来处理网络的硬件部分(包括操作系统,设备驱动,网卡等)。可以用光缆、电缆、双绞线、无线电波等方式。硬件上的范畴都属于该层。并且规定了网络的一些电气特性,作用是负责传送0和1的电信号。
2网络层
网络层的作用就是在众多的选项中,选择正确的传输路线。主要是IP协议。还有mac地址。有了 IP 地址,为什么还要用 MAC 地址?,同一个子网络内。mac地址就可以满足查询目标地址。采用广播的方式。给子网络的每个计算机都发送数据。每个计算机都取出目标mac地址与自身对比。一致的话就接受数据。那我们是怎么知道目标计算机的mac地址呢?采用ARP协议(ARP协议会使用到IP地址)。如果两个计算机不在统一子网络。我们就出现了一个新的协议IP协议。规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成两个部分,前一部分代表网络,后一部分代表主机。单单从IP地址,我们无法判断网络部分。还是以172.16.254.1为例,它的网络部分,到底是前24位,还是前16位,甚至前28位,从IP地址上是看不出来的。
那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数"子网掩码"。知道"子网掩码",我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
ARP协议
关于"网络层",还有最后一点需要说明。
因为IP数据包是放在以太网数据包里发送的,所以我们必须同时知道两个地址,一个是对方的MAC地址,另一个是对方的IP地址。通常情况下,对方的IP地址是已知的(后文会解释),但是我们不知道它的MAC地址。
所以,我们需要一种机制,能够从IP地址得到MAC地址。
这里又可以分成两种情况。第一种情况,如果两台主机不在同一个子网络,那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的"网关"(gateway),让网关去处理。
第二种情况,如果两台主机在同一个子网络,那么我们可以用ARP协议,得到对方的MAC地址。ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。
总之,有了ARP协议之后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。
3传输层
"传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。这一层涉及到的就是UDP和TCP协议。UDP就是在之前的数据前面加上端口号。UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。
为了解决这个问题,提高网络可靠性,TCP协议就诞生了。
4应用层
TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。HTTP协议处于该层。
各个协议协作的关系图:
URL和URI的区别?
URI:统一资源标志符就是在某一规则下能把一个资源独一无二地标识出来。
URL:那统一资源定位符。
URL 是 URI 的子集。任何东西,只要能够唯一地标识出来,都可以说这个标识是 URI 。如果这个标识是一个可获取到上述对象的路径,那么同时它也可以是一个 URL ;但如果这个标识不提供获取到对象的路径,那么它就必然不是 URL 。
post put 区别?
二者实质的区别在于幂等性。
幂等是数学的一个用语,对于单个输入或者无输入的运算方法,如果每次都是同样的结果,则称其是幂等的。
POST方法往往作用于某个资源的类型,比方说要创建一个资源,发了一遍就是创建一个,发了两遍就是创建了两个。
而PUT是作用于资源的具体记录,对它作更新实际上发一遍和发若干遍的效果是一样的。也就是说资源的URI由客户端确定的话就用PUT,由服务端确定的话就用POST,比如很多资源使用的是数据库自增主键标志,那么这个时候资源的创建就必须用POST
http 持久化。
在http1.1默认客户端通过请求头Connection为keep-alive。意思为长连接。考虑一个问题。tcp是在http的下一层。也就是先http请求,在tcp连接。如果是长连接就是tcp请求不会主动断开。那么下一个http请求的下一层是直接使用上一层请求建立的tcp连接吗? 嗯。是的。举个例子。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接。而不是你想的,先http建立完成后tcp再建立。就好比打电话,A给B打电话。A拨出手机号码,这就是http请求。这时候电话机把号码传给电信局交换机,中间经过若干交换机,最终到达B电话机,电话铃响。这时能通话吗?不能,因为连接还没有完成!在朱丽叶拿起话机的那一刻,电话机发送off-hook(摘机)消息给电信局交换机,意思是接收电话连接,这个消息原路返回,到达罗密欧话机,罗密欧的话机接收到这个确认消息。之后才能进行通话。这里的电话机连接就相当于tcp的三次握手。长连接就相当于。A与B发完消息后,电话不挂断继续保持。C再与B通话就不用电话机再去连接了。直接复用就好了。模拟TCP/HTTP关系
http1.1性能优化
详解 HTTP 协议
网关代理的区别
Cache-COntrol为no catch 是什么含义
http缓存
比如数据库缓存、代理服务器缓存、还有我们熟悉的CDN缓存,以及浏览器缓存。我们来看看代理服务器的缓存。
缓存服务器是一种代理服务器。
浏览器缓存:是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。
那什么时候是浏览器缓存什么时候是代理服务器缓存呢?
Cache-Control:
-public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
-private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
默认Cache-Control为public。
那么一个请求的数据在浏览器和缓存服务器中都被缓存了。我们浏览器会先看本地的是否过期。那么缓存服务器什么时候起作用呢?
不是说有了缓存之后,浏览器的每次请求都会请求本地缓存。主要看重新请的的方式是什么
浏览器缓存刷新
在地址栏中输入网址后按回车或点击转到按钮
浏览器以最少的请求来获取网页的数据,浏览器会对所有没有过期的内容直接使用本地缓存,从而减少了对浏览器的请求。所以,Expires,max-age标记只对这种方式有效。按F5或浏览器刷新按钮
浏览器会在请求中附加必要的缓存协商,但不允许浏览器直接使用本地缓存,它能够让 Last-Modified、ETag发挥效果,但是对Expires无效。按Ctrl+F5或按Ctrl并点击刷新按钮
这种方式就是强制刷新,总会发起一个全新的请求,不使用任何缓存。
当浏览器本地缓存失效后,浏览器会向CDN边缘节点(缓存服务器)发起请求。类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。所以浏览器缓存和代理服务器缓存不是等同的。
从浏览器本地缓存读取响应为200。还需要请求服务器的返回304。
待解决问题,扫一扫登录长轮询,浏览器并发限制链接个数
浏览器并发限制
浏览器做并发限制的原因:
以前服务器的负载能力差,稍微流量大一点服务器就容易崩溃。所以为了保护服务器不被强暴到崩溃,浏览器要对最大并发数进行限制。如果每一个用户的最大并发数不限制的话,服务器的负载能力就会大幅度下降。
防止DDOS攻击。最基本的DDOS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的相应。
pc一般尽量分多个域,因为DNS域名解析解析很快。但是移动端的dns很慢。
分发限制
长轮询,轮询,长连接
Connection:keep-alive 这个是持久连接的意思,和长连接,长轮询没有关系。
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。
缺点:请求中有大半是无用,浪费带宽和服务器资源。
实例:适于小型应用。
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求,耗费资源小。
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
实例:WebQQ、Hi网页版、Facebook IM。
长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求;管理起来也相对方便。
缺点:服务器维护一个长连接会增加开销。
实例:Gmail聊天
而持久连接的意思是tcp的连接是持久的。上面都是http的连接。如果没有,客户端收到响应数据后tcp连接就会关闭连接
轮询和持久连接
扫一扫如何实现
Websocket
WebSocket和Socket的区别
post和get的区别
get回退是无害的,而post会再次提交请。因为get是幂等的。post是非幂等的幂等是什么 form表单不使用ajax提交,并且跳转到表单页面。则刷新一次提交一次数据。可以使用301重定向解决
content-Type和accept
ContentType:属于实体头。所以不是属于请求头的。用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件。
在请求时候是描述参数的类型,响应时候就是描述返回文件的类型。所以我认为客户端和服务端都是接收方。
Accept属于请求头,代表客户端希望接受的数据类型。