1.OSI 七层模型指什么?
七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。
它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。
- 第一层:物理层(PhysicalLayer),
规定通信设备的机械的、电气的、功能的和过程的特性,用以建立、维护和拆除物理链路连接。具体地讲,机械 特性规定了网络连接时所需接插件的规格尺寸、引脚数量和排列情况等;电气特性规定了在物理连接上传输bit流时线路上信号电平的大小、阻抗匹配、传输速率 距离限制等;功能特性是指对各个信号先分配确切的信号含义,即定义了DTE和DCE之间各个线路的功能;规程特性定义了利用信号线进行bit流传输的一组 操作规程,是指在物理连接的建立、维护、交换信息是,DTE和DCE双放在各电路上的动作系列。在这一层,数据的单位称为比特(bit)。属于物理层定义的典型规范代表包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45等。
- 第二层:数据链路层(DataLinkLayer):
在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(frame)。数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等。
- 第三层是网络层
在 计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息- -源站点和目的站点地址的网络地址。如 果你在谈论一个IP地址,那么你是在处理第3层的问题,这是“数据包”问题,而不是第2层的“帧”。IP是第3层问题的一部分,此外还有一些路由协议和地 址解析协议(ARP)。有关路由的一切事情都在这第3层处理。地址解析和路由是3层的重要目的。网络层还可以实现拥塞控制、网际互连等功能。在这一层,数据的单位称为数据包(packet)。网络层协议的代表包括:IP、IPX、RIP、OSPF等。
- 第四层是处理信息的传输层
第4层的数据单元也称作数据包(packets)。但是,当你谈论TCP等具体的协议时又有特殊的叫法,TCP的数据单元称为段 (segments)而UDP协议的数据单元称为“数据报(datagrams)”。这个层负责获取全部信息,因此,它必须跟踪数据单元碎片、乱序到达的 数据包和其它在传输过程中可能发生的危险。第4层为上层提供端到端(最终用户到最终用户)的透明的、可靠的数据传输服务。所为透明的传输是指在通信过程中 传输层对上层屏蔽了通信传输系统的具体细节。传输层协议的代表包括:TCP、UDP、SPX等。
- 第五层是会话层
这一层也可以称为会晤层或对话层,在会话层及以上的高层次中,数据传送的单位不再另外命名,而是统称为报文。会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。如服务器验证用户登录便是由会话层完成的。
- 第六层是表示层
这一层主要解决拥护信息的语法表示问题。它将欲交换的数据从适合于某一用户的抽象语法,转换为适合于OSI系统内部使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩, 加密和解密等工作都由表示层负责。
- 第七层应用层
应用层为操作系统或网络应用程序提供访问网络服务的接口。应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等。
2.HTTP 的工作原理是什么?
(1)客户端与服务器需要建立连接。只要点击某个超级链接,HTTP就开始工作了。
(2)建立连接后,客户端向服务器发送一个请求,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
(3)服务器街道请求后,基于相应的响应信息,其格式为一个状态航,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
(4)客户端接收到服务器返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
3.URI 的格式是什么?常见的协议有哪些?
通用的URL由9部分组成
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<hash>
scheme: 协议部分。对于web页面来说最常用的协议就是http和https
user和password现在不常见了,不会在URL明文书写用户名和密码了,都是通过登录的方式
host:主机可以是IP地址或者域名
port:端口号。端口号用来区分主机上的进程,方便找到web服务器,http默认是80
path:资源的路径,也就是存放位置,不一定和物理路径完全对应,符合web服务器路由约定即可
params:在一些协议中需要参数来访问资源,例如ftp是二进制还是文本传输,参数是名值对,用;隔开
query:这个是get请求最常用的传递参数方式了 ?a=1&b=2&=3
hash:也成为片段,设计为标识文档的一部分,很多MVVM框架用作了路由功能。也就是URL中#号的部分
常见协议
- http:超文本传输协议,主要用于传输网络资源。(端口号80)
- https:超文本传输安全协议。使用超文本传输协议进行通讯且利用 SSL/TLS 协议来对封包进行加密。(端口号443)
- ftp:远程文件传输协议,允许用户将远程主机上的文件拷贝到自己的计算机上。
- smtp:简单邮政传输协议,用于传输电子邮件。
- ssh:为计算机上的 Shell 提供安全的传输和使用环境的安全协议。
4.HTTP 协议有几种和服务器交互的方法?
GET
GET是最常用的方法,通常用于请求服务器发送某个资源
我们平时在浏览器输入网页地址,就是给服务器发送了一个get请求,希望得到这个网页
HEAD
HEAD方法和GET类似,但是在服务器的响应中没有资源的内容,只有资源的一些基本信息。也就是说,我并不是需要服务器返回这个页面给我,而是查看下这页面的相关信息,例如文件类型,文件大小等等。主要用于
在不获取资源的情况下获取资源信息(类型、大小等)
通过状态码产看资源是否存在
通过查看首部,测试资源是否被修改了
PUT
和GET从服务器获取资源相反,PUT用于想服务器写入资源。PUT的语义就是让服务器用请求的主体部分创建一个请求URL命名的文档,如果存在就替换
当然处于安全原因,并不是所有的服务器都实现,当然最近大热的RESTful API使它有了用武之地
POST
POST用于想服务器发送数据,通常用来支持HTML的表单(input、select、textarea),表单中的数据会被发送到服务器
- 这里注意PUT和POST的区别:PUT是将一个网页放到服务器上去,也就是说,我传了一个资源上去,但是对于POST来说,我只提交一些信息给服务器,例如填写的表单的信息。
TRACE
客户端发送一个请求的时候,这个请求可能会穿过防火墙、代理、网关和一些其它应用程序,没个中间节点都可能修改HTTP请求,TRACE方法允许客户端在最终请求发往服务器的时候,看看它变成了什么样子
TRACE请求会在目的服务器端发送一个“闭环”诊断,行程最后一站服务器会弹回一条TRACE响应,并在响应主题中携带它收到的原始请求报文
DELETE
DELETE方法用于要求服务器删除请求的URL,和PUT一样,服务器可能会不支持
- 与PUT类似的,这两个方法是存在安全问题的,所以一般服务器并不会开放这两个方法,不可能让你随便发个方法的请求就让你删除资源。这里也要注意资源和信息的区别,我让一个网站删除我的账户和密码,这叫做删除信息,并不是删除资源,如果我要求删掉某个页面,这个才叫做删除资源。
OPTIONS
OPTIONS方法用于请求 web服务器告知其支持的各种功能
5.状态码200,301, 304,403,404,500,503分别代表什么意思?
- 200:表示请求成功,一切正常,对GET和POST请求的应答文档跟在后面。
- 301:客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。也就是常说的重定向。
- 304:客户端有缓存的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想要指定日期更新的文档)。服务器告诉客户,原来缓存的文档还可以继续使用。例如,当我们访问一个图片很多的网站,第一次需要加载时间,第二次很快,就是因为浏览器有缓存,也就是说,我们在请求这个图片的时候,服务器会对比请求的资源和服务器现有的资源,如果服务器的资源没有更新,那么服务器并不会返回这个资源,而是返回一个状态码304给浏览器,这样就可以实现资源的快速加载。
- 403:资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。有这个资源,但是你没有权限。
- 404:无法找到指定位置的资源。这也是一个常用的应答。
- 500:服务器遇到了意料不到的情况,不能完成客户的请求。比如后端的语法错误。
- 503:服务器由于维护或者负载过重未能应答。例如只能同时处理10个请求,你发了30个。
6.报文有哪几部分组成?
1.对报文进行描述的起始行 —— start line
2.包含属性的首部块 —— header
3.可选的包含数据的主体部分 —— body
请求报文的组成有四部分:
1.第一部分,请求行,格式为:动词 路径 协议名/版本号
2.第二部分,Headers部分,格式为键值对
3.第三部分,空行,分隔第二和第四部分
4.第四部分,消息体,例如账号密码等,格式在第二部分的Headers中指定响应报文的组成有四部分:
1.第一行,状态行,格式为:协议名/版本号 状态码 状态描述
2.第二行,Headers,格式为键值对
3.第三行,回车,分隔第二和第四部分
4.第四行,响应体
7.请求头的格式和作用是什么?给个范例截图说明?
作用:描述请求,说明请求的文件类型、语言等等
- Accept:说明浏览器可以接受的文件类型
- Accept-Encoding:浏览器能接收的数据压缩格式
- Accept-Language:告知服务器能够处理的语言
- Cache-Control:缓存控制
- Connection:客户端和服务器是否保持链接
- Cookie:存在客户端的键值对文本
- host:请求资源所在的主机名
- User-Agent:发送请求的应用程序名称,客户端信息
8.首部的格式和作用是什么?给个范例截图说明
-
通用首部
通用首部字段是指,请求报文和响应报文双方都会使用的首部字段。
首部 | 描述 |
---|---|
Connection | 客户端和服务器是否保持连接。因为HTTP是一种无状态的连接,也就是说,连接一次,发送完数据就要断开。不能像QQ聊天那样,随时点开就能聊而不是每次说话前要点一次连接。在HTTP/1.1,为了优化,加入了connection,有keep-alive这个属性,也就是说,完成了数据的传输,TCP连接断开,但相连的链路不要断开 |
Date | 日期,报文创建时间 |
Update | 给出了发送端可能想要升级使用新版本或协议。例如想使用websocket的时候,会有upgrade这一项,写明websocket |
Via | 显示了报文经过的中间节点(代理、网关) |
Trailer | 如果报文采用分块传输编码方式,可以利用这个首部列出位于报文trailer部分的首部集合 |
Trailer-Encoding | 告诉接收端对报文采用什么编码格式 |
Cache-Control | 随报文传送缓存指示 |
Pragma | 早期的随报文传送指示方式 |
- 请求首部
请求首部字段是从客户端往服务器端发送请求报文中所用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。
首部 | 描述 |
---|---|
Client-IP | 客户端IP |
From | 客户端邮件地址 |
Host | 接收请求的服务器的主机名和端口号 |
Referer | 提供了包含当前请求URI的文档的URL,告诉服务器自己来源。例如,我通过A网站上的一个链接点开了B网站,那么在B网站的请求中的referer就会记录A网站的url |
User—Agent | 发起请求的客户端应用程序 |
Accept | 告诉服务器能够发送那些媒体类型 |
Accept-Charset | 告诉服务器能够发送那些字符集 |
Accept-Encoding | 告诉服务器能够发送那些编码 |
Accept-Language | 告诉服务器能够发送那些语言 |
上面的几个accept都是为了向服务器说明客户端可以接受哪些格式的资源,这在一个网页有多版本的情况下适用,确保服务器发送的资源客户端是可以支持的 | |
Expect | 允许客户端列出请求所要求的服务器行为。虽然可以发送这种期望,但是服务器做不做是另一回事 |
If-Match | 如果ETag和文档当前ETag匹配,就获取文档。 |
If-Modified-Since | 除非在某个指定日期之后修改过,否则限制这个请求。这个是根据文件的修改时间来控制缓存 |
If-None-Match | 如果ETag和当前文档ETag不符合,获取资源。这里的Etag生成手段有很多种,哈希就是一种,哈希会将文档通过压缩生成一串码,在访问服务器的资源A时,会比较本地的资源和服务器的资源的哈希,来确定是否要发送新的资源给客户端 |
If-Range | 允许对文档否个范围内的条件请求 |
If-Unmodified-Since | 在某个指定日期之后没有修改过,否则现在请求 |
Cookie | 客户端字符串 |
- 响应首部
响应首部字段是由服务器端向客户端返回的报文。
首部 | 描述 |
---|---|
Age | 响应持续时间 |
Server | 服务器应用软件名称和版本 |
Allow | 列出了可用的请求方法 |
Location | 告诉客户端实际地址在哪里,用于定向。用于301、302重定向的时候,告诉客户端往哪里跳转 |
Content-Base | 解析主体中相对URL的基础URL |
Content-Encoding | 主体编码格式 |
Content-Language | 解析主体时适用的语言 |
Content-Length | 主体的长度或尺寸。就是我这个资源占多少容量 |
Content-Location | 资源实际位置 |
Content-MD5 | 主体的MD5校验和 |
Content-Range | 在整个资源中此实体部分的字节范围 |
Content-Type | 主体的MIME |
ETag | 主体的实体标记。相当于当客户端接受页面时,服务器根据一定的算法,由页面生成一个ETag码,然后跟页面一起缓存起来,当下次访问时,会跟服务器对比这个ETag,来决定下次的页面加载是用缓存还是重新加载 |
Expires | 过期时间。这个有缺陷,比较的时间是采用本地时间,如果本地时间不准或者时区问题,那么可能对比出问题 |
Last-Modified | 实体最后一次修改时间 |
9.主体的作用是什么?给个范例
主体就是服务器返回给客户端的资源
10.简述浏览器缓存是如何控制的
- Expires:规定缓存具体过期日期,超过这个时间值后,缓存的内容将失效,而在期限内无需再次请求。
- Cache-control
- Public,表示响应可被任何中间节点缓存
- Private,表示中间节点不允许缓存
- no-cache,表示不使用 Cache-Control的缓存控制方式做前置验证,而是使用 Etag 或者Last-Modified字段来控制缓存
- no-store,真正的不缓存任何东西。
- max-age,表示当前资源的有效时间,单位为秒。
- Last-modified和If-Modified-Since一起使用。Last-Modified 与If-Modified-Since都是用来记录页面的最后修改时间。当客户端访问页面时,服务器会将页面最后修改时间通过 Last-Modified 标识由服务器发往客户端,客户端记录修改时间,再次请求本地存在的cache页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的最后修改时间戳发送回去,服务器端通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。
-
Etags和If-None-Match使用。
ETag是HTTP1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证。它的原理是这样的,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过 ETag 返回给浏览器,浏览器把"3f80f-1b6-3e1cb03b" 和 A 同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: "3f80f-1b6-3e1cb03b" 的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器(200),如果发现A没有变化就给浏览器返回一个304未修改。这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端。