1.OSI七层模型指什么?
-
OSI七层模型结构:
OSI七层模型是通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输。完成中继功能的节点通常称为中继系统。在OSI七层模型中,处于不同的中继系统具有不同的名称:物理层,数据链路层,网络层,传输层,会话层,表示层,引用层。
各层的作用:- 1.物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。在这一层,数据的单位称为比特(bit)。
- 2.数据链路层:通过各种协议控制,将哟差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。在这一层,数据的单位称为帧(frame)。
- 3.网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。在这一层,数据的单位称为数据包(packet)。
- 4.传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。在这一层,数据的单位称为数据段(segment)。
- 5.会话层:组织和协调两个会话进程之间的通信,并对数据交换进行管理。
- 6.表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。
- 7.应用层:直接向用户提供服务,完成用户希望在网络上完成的各种工作。
TCP/IP协议
实际上,OSI是一种理想化的协议模型,过于复杂。现实中使用是更为精简的TCP/IP协议的四层模型,TCP/IP协议与OSI协议的对应关系如下:
- 链路层:用来处理链接网络的硬件部分
- 网络层:用来处理在网络上流动的数据包
- 传输层:提供处于网络链接中的两台计算机之间的数据传输,TCP协议(传输控制协议)和UDP协议(用户数据协议)就在此层。
- 应用层:向用户提供应用服务时通信的活动。FTP,DNS和HTTP协议就在此层。
2.HTTP的工作原理是什么?
在说明HTTP的工作原理之前,要先介绍在TCP/IP协议族中与HTTP协议密不可分的3个协议。
负责传输的IP协议
按层次分,IP协议位于网络层。它的作用就是把各种数据包传送给对方。而为了准确无误的把数据包传递给对方,需要知道2个非常重要的信息,IP地址和MAC地址。IP地址指明了节点被分配到的地址,是可以发生变化的。MAC地址是指的的网卡所属的固定地址,基本上是不会改变的。我们可以用快递的方式来理解IP协议:假如我要从武汉寄一份快递到北京,首先填写一个北京的具体送货地址(IP地址),然后去离我家最近的一个快递站点发货(MAC地址,中转站),这个小型站点是没有能力直接把货送到北京的,所以它会分析地址,送到武汉的某个大型站点(MAC地址,中转站),武汉的大型站点再分析地址,送到北京的某个大型站点(MAC地址,中转站),北京的大型站点再分析地址,送到地址对应的某个小型站点(MAC地址,中转站),最后快递员送货到达最终的地址(MAC地址,IP地址)。回到网络通信中,除非是同一个局域网内,大部分的IP通信都是像快递中转一般,利用多台计算机和网络设备才能连接到对方。在进行中转时,会利用ARP协议(一种解析地址的协议,已知对方的IP地址,反查出对方的MAC地址。),得到下一个中转站的MAC地址来搜索下一个中转目标,最终搜索到目标地址。确保可靠的TCP协议:
按层次分,TCP位于传输层。TCP协议为了更容易的传输大数据,将大数据分割成以报文段(segment)为单位的数据包,并且通过三次握手的策略来确认数据送达目标处。
三次握手:发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,代表握手结束。如果在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。负责域名解析的DNS服务
DNS服务是和HTTP协议一样位于应用层。它的作用是提供域名到IP地址之间的解析服务。一般我们都是直接输入域名来访问某个网页,因为这样更符合我们的记忆习惯,但是计算机更擅长处理一长串数字,所以需要DNS这样的服务,能通过域名来查找IP地址,或逆向从IP地址反查域名。
结合以上三种协议,具体的HTTP协议的通信过程可以用下图表示:
[图片上传中。。。(2)]http.jpg
3.URI的格式是什么?常见的协议有哪些?
URI是Uniform Resource Identifier的缩写,它指的是某个协议方案表示的资源定位标识符。
协议方案指的是访问资源所使用的协议类型名称。常用的协议有http,https、file,mailto,telnet等。
URI有两个子集,分别是URL(uniform resource location)统一资源定位符和URN(uniform resource name)统一资源命名。我们更常用的是URL,关于URI和URL的关系可以这么理解:URI描述了一个资源在网上的一切信息,包含这个资源的名字,这个资源在哪里等等。而URL描述了在网上如何找到这个资源,也就是这个资源在哪里。所以从逻辑上来讲URL是URI的子集,在充分理解的基础上,URL是可以替换URI的。
URI格式如下:
- 协议方案名:常见的http,https,ftp等,不区分大小写,最后记得要加上冒号:
- 登陆信息:指定用户名和密码作为从服务器获取资源是必要的登陆信息。此项是可选项,由于太不安全,现在不常见了。
- 服务器地址:使用URI必须指定带访问的服务器地址,可以是NDS可解析的名称或者是直接的IP地址名。
- 服务器端口:指定服务器连接的网络端口号。此项也是可选项,若不写则使用默认端口号。
- 带层次的文件路径:指定服务器上的文件路径来定位特制的资源。
- 查询字符串:针对已指定的文件路径的资源,可以使用查询字符串参入任意参数。此项可选。
- 片段标识符:使用片段标识符通常可标记以获取资源中的子资源(文档内的某个位置)。该项也是可选项,在很多MVVM框架用做了路由功能。
4.HTTP协议有几种和服务器交互的方法
- GET:用来请求访问已被URI识别的资源。指定的资源经过服务器端解析后返回相应内容。
- POST:用来传输实体的主体。虽然POST的功能和GET很相似,但是POST的主要目的是向服务器传输大量数据。
- PUT:用来传输主体,在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。但是PUT自身不带验证机制,存在安全性问题,一般不会使用。
- HEAD:用来获得报文首部,与GET方法一样,但是不会返回报文主题,用来确认URI的有效性及资源更新的日期时间等。
- DELETE:用来删除文件,是PUT相仿的方法,同样由于安全性问题,一般不会使用。
- OPTIONS:用来查询针对请求URI指定的资源支持方法。
- TRACE:用来让Web服务器端将之前的请求通信环回给客户端。
- CONNECT:该方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。
5.状态码200,301, 304,403,404,500,503分别代表什么意思
服务器的响应类别有下面5种:
- 200:表示从客户端发来的请求在服务器端被正常处理了。
- 301:永久性重定向,表示请求的资源已被分配了新的URI,新的URI出现在Location首部字段中,浏览器会自动访问新的URI。
- 304:表示客户端发送附带条件(比如if-Modified-Since)的请求时,虽然未满足条件,但是服务器端还是允许请求访问资源。在浏览缓存文件时,会看到304的身影,说明这个缓存资源未发生变更,能继续使用。
- 403:表示对请求资源的访问被服务器拒绝了。
- 404:表示服务器上无法找到请求的资源,也可以在服务器端拒绝请求且不想说明理由时使用。
- 500:表示服务器端在执行请求时发生了错误,也有可能是Web应用存在的bug或某些临时的故障。
- S503:表示服务器暂时处于超负荷或正在进行停机维护,现在无法吃力请求。
6.报文有那几部分组成?
总体上HTTP报文是由报文首部+空行(回车)+报文实体组成。由于HTTP协议服务于请求端和响应端,所以HTTP报文也分为两种,请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文,二者的具体内容可见下图:
7.请求头的格式和作用是什么?给个范例截图说明
GET / HTTP/1.1 :请求方法是GET,HTTP协议版本1.1
Host:URI信息。
Connection:管理持久链接,keep-alive
表示持久链接,HTTP/1.1版本默认持久链接,如果想要断开,指定值为close即可。Cache-Control:控制缓存的行为,max-age=0
意味着缓存服务器需要将请求转发给源服务器。Upgrade-Insecure-Requests:让浏览器升级自动http协议到https协议。
这里解释一下,如果一个用https协议承载的页面加载一些用http协议定义的资源,是会报错的,所以往往在服务器端的响应头中,会加入header("Content-Security-Policy: upgrade-insecure-requests")这么一句话,让浏览器自动将http协议升级成https协议,而在请求头中的Upgrade-Insecure-Requests:1
表明该浏览器支持该操作。User-Agent:告知服务器,客户端使用的操作系统和浏览器的名称和版本。
Accept:告知服务器,浏览器能处理的媒体类型及媒体类型的相对优先级。
Accept-Encoding:告知服务器,浏览器支持的内容编码饥内容编码的优先级顺序。可指定多种。
Accept-Language:告知服务器,浏览器支持的语言及语言的相对优先级。
Cookie:储存一些临时的数据在用户的计算机中,虽然没有编入标准化的HTTP/1.1协议中,但是在Web网站会广泛使用。
8.首部的格式和作用是什么?给个范例截图说明
- Request URL:请求服务器的URL地址。
- Request Mothod:请求的方法。
- Status Code:状态码
- Remote Address:服务器的IP地址和端口号。
9.主体的作用是什么?给个范例截图说明
主体就是HTTP报文实质要传输的数据,并不是所有的报文都有主体,例如get方法的请求报文就没有主体。主体可以承载很多类型的数据,我们最熟悉的html文档,图片、视频、应用程序、电子邮件等。当我打开B站的首页,由于是get方法,并没有请求报文主体,但是响应报文就会返回响应主体,就是B站首页的HTML文档,如下图:
当我进入B站的登陆页面时,输入我的账号密码点击登陆后,可以看到POST方法请求的请求报文就有请求主体,如下图:
此时我的用户名和密码就上传到了服务器。
10.简述浏览器缓存是如何控制的
浏览器缓存分为强缓存和协商缓存,协商缓存是配合强缓存来使用的。当浏览器第一次请求资源时,根据开发者的要求或者协议的默认,服务器端会在响应头中添加一些跟缓存有关的字段,最终这个资源和响应头会绑定在一起缓存到浏览器中。当浏览器再次请求这个资源时,首先判断它是否命中了强缓存,判断依据来自于之前响应头中的Expires或Cache-Control字段:
- 1.Expires:来自于HTTP/1.0,描述一个绝对时间,由服务器返回,用GTM格式的字符串表示,当浏览器再次请求资源时,先从缓存中找到这个资源和跟它绑定在一起的响应头,拿出响应头中的Expires跟当前请求时间对比,如果请求时间在Expires指定的时间之内,就能命中强缓存,直接在浏览器的缓存中读取该资源,无需再向服务器请求资源了。但是Expires描述是一个服务器的绝对时间,而客户端的时间与服务器时间存在时间差,而且客户端时间可以人为修改,这些都会影响判断结果,因此HTTP/1.1推出Cache-Control字段来更好的控制缓存。
- 2.Cache-Control:提供了更多的缓存设置,有一个描述相对时间max-age,单位是s,如果再次请求的时间间隔小于max-age,表示命中强缓存。Cache-Control和Expires可以同时存在,但是Cache-Control的优先级更高
如果这个资源没有命中强缓存,浏览器就会发送一个请求到服务器,验证协商缓存是否命中,如果命中,也是能够在缓存中直接读取资源了。协商缓存是依靠Last-Modified,If-Modified-Since
和ETag , If-None-Match
这个两队字段来控制。
- 1.Last-Modified,If-Modified-Since:同Expries相似,Last-Modified存在于上一次的响应头中,描述了这个资源在服务器中最后一次修改的时间,当强缓存未命中时,浏览器会发送请求给服务器,请求头中就有If-Modified-Since这个字段,这个字段等于上一次响应头中的Last-Modifie的值,服务器收到请求后,根据传过来的If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有更新,若资源更新了,则正常返回资源内容,HTTP200 。若资源没有更新,则返回HTTP304,浏览器就直接读取缓存中的资源。但是有时候Last-Modified不太可靠,比如时间只能精确到秒级,资源内容变化了但是时间没有变等,就需要ETag来处理。
- 2.ETag,If-None-Macth:原理与Last-Modified一样,只不过ETag是根据请求的资源生成的一个唯一标识,这个标识是一个字符串,生成规则跟服务器使用的程序有关。只要资源发生了变化,这个字符串就会发生变化,所以能够很好的补充Last-Modified的问题。Last-Modified可以与ETag一起使用,服务器会优先验证ETag,一致的情况下,再验证Last-Modified。
通过一张图更好的理解缓存:
11.下图各个参数是什么意思
-
Genaral:基本信息的概要。Request URL:请求资源的URL地址。
- Request Method:请求的方法,这里为PUT
- Stutus Code:响应的状态码和短语,200表示一切正常。
- Remote Address:请求的服务器的IP地址和端口号。
-
Response Headers:响应头Connection:链接状态,keep-alive为保持链接。
- Content-Length:主体内容的大小,这里为12字节。
- Content-Type:主体内容的媒体类型,这里为json。
- Date:创建报文的日期和时间
- Server:服务器上使用的应用程序的信息,这里使用的nginx/1.6.2。
- X-Powered-By :表示服务器是什么技术开发的,这里是Express。
-
Request Headers:请求头Accept:浏览器能处理的媒体类型,这里为一切。
Accept-Encoding:浏览器能支持的内容编码格式,这里为gizp,defalte,sdch。
Accept-Language:浏览器能支持的语言和优先级,默认权重值q为1,这里优先考虑zh-CN。
Connection:链接状态,keep-alive为保持链接。
Content-Length:主体内容的大小,这里为56字节。
Content-Type:主体内容的媒体类型,这里使用form表单的x-www-form-urlencoded格式。
补充一下:form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)Cookie:缓存的数据。
Host:服务器的主句和端口号,这里为note.ruoyu.site。
Origin:服务器的源地址。
Referer:告知服务器请求的原始资源的URI。
User-Agent:客户端使用的操作系统和浏览器的名称和版本
X-Requsted-With:表示使用的是Ajax异步请求。
Form Data:表单数据article:数据的标题是若愚@饥人谷。