计算机网络引言
-
OSI 七层模型
OSI参考模型的三个主要概念:服务、协议、接口
OSI七层模型(Open System Interconnection)参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议
七层模型传输数据过程:
-
TCP/IP 四层模型
- 物理层
物理层规定:为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,功能的和规范的特性,确保原始的数据可在各种物理媒体上传输,为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。
- 数据链路层
- 链路控制(同步,异步,二进制,HDLC)
- 差错控制(重发机制)
- 流量控制(窗口机制)
- 网络层
提供阻塞控制,路由选择(静态路由,动态路由)等
- IP:网际协议。IP协议提供不可靠、无连接的传送服务。IP协议的主要功能有:无连接数据报传输、数据报路由选择和差错控制。IP地址是重要概念
- ARP:地址解析协议。基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。以太网中的数据帧从一个主机到达网内的另一台主机是根据48位的以太网地址(硬件地址)来确定接口的,而不是根据32位的IP地址。内核必须知道目的端的硬件地址才能发送数据。P2P的连接是不需要ARP的
- RARP:反向地址转换协议。允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。局域网网关路由器中存有一个表以映射MAC和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器。
- IGMP:组播协议包括组成员管理协议和组播路由协议。组成员管理协议用于管理组播组成员的加入和离开,组播路由协议负责在路由器之间交互信息来建立组播树。IGMP属于前者,是组播路由器用来维护组播组成员信息的协议,运行于主机和和组播路由器之间。IGMP 信息封装在IP报文中,其IP的协议号为2
- ICMP:Internet控制报文协议。用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
- BGP: 边界网关协议。处理像因特网大小的网络和不相关路由域间的多路连接。
- RIP:路由信息协议。是一种分布式的基于距离矢量的路由选择协议。
- 传输层
提供分割与重组数据,按端口号寻址,连接管理差错控制和流量控制,纠错的功能。传输层要向会话层提供通信服务的可靠性,避免报文的出错、丢失、延迟时间紊乱、重复、乱序等差错。
- TCP: 一种面向连接的、可靠的、基于字节流的传输层通信协议。
- UDP: 用户数据报协议,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
- 应用层
- HTTP:超文本传输协议,基于TCP,是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少
- SMTP:简单邮件传输协议,是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式
- SNMP:简单网络管理协议,由一组网络管理的标准组成,包含一个应用层协议、数据库模型和一组资源对象。
- FTP:文件传输协议,用于Internet上的控制文件的双向传输。同时也是一个应用程序。
- Telnet:是Internet远程登陆服务的标准协议和主要方式。为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器
- SSH:安全外壳协议,为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议
- NFS:网络文件系统,是FreeBSD支持的文件系统中的一种,允许网络中的计算机之间通过TCP/IP网络共享资源。
-
五层结构
应用层:为用户的应用进程提供网络通信服务,例如,HTTP协议提供了Web文档的请求和传送,SMTP(邮件传送协议)提供了电子邮件的传送,还有DNS(域名解析协议)将http://202.108.22.5转换为对人友好的www.baidu.com。功能包括提供各种不同的应用协议以满足应用进程的需求,识别并证实目的通信方的可用性,使协同工作的应用进程之间进行同步,为通信过程申请资源
传输层:为相互通信的应用进程提供了逻辑通信,提供端到端的服务,即主机到主机。负责将应用层的报文向目的地传送,还要确保传输差错控制和流量控制。在因特网中,有两个传输协议,即TCP和UDP,可提供端到端的、可靠的或者不可靠的传输
网络层:分组选择合适的路由,把分组从从一台主机移动到另一台主机,具体功能包括寻址、路由选择、连接建立、保持和终止等
数据链路层:将在网络层交下来的数据报组装成帧(frame),两个相邻结点间的链路实现帧的传输,传输到下一个节点的目的主机的数据链路层又将数据报上传给网络层。功能包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等
物理层:在物理媒介上正确地、透明地传输比特流,在物理层中的协议与链路相关,并且需要确保原始的数据可在各种物理媒体上传输。比如以太网的许多物理层协议有和双绞铜线、同轴电缆、光纤,等等相关
第五层 应用层
-
HTTP 协议定义
定义:
HTTP 协议,又称超文本传输协议(HyperText Transfer Protocol),它是基于 TCP 协议的应用层传输协议,简单来说就是客户端(Web 浏览器)和服务端(网站服务器)进行数据传输的一种规则,是一种发布和接收 HTML 页面的方法。客户端给服务端发送 request,服务端返回 response
HTTP 协议的特征:
- HTTP是一种无状态协议, HTTP 协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持 HTTP 协议的简单性,从而能够快速处理大量的事务, 提高效率
- HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息
- HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务
-
HTTPS 协议定义
HTTPS(Hypertext Transfer Protocol Secure)是超文本传输安全协议,是由 HTTP+SSL 协议构建的可进行加密传输、身份认证的网络传输协议,数据传输过程是加密的,安全性较好,可以保护交换数据的隐私与完整性。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包
HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式:
- 1、TCP 三次同步握手
- 2、客户端验证服务器数字证书
- 3、DH 算法协商对称加密算法的密钥、hash 算法的密钥
- 4、SSL 安全加密隧道协商完成
- 5、网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改
-
HTTP 和 HTTPS 的区别
- HTTP 是超文本传输协议,信息是明文传输,数据传输过程是未加密的,安全性较差。HTTPS是超文本传输安全协议,是由 HTTP+SSL 协议构建的可进行加密传输、身份认证的网络传输协议,数据传输过程是加密的,安全性较好
- 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构)申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
- HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换3个包。而 HTTPS 除了 TCP 的三个包,还要加上 SSL 握手需要的9个包,所以一共是12个包。
- HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443
-
SSL 握手的过程
我们知道 TCP 的三次握手建立 TCP 连接,那SSL 握手是用于建立 SSL(Security Socket Layer)层的连接。SSL握手的场景很多,比如最常见的 HTTPS,访问 https:// www.baidu.com 时,在进行 HTTPS 的应用数据传递之前,需要建立SSL的连接
SSL 握手的步骤?
-
Client Hello
客户端发起会话,里面有以下两个信息最为重要
- 客户端随机数,用于生成主密钥
- 客户端支持的加密算法套件列表,协商ssl/tls协议版本等
-
Server Hello
服务端产生第一次应答,里面同样有两个信息很重要
- 服务端随机数,用于生成主密钥
- 确定密码套件
-
Certificate
服务端向客户端发送自己的证书,证书更多的是验证身份,其中包含了公钥,可用于RSA密钥交换算法的加密
-
Server Key Exchange
此处开始涉及到密钥交换算法,RSA不需要这步,而DH算法需要通过这步传递服务器公钥,并在客户端生成一个新的密钥对
-
Server Hello Done
一个空的指令,仅表示结束
-
Client Key Exchange
在#4中获得了服务端的公钥,会根据DH算法生成一个新的密钥对。客户端同样通过这个命令将密钥对里的客户端公钥发给服务端,仅限DH算法
-
客户端发送 Change Cipher Spec
这步是一个提示,相当于客户端告诉服务端,改为加密的传输方式。这里隐含了一个操作,就是主密钥生成了!主密钥需要客户端随机数(#1),服务端随机数(#2),前主密钥(由#4获取的服务端公钥和客户端用其生成的密钥对中的的私钥生成),这三者共同生成,计算的方式可能和确定的密码套件有关
-
客户端发送 Encrypted Handshake Message
此步直译就是加密的握手信息,即从上一步开始,信息全部是加密的了,之前为明文。所以这步也代表着客户端握手过程的结束。Encrypted Handshake Message 这个数据是显示不出来的,它是加密过的数据(预主秘钥),然后服务端拿到这个数据之后,要通过私钥解密才能拿到真正有用的东西。这就是 https 的握手过程,最后一条数据是加密的以此来保证整个传输的部分的内容是安全传输的,这样中间人拿不到,最后生成的密钥是两边知道但是中间人完全无法拿到和解析的,通过这种方式来保证最后的数据传输是真正的安全
-
服务端发送 Change Cipher Spec
服务端也通过生成的前主密钥(自己的私钥和#6发来的客户端的公钥)加客户端随机数加服务端随机数生成主密钥
-
服务端发送 Encrypted Handshake Message
-
-
HTTP 请求头报文格式
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,请求报文的一般格式:
GET /hello.txt HTTP/1.1 User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 Host: www.example.com Accept-Language: en, mi
-
请求头:常见请求方法
- Get 请求指定页面
- Head 用于获取报头,类似于get
- Post 向指定资源提交数据进行处理请求
- Put 修改资源
- Delete 删除资源
- Options 查看服务器性能
-
请求头:常见请求报头信息
Name Function Example Host 接受请求的服务器地址,可以是IP或者是域名 User-Agent 向服务器发送浏览器的版本、系统、应用程序的信息 Connection 指定与连接相关的属性 Keep_Alive Accept 向服务器申明客户端(浏览器)可以接受的媒体类型(MIME)的资源 text/html, application/xhtml+xml, application/xml Accept-Encoding 向服务器申明客户端(浏览器)接收的编码方法,通常为压缩方法 gzip, deflate, br Cache-control 控制浏览器的缓存,常见值为private、no-cache、max-age、alidate,默认为 private,根据浏览器查看页面不同的方式来进行区别 max-age=0 Accept-Language 向服务器申明客户端(浏览器)接收的语言 en-US, en, zh-CN Cookie 告诉服务器关于 Session 的信息,存储让服务器辨识用户身份的信息 -
请求头:辨析:GET 和 POST
- GET参数通过URL传递,POST放在Request body中
- GET比POST更不安全,因为参数直接暴露在URL上
- GET产生的URL地址可以被书签,而POST不可以
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
- GET请求会被浏览器主动cache,而POST不会
- GET在浏览器回退时是无害的,而POST会再次提交请求
- GET产生一个TCP数据包;POST产生两个TCP数据包
- GET请求在URL中传送的参数是有长度限制的,而POST没有
-
HTTP 响应头报文格式
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文
//状态行 HTTP/1.1 200 OK //消息报头 Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT ETag: "34aa387-d-1568eb00" Accept-Ranges: bytes Content-Length: 51 Content-Type: text/plain //空行 //响应正文 <html> <head> <title>This is homepage</title> </head> <body> <h1>Hello, world</h1> </body> </html>
-
响应头:常见响应消息报头
Server:服务器应用软件的名称和版本
Content-Type:响应正文的类型,默认为text/plain
Content-Length:响应正文的长度
Content-Charset:响应正文所使用的编码
Content-Encoding:响应正文使用的数据压缩格式
Content-Language:响应正文使用的语言
Allow 服务器支持哪些请求方法(如GET、POST等)。 Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。 Expires 应该在什么时候认为文档已经过期,从而不再缓存它? Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader(“Accept-Encoding”))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。 Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。 Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。 Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。 Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。 Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader(“Refresh”, “5; URL=http://host/path”)让浏览器读取指定的页面。注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV=“Refresh” CONTENT=“5;URL=http://host/path”>实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。注意Refresh的意义是"N秒之后刷新本页面或访问指定页面",而不是"每隔N秒刷新本页面或访问指定页面"。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV=“Refresh” …>。注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。 Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。 Set-Cookie 设置和页面关联的Cookie。Servlet不应使用response.setHeader(“Set-Cookie”, …),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。 WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader(“WWW-Authenticate”, “BASIC realm=\“executives\”")。注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问(例如.htaccess) -
响应头:响应头信息里的 content-type
**Content-Type:**标头表示后面响应正文里的文档属于什么MIME类型。
**MIME:**Multipurpose Internet Mail Extensions,是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
**意义:**浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理URL,因此 Web服务器在响应头中添加正确的 MIME 类型非常重要。如果配置不正确,浏览器可能会无法解析文件内容,网站将无法正常工作,并且下载的文件也会被错误处理
常见的 MIME 媒体格式类型如下:
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
以application开头的媒体格式类型:
- application/xhtml+xml :XHTML格式
- application/xml: XML数据格式
- application/atom+xml :Atom XML聚合格式
- application/json: JSON数据格式
- application/pdf:pdf格式
- application/msword : Word文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
- multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
-
响应头:完整状态码信息
- 1xx 信息,服务器收到请求,需要请求者继续执行操作
- 2xx 成功,操作被成功接收并处理
- 3xx 重定向,需要进一步的操作以完成请求
- 4xx 客户端错误,请求包含语法错误或无法完成请求
- 5xx 服务器错误,服务器在处理请求的过程中发生了错误
code 状态码英文名称 中文描述 100 Continue 继续。客户端应继续其请求 101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 200 OK 请求成功。一般用于GET与POST请求 201 Created 已创建。成功请求并创建了新的资源 202 Accepted 已接受。已经接受请求,但未处理完成 203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 206 Partial Content 部分内容。服务器成功处理了部分GET请求 300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI 303 See Other 查看其它地址。与301类似。使用GET和POST请求查看 304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 305 Use Proxy 使用代理。所请求的资源必须通过代理访问 306 Unused 已经被废弃的HTTP状态码 307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向 400 Bad Request 客户端请求的语法错误,服务器无法理解 401 Unauthorized 请求要求用户的身份认证 402 Payment Required 保留,将来使用 403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求 404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 405 Method Not Allowed 客户端请求中的方法被禁止 406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求 407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 408 Request Time-out 服务器等待客户端发送的请求时间过长,超时 409 Conflict 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息 412 Precondition Failed 客户端请求信息的先决条件错误 413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理 415 Unsupported Media Type 服务器无法处理请求附带的媒体格式 416 Requested range not satisfiable 客户端请求的范围无效 417 Expectation Failed 服务器无法满足Expect的请求头信息 500 Internal Server Error 服务器内部错误,无法完成请求 501 Not Implemented 服务器不支持请求的功能,无法完成请求 502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求 505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理 -
短连接和长连接 keep-alive
**短连接:**在 HTTP/1.0 中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次 HTTP 操作就建立一次连接,服务端发送完毕后会自动关闭连接。当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话 **长连接:**从 HTTP/1.1 起,默认使用长连接,可以使得客户端与服务端之间建立持续有效的连接,当出现后续请求时不必重新连接。使用长连接的HTTP协议,会在响应头有加入这行代码:Connection:keep-alive。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
-
有状态和无状态
(186条消息) 什么是Http协议无状态?怎么解决Http无状态_snobodyx的博客-CSDN博客_http无状态
http协议是无状态的:
关闭网页再次访问服务器,服务器不知道是你再次访问,即客户端进行用户名和密码认证登录,页面关闭后,下一次用户还得再发送一次请求来进行用户认证
-
HTTP 缓存
定义和作用:
HTTP 缓存是一种保存请求资源的副本并在下次请求中直接使用该副本的技术。当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有要请求的资源的副本,就可以直接从浏览器缓存中提取,而不是从原始服务器中提取这个资源。缓存能够节约网络资源,提升页面响应速度
HTTP 缓存策略分为两种:
- 强缓存:即强制直接使用缓存。强缓存不会向服务器发送请求,直接从缓存中读取资源,在 chrome 控制台的 network 选项中可以看到该请求返回 200 的状态码,并且 size 显示 from disk cache 或 from memory cache
- 协商缓存:和服务器协商确认下这个缓存能不能用。协商缓存会先向服务器发送一个请求,服务器会根据这个请求的 request header 的一些参数来判断是否命中协商缓存,如果命中,则返回 304 状态码并带上新的 response header 通知浏览器从缓存中读取资源
请求缓存的过程:
- 第一次请求资源时,服务器返回资源,并在 response header 头中回传资源的缓存参数
- 第二次请求时,浏览器判断这些请求参数
- 命中强缓存就直接从缓存中读取资源,返回 200
- 如果没有命中强缓存,就把请求参数加到 request header 头中传给服务器,根据请求头的 last-modified 和 etag 判断是否命中协商缓存,如果命中协商缓存则返回 304,直接从缓存获取资源
- 如果强缓存和协商缓存都没有命中,则直接从服务端获取资源,返回 200
-
控制 HTTP 缓存的响应头和请求头
CASE1 强缓存:
强缓存可以通过设置 Expires 和 Cache-Control 两种响应头实现,浏览器直接读本地缓存,不会再跟服务器端交互,状态码 200
-
Expires 响应头:是 HTTP/1.0 的产物,代表该资源的过期时间,其值为一个绝对时间。它告诉浏览器在过期时间之前可以直接从浏览器缓存中存取数据。由于是个绝对时间,客户端与服务端的时间时差或误差等因素可能造成客户端与服务端的时间不一致,将导致缓存命中的误差。如果在 Cache-Control 响应头设置了 max-age 或者 s-max-age 指令,那么 Expires 会被忽略
Expires: Wed, 21 Oct 2015 07:28:00 GMT
-
Cache-Control 响应头:出现于 HTTP/1.1。可以通过指定多个指令来实现缓存机制。主要用来表示资源缓存的最大有效时间。在该时间段内,客户端可以直接使用缓存。而且其过期时间指令的值是相对时间,它解决了绝对时间的带来的问题。优先级高于 Expires
Cache-Control: max-age=315360000 // Cache-Control有很多属性,不同的属性代表的意义也不同 //可缓存性 public 表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存。 private 表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它) no-cache 不使用强缓存,需要与服务器验协商缓存验证。 no-store 缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存 //过期 max-age=<seconds> 缓存存储的最大周期,超过这个周期被认为过期 s-maxage=<seconds> 设置共享缓存。会覆盖max-age和expires,私有缓存会忽略它 max-stale[=<seconds>] 客户端愿意接收一个已经过期的资源,可以设置一个可选的秒数,表示响应不能已经过时超过该给定的时间 min-fresh=<seconds> 客户端希望在指定的时间内获取最新的响应 //重新验证和重新加载 must-revalidate 如页面过期,则去服务器进行获取。 proxy-revalidate 与must-revalidate 作用相同,但是用于共享缓存。 //其他 only-if-cached 不进行网络请求,完全只使用缓存。 no-transform 不得对资源进行转换和转变。例如,不得对图像格式进行转换。
CASE2 协商缓存:
协商缓存由 Last-Modified/IfModified-Since,Etag/If-None-Match 实现,每次请求需要让服务器判断一下资源是否更新过,从而决定浏览器是否使用缓存,如果是,则返回 304,否则重新完整响应
- Last-Modified/IfModified-Since:它们的值都是 GMT 格式的时间字符串,代表的是文件的最后修改时间。1. 在服务器在响应请求时,会通过 Last-Modified 告诉浏览器资源的最后修改时间。2. 浏览器再次请求服务器的时候,请求头会包含 Last-Modified 字段,后面跟着在缓存中获得的最后修改时间。 3. 服务端收到此请求头发现有 if-Modified-Since,则与被请求资源的最后修改时间进行对比,如果一致则返回 304 和响应报文头,浏览器只需要从缓存中获取信息即可。如果已经修改,那么开始传输响应一个整体,服务器返回:200 OK
- Etag/If-None-Match:Etag 都是服务器为每份资源生成的唯一标识,就像一个指纹,资源变化都会导致 ETag 变化,跟最后修改时间没有关系,ETag 可以保证每一个资源是唯一的。在浏览器发起请求,浏览器的请求报文头会包含 If-None-Match 字段,其值为上次返回的 Etag 发送给服务器,服务器接收到次报文后发现 If-None-Match 则与被请求资源的唯一标识进行对比。如果相同说明资源没有修改,则响应返 304,浏览器直接从缓存中获取数据信息。如果不同则说明资源被改动过,则响应整个资源内容,返回状态码 200
- Etag 优先级高与 Last-Modified
-
-
浏览器缓存
-
Cookie
什么是cookie?
HTTP协议本身是无状态的,即服务器无法判断用户身份。如果要实话客户端和服务器端的会话保持,那就需要其它机制来实现。Cookie 实际上是一小段文本信息,由 key-value 的格式组成。客户端向服务端发起请求时,如果服务器需要记录该用户状态,就使用 response 向客户端浏览器颁发一个 Cookie,客户端浏览器会把 Cookie 保存起来,当浏览器再请求该网站时,浏览器把请求的信息连同该 Cookie 一起提交给服务器,服务器检查该 Cookie,以此来辨认用户状态
Cookie 名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取 Cookie 中包含信息,借此维护用户跟服务器会话中的状态
第一次访问并登录一个网站时,Cookie的设置以及发送会经历4个步骤
- 客户端发送一个 HttpRequest 请求到服务器
- 服务器发送一个 HttpResponse 响应到客户端,其中包含了 Set-Cookie 的头部
- 客户端保存 Cookie 之后向服务器发送请求时,HttpRequest 请求包含一个Cookie 的头部
- 服务器返回 HttpResponse 响应数据
Cookie 的特征:
- cookie是在服务端创建,保存在浏览器这一端,每次请求会携带与当前服务相关的键值对数据
- cookie的生命周期可以通过 cookie.setMaxAge(2000),如果不设置生命周期,cookie的生命周期当浏览器关闭时就消亡
- cookie可以被多个浏览器共享,一个web应用可以保存多个cookie,但保存在同一个cookie文本在客户端浏览器下
- cookie存放时候是以明文方式存放,因此安全性较低,数据存储在浏览器中容易被暴露,被获取,不能存储敏感数据。可以通过加密后存放。
-
Cookie 字段的内容
Cookie 由以下字段组成:
- Name:cookie 的名称
- Value:cookie 的值,对于认证 cookie,value 值包括 web 服务器所提供的访问令牌
- Size:cookie 的大小
- Path:可以访问此 cookie 的页面路径。比如 domain 是 abc.com,path是 /test,那么只有 /test 路径下的页面可以读取此 cookie。
- Secure:指定是否使用 HTTPS 安全协议发送 Cookie。使用 HTTPS 安全协议,可以保护 Cookie 在浏览器和 Web 服务器间的传输过程中不被窃取和篡改。该方法也可用于 Web 站点的身份鉴别,即在 HTTPS 的连接建立阶段,浏览器会检查 Web 网站的 SSL 证书的有效性。但是基于兼容性的原因(比如有些网站使用自签署的证书)在检测到 SSL 证书无效时,浏览器并不会立即终止用户的连接请求,而是显示安全风险信息,用户仍可以选择继续访问该站点
- Domain:可以访问该 cookie 的域名,Cookie 机制并未遵循严格的同源策略,允许一个子域可以设置或获取其父域的 Cookie。当需要实现单点登录方案时,Cookie 的上述特性非常有用,然而也增加了 Cookie 受攻击的危险,比如攻击者可以借此发动会话定置攻击。因而,浏览器禁止在 Domain 属性中设置 org.com 等通用顶级域名、以及在国家及地区顶级域下注册的二级域名,以减小攻击发生的范围
- HTTP:该字段包含 HTTPOnly 属性,该属性用来设置 cookie 能否通过脚本来访问,默认为空,即可以通过脚本访问。在客户端是不能通过 js 代码去设置一个httpOnly 类型的 cookie 的,这种类型的 cookie 只能通过服务端来设置。该属性用于防止客户端脚本通过 document.cookie 属性访问 Cookie,有助于保护 Cookie不被跨站脚本攻击窃取或篡改。但是,HTTPOnly的应用仍存在局限性,一些浏览器可以阻止客户端脚本对 Cookie 的读操作,但允许写操作。此外大多数浏览器仍允许通过 XMLHTTP 对象读取 HTTP 响应中的 Set-Cookie头
- Expires/Max-size:此 cookie 的超时时间。若设置其值为一个时间,那么当到达此时间后,此 cookie 失效。不设置的话默认值是 Session,意思是 cookie 会和 session 一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此 cookie 失效
-
Session
什么是 Session?
跟 Cookie 一样,由于 HTTP 无状态的特性,如果要实话客户端和服务器端的会话保持,那就需要其它机制来实现。Session 是存放在服务器端,来存放用户数据的。
当浏览器第一次发送请求时,服务器自动生成了一个 Session 和一个 Session ID 用来唯一标识这个 Session,并将其通过 HttpResponse 发送到浏览器
当浏览器第二次发送请求,会将前一次服务器响应中的 Session ID 放在请求中一并发送到服务器上,服务器从请求中提取出 Session ID,并和保存的所有 Session ID 进行对比,找到这个用户对应的 Session
Session 的客户端实现形式(即Session ID的保存方法)? 有三种方法,浏览器提供了两种方式来保存,第三种是程序员使用 html 隐藏域的方式自定义实现:
- 使用 Cookie 来保存。这是最常见的方法,网站上的 “记住我的登录状态” 功能的实现就是基于这种方式的。服务器通过设置 Cookie 的方式将 Session ID 发送到浏览器。如果我们不设置这个过期时间,那么这个 Cookie 将不存放在硬盘上,当浏览器关闭的时候,Cookie 就消失了,这个 Session ID 就丢失了。如果我们设置这个时间为若干天之后,那么这个 Cookie 会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同样会发送到服务器上
- 使用URL附加信息的方式。比如 /path?SESSIONID=1234,这种方式和前面不设置 Cookie 过期时间是一样的
- 在页面表单里面增加隐藏域。这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据
-
Token
产生背景:
Session 和 Cookie 机制来保持会话,会存在一个问题:客户端浏览器只要保存自己的 SessionID 即可,而服务器却要保存所有用户的 Session 信息,这对于服务器来说开销较大,而且不利用服务器的扩展,比如服务器集群时,Session 如何同步存储就是个问题。于是就有人思考,如果把 Session 信息让客户端来保管而且无法伪造或许就可以解决这个问题了,进而有了Token机制
什么是 Token:
Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 便将此 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次带上用户名和密码
作用机制:
服务器并不保存 Token,而是通过数据签名的方法,对数据用算法(如SHA-256)与私钥进行签名后作为 Token,当 Token 发送给服务器时,服务会通过相同的算法与密钥进行签名,如果和 Token 中的签名相同,服务器就知道用户已经登录过了,并且可以直接得到用户的 userID,相当于服务器用cpu的计算时间来换取了储存空间
-
Cookie 和 Session 的合作运行机制
- 第一次请求时,首先将用户名和密码发送给服务器,第一次请求不会带 Cookie,因为服务器还没有设置 Cookie
- 服务器核对,如果确认密码正确则身份验证成功
- 服务器创建 Session 对象,包含 Session ID(没有规律的字符串,随机产生),会话过期时间(如果我们不设置这个过期时间,那么这个 Cookie 将不存放在硬盘上,当浏览器关闭的时候,Cookie 就消失了,这个 Session ID 就丢失了。如果我们设置这个时间为若干天之后,那么这个 Cookie 会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同样会发送到服务器上),其他参数等等。这个创建的 session 对象保存在服务器,用于记录客户状态,比如保存客户的基本信息、权限等
- 服务器通过设置 Cookie 的方式将 Session ID 发送到浏览器
- 浏览器拿到 Cookie,并在 value 里面保存 Session 的 Session ID
- 客户端每次访问该网站都要带上这个由 Session ID 组成的 Cookie
- 服务器收到请求,首先拿到客户端的 Session ID,判断 Session ID 是否存在,进行验证。然后从服务器内存中查询它所代表的客户端 (用户名,用户组,有哪些权限等)
- 在登出以及超过设置的会话时间时候,浏览器的 Cookie 就会被删除,需要重新登录
-
Cookie 和 Seesion 的联系和区别
联系:
- 由于 http 协议是无状态的,服务器需要记录用户的状态,所以 cookie 和 session 都是用来保持状态的方案
- session 依赖 cookie,因为 session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效,但是也可以通过其它方式实现,比如在 url 中传递 session_id
区别:
- 储存位置:cookie储存在浏览器,session储存在服务器
- 安全性:session比cookie更加安全,cookie容易造成cookie欺骗,用户验证这种场合一般会用 session
- 存储的数据类型不同:cookie只支持字符串数据,session是object类型
- 有效期不同:cookie存活时间可设置较长时间,而session存活时间相对较短,服务端关闭等都会丢失session
- 存储大小不同:单个cookie的数据不能超过4KB,session储存的数据内容可以更大,但是session过多会占用更多的服务器资源
-
JWT (Jason Web Tooken) 身份认证
(186条消息) Cookie、Session以及Token的区别 以及身份认证 保持登录状态_ADRIANWOH的博客-CSDN博客
JWT(JSON Web Token),本质就是一个字符串,作用是用来在用户和服务器之间传递安全可靠的信息,在目前前后端分离的开发过程中,使用 token 鉴权机制用于身份验证是比较常见和安全的方案,总的流程是:
- 服务器当验证用户账号和密码正确的时候,给用户颁发一个令牌,这个令牌作为后续用户访问一些接口的凭证
- 后续访问会根据这个令牌判断用户时候有权限进行访问
主要在网络应用中传递一些小批量安全数据时使用,它是一个紧凑并且安全的token。
和普通token比较
相同点:都是可以访问资源的令牌,都可以记录用户信息,都只能在验证成功后获取信息。
不同点:服务器验证时,普通token要在数据库进行数据的查询,而jwt验证token只用在服务端使用密钥验证
Token,分成了三部分,头部(Header)、载荷(Payload)、签名(Signature),并以.进行拼接。其中头部和载荷都是以JSON格式存放数据,只是进行了编码
由三部分组成,中间由点分开
header:头部—–>生成签名的算法
payload:负载—–>用户的信息
signature:签名—–>将header和payload通过base64编码后进行算法(header中声明的算法)运算得到签名信息
认证机制:
1.用户第一次登录网页 服务器生成一个jwt(服务器不保存) 服务器保存生成jwt的签名密文
2.把jwt发送给浏览器(web应用通常使用cookie和local storage存储;app则使用app自己的存储机制存储)
3.浏览器每次发送请求都带上这个jwt
4.服务器通过hear中声明的算法结合hearder和payload进行算法运算得到签名信息与signature进行匹配认证
用app自己的存储机制存储)
3.浏览器每次发送请求都带上这个jwt
4.服务器通过hear中声明的算法结合hearder和payload进行算法运算得到签名信息与signature进行匹配认证
(187条消息) JWT详解_baobao555#的博客-CSDN博客_jwt
JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。JWT的认证流程如下:
首先,前端通过Web表单将自己的用户名和密码发送到后端的接口,这个过程一般是一个POST请求。建议的方式是通过SSL加密的传输(HTTPS),从而避免敏感信息被嗅探 后端核对用户名和密码成功后,将包含用户信息的数据作为JWT的Payload,将其与JWT Header分别进行Base64编码拼接后签名,形成一个JWT Token,形成的JWT Token就是一个如同lll.zzz.xxx的字符串 后端将JWT Token字符串作为登录成功的结果返回给前端。前端可以将返回的结果保存在浏览器中,退出登录时删除保存的JWT Token即可 前端在每次请求时将JWT Token放入HTTP请求头中的Authorization属性中(解决XSS和XSRF问题) 后端检查前端传过来的JWT Token,验证其有效性,比如检查签名是否正确、是否过期、token的接收方是否是自己等等 验证通过后,后端解析出JWT Token中包含的用户信息,进行其他逻辑操作(一般是根据用户信息得到权限等),返回结果
-
Authentication 和 Authorization 的区别
authentication 是身份鉴别,意思就是确认你的身份是你
authorization 是授权,在确认你的身份之后对你进行授权,token,sso
-
HTTP/1.x 和 HTTP/2.x 和 HTTP/3.0
HTTP1.0、HTTP1.1 和 HTTP2.0 的区别 - 掘金 (juejin.cn)
http1.x 和http2.x主要有以下4个区别:
-
HTTP2使用的是二进制传送,HTTP1.X是文本(字符串)传送
二进制传送的单位是帧和流,帧组成了流,同时流还有流ID标示
-
HTTP2支持多路复用
因为有流ID,所以通过同一个http请求实现多个http请求传输变成了可能,可以通过流ID来标示究竟是哪个流从而定位到是哪个http请求
-
HTTP2头部压缩
HTTP2通过gzip和compress压缩头部然后再发送,同时客户端和服务器端同时维护一张头信息表,所有字段都记录在这张表中,这样后面每次传输只需要传输表里面的索引Id就行,通过索引ID查询表头的值
-
HTTP2支持服务器推送
HTTP2支持在未经客户端许可的情况下,主动向客户端推送内容
http 3:
QUIC (Quick UDP Internet Connections), 快速 UDP 互联网连接,QUIC是基于UDP协议的。
-
线头阻塞(HOL)问题的解决更为彻底:
基于TCP的HTTP/2,尽管从逻辑上来说,不同的流之间相互独立,不会相互影响,但在实际传输方面,数据还是要一帧一帧的发送和接收,一旦某一个流的数据有丢包,则同样会阻塞在它之后传输的流数据传输。而基于UDP的QUIC协议则可以更为彻底地解决这样的问题,让不同的流之间真正的实现相互独立传输,互不干扰
-
切换网络时的连接保持:
当前移动端的应用环境,用户的网络可能会经常切换,比如从办公室或家里出门,WiFi断开,网络切换为3G或4G。基于TCP的协议,由于切换网络之后,IP会改变,因而之前的连接不可能继续保持。而基于UDP的QUIC协议,则可以内建与TCP中不同的连接标识方法,从而在网络完成切换之后,恢复之前与服务器的连接 总结:基于UDP和应用层实现了TCP协议
-
-
HTTP 和 socket 的区别
http 为短连接:客户端发送请求都需要服务器端回送响应,请求结束后主动释放链接。通常的做法是,不需要任何数据,也要保持每隔一段时间向服务器发送"保持连接"的请求。这样可以保证客户端在服务器端是"上线"状态。
Socket为长连接:通常情况下 Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通讯双方开始互发数据内容,直到双方断开连接。在实际应用中,由于网络节点过多,在传输过程中,会被节点断开连接,因此要通过轮询高速网络,该节点处于活跃状态
-
URI = URL + URN
URI 是什么
URI 统一资源标识符,是 Uniform Resource Identifier 的缩写,是一个用于标识互联网资源名称的字符串,通过使用位置,名称或两者来标识Internet上的资源
URL 和 URN 都是 URI 的子集,URI 属于 URL 更高层次的抽象,一种字符串文本标准。URI 的最常见的形式是 URL (统一资源定位符),经常指定为非正式的网址。不常见的用法是 URN (统一资源名称),其目的是通过提供一种途径,用于在特定的命名空间资源的标识,以补充网址
URL 是什么
URL 统一资源定位符,是 Uniform Resource Locator 的缩写,URI 表示请求服务器的路径,定义这么一个资源。而 URL 同时说明要如何访问这个资源
一个完整的 URL 分为4部分:
- 协议:例 Http、Https
- 域名:例 www.baidu.com 为网站名字,baidu.com 为一级域名,www是服务
- 端口:不填写的话默认走的是80端口号
- 路径:http://www.baidu.com/path1/path2,其中 / 表示根目录
- 查询参数:http://www.baidu.com/path1/path2?name=“man”(查询参数可有可无)
-
当打开一个浏览器输入 URL 到请求道页面的整个过程 ⭐
简述:
- DNS解析:将域名转化为 IP 地址
- TCP连接:与服务器建立连接
- 发送HTTP请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 连接结束
详细:
- 输入地址,浏览器查找域名的 IP 地址
- 在发送请求之前浏览器和服务器建立 TCP 的三次握手
- 浏览器向该 IP 地址的 web 服务器发送一个 HTTP 请求
- 判断是否是 HTTP 缓存,如果是强制缓存且在有效期内,不再向服务器发请求,如果是协商缓存向后端发送请求且和后端服务器对比,在有效期内,服务器返回304,直接从浏览器获取数据,如果不在有效期内服务器返回200,返回新数据。如果请求的参数有问题,服务器端返回404,如果服务器端挂了返回500
- 如果数据一切正常,当浏览器拿到服务器的数据之后,开始渲染页面同时获取 HTML 页面中图片、音频、视频、CSS、JS的资源,在这期间如果获取到 JS 文件之后,会直接执行 JS 代码,阻塞浏览器渲染(因为渲染引擎和 JS 引擎互斥,不能同时工作,所以通常把 Script 标签放在 body 标签的底部)。渲染过程就是先将 HTML 转换成 dom 树,再将 CSS 样式转换成 stylesheet,根据 dom 树和 stylesheet 创建布局树,对布局树进行分层,为每个图层生成绘制列表,再将图层分成图块,紧接着光栅化将图块转换成位图,最后合成绘制生成页面
- 连接结束
-
DNS 协议以及概念
DNS(Domain Name Service)就是域名解析协议,是因特网中的一项核心服务,是用于实现域名和IP地址相互映射,使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,得到该主机名对应的IP地址的过程叫做域名解析。将域名映射成 IP 地址称为正向解析,将 IP 地址映射成域名称为反向解析
IP 地址:一长串能够唯一地标记网络上的计算机的数字,IP 地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,因此设计出了域名
域名:又称网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)比如 www.baidu.com。域名结构是树状结构,树的最顶端代表根服务器,根的下一层从上到下依次为顶级域名(com)、二级域名(baidu)、三级域名(wwww)..
计算机中DNS记录在本地有两种缓存方式:
- 浏览器缓存:浏览器在获取网站域名的实际 IP 地址后会对其进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的 DNS 缓存时间,如 Chrome 的过期时间是 1 分钟,在这个期限内不会重新请求 DNS
- 操作系统缓存:操作系统的缓存其实是用户自己配置的 hosts 文件。比如 Windows10 下的 hosts 文件存放在 C:\Windows\System32\drivers\etc\hosts
具体 DNS 查询的方式有两种:
-
递归查询
-
迭代查询:所谓迭代就是,如果请求的接收者不知道所请求的内容,那么接收者将扮演请求者,发出有关请求,直到获得所需要的内容,然后将内容返回给最初的请求者。通俗点来说,在递归查询中,如果 A 请求 B,那么 B 作为请求的接收者一定要给 A 想要的答案。而迭代查询则是指,如果接收者 B 没有请求者 A 所需要的准确内容,接收者 B 将告诉请求者 A,如何去获得这个内容,但是自己并不去发出请求。一般来说,域名服务器之间的查询使用迭代查询方式,以免根域名服务器的压力过大
-
DNS 正向解析过程
将域名服务器之间的 DNS 查询请求过程和域名缓存结合起来,就是一个完整的 DNS 协议进行域名解析的过程。以正向解析为例(域名解析成 IP 地址):
- 首先搜索浏览器的DNS缓存,缓存中维护一张域名与IP地址的对应表。若没有命中,则继续搜索操作系统的 DNS 缓存
- 若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的 DNS 缓存,查找成功则返回结果(主机和本地域名服务器之间的查询方式是递归查询)
- 若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行查询,通过以下方式进行迭代查询(注意:本地域名服务器和其他域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大):
- 首先本地域名服务器向根域名服务器发起请求,根域名服务器是最高层次的,它并不会直接指明这个域名对应的 IP 地址,而是返回顶级域名服务器的地址,也就是说给本地域名服务器指明一条道路,让他去这里寻找答案
- 本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求,获取权限域名服务器的地址
- 本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
- 本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
- 操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来
- 至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起来
-
DNS 资源记录类型
记录名 中文名 作用 A、AAAA 主机记录 说明一个域名对应的IP是多少,它是域名和IP地址的对应关系。Ipv4使用的是A记录,ipv6使用的是AAAA记录 NS Name Server域名服务器记录 说明这个区域有哪些DNS服务器负责解析 SOA Start of Authority 起始授权机构记录 说明负责解析的DNS服务器中哪一个是主服务器 MX Mail Exchanger 邮件交换记录 主要用于邮件服务器DNS交互,帮助电子邮件正确到达邮件服务器 Cname Canonical Name别名记录 用于为当前区域之外的资源提供别名 Pointer 指针记录 是A记录的逆向记录,作用是把IP地址解析为域名 SRV Service服务器资源记录 说明一个服务器能够提供什么样的服务 |
-
DNS 劫持
DNS(域名系统)劫持又叫域名劫持,指攻击者利用其他攻击手段,篡改了某个域名的解析结果,使得指向该域名的IP变成了另一个IP,导致对相应网址的访问被劫持到另一个不可达的或者假冒的网址,从而实现非法窃取用户信息或者破坏正常网络服务的目的
DNS(域名系统)的作用是把网络地址(域名,以一个字符串的形式)对应到真实的计算机能够识别的网络地址(IP地址),以便计算机能够进一步通信,传递网址和内容等
怎么防止DNS劫持攻击?
1、建议使用复杂的密码重置路由器的默认密码。
2、使用DNS注册器时使用双因素身份验证,并修补路由器中存在的所有漏洞以避免危害。
3、最好远离不受信任的网站,避免下载任何免费的东西。
4、如果您已被感染,建议删除HOSTS文件的内容并重置Hosts File。
5、为防止DNS劫持,始终建议使用良好的安全软件和防病毒程序,并确保定期更新软件。
6、安全专家建议使用公共DNS服务器。
7、最好定期检查您的DNS设置是否已修改,并确保您的DNS服务器是安全的
第四层 传输层
-
TCP/IP 协议
TCP/IP协议是一个面向连接的网络传输协议,对互联网中各部分进行通信的标准和方法进行了规定。TCP/IP传输协议的目的是,保证网络数据信息及时、完整传输
TCP/IP 协议不仅仅指的是 TCP 和 IP 两个协议,而是指一个由 FTP、SMTP、TCP、UDP、IP 等协议构成的协议簇,TCP 协议和 IP 协议最具代表性,所以被称为 TCP/IP 协议,TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中
- 应用层:主要协议有 Telnet、FTP、SMTP 等,是用来接收来自传输层的数据或者按不同应用要求与方式,将数据传输至传输层
- 传输层:主要协议有 UDP、TCP,是使用者使用平台和计算机信息网内部数据结合的通道,可以实现数据传输与数据共享
- 网络层:主要协议有 ICMP、IP、IGMP,主要负责网络中数据包的传送等
- 数据链路层:主要协议有ARP、RARP,主要功能是提供链路管理错误检测、对不同通信媒介有关信息细节问题进行有效处理等
-
TCP 报文格式
TCP 报文由首部和数据两部分组成。首部一般由 20-60 Byte 构成,长度可变。其中前 20B 格式固定,后 40B 是可选的
- 源端口号(Source Port):长度为16位,指明发送数据的进程
- 目的端口号(Destination Port):长度为16位,指明目的主机接收数据的进程。
- 序列号(Sequence Number):长度为32位,序号用来标识从TCP发送端向接入端发送的数据字节流进行编号,可以理解成对字节流的计数
- 确认号(Acknowledgement Number):长度为 32 位,确认号包含发送确认的一端所期望收到的下一个序号。确认号只有在 ACK 标志为1时才有效
- 首部长度:长度为4位,用于表示TCP报文首部的长度。用4位(bit)表示,十进制值就是[0,15],一个TCP报文前20个字节是必有的,后40个字节根据情况可能有可能没有。如果TCP报文首部是20个字节,则该位应是20/4=5
- 保留位(Reserved):长度为 6 位,必须是 0,它是为将来定义新用途保留的
- 标志(Code Bits):长度为 6 位,在 TCP 报文中不管是握手还是挥手还是传数据等,这 6 位标志都很重要。6 位从左到右依次为:
- URG:紧急标志位,说明紧急指针有效
- ACK:确认标志位,多数情况下空,说明确认序号有效
- PSH:推标志位,置位时表示接收方应立即请求将报文交给应用层
- RST:复位标志,用于重建一个已经混乱的连接
- SYN:同步标志,该标志仅在三次握手建立TCP连接时有效
- FIN:结束标志,带该标志位的数据包用于结束一个TCP会话
- 窗口大小(Window Size):长度为 16 位,TCP 流量控制由连接的每一端通过声明的窗口大小来提供
- 检验和(Checksum):长度为 16 位,该字段覆盖整个 TCP 报文端,是个强制性的字段,是由发送端计算和存储,到接收端后,由接收端进行验证
- 紧急指针(Urgent Pointer)长度为16位,指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效
- 选项(Options):长度为0-40B(字节),必须以4B为单位变化,必要时可以填充0。通常包含:最长报文大小(MaximumSegment Size,MSS)、窗口扩大选项、时间戳选项、选择性确认(Selective ACKnowlegement,SACK)等
- 数据
-
TCP 三次握手
发生在客户端想要与服务端建立连接的时候,所谓三次握手,是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个报文
三次握手的过程:
- 第一次握手:客户端将 TCP 报文标志位 SYN 置为1,随机产生一个序列号值 seq=J,保存在 TCP 首部的序列号字段里,并指明客户端打算连接的服务器的端口,并将该数据包发送给服务器端,发送完毕后,客户端进入 SYN_SENT 状态,等待服务器端确认
- 第二次握手:服务器端收到数据包后由标志位 SYN=1 可以知道客户端请求建立连接,服务器端将 TCP 报文标志位 SYN 和 ACK 都置为 1,把报文的确认位 ACK 设置为 J+1,随机产生一个序列号值 seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态
- 第三次握手:客户端收到确认后,检查确认位 ACK 是否为 J+1,标志位 ACK 是否为 1,如果正确则将确认位 ACK 置为 K+1,将标志位 ACK 置为 1,并将该数据包发送给服务器端
- 最后,服务器端检查确认位 ACK 是否为 K+1,标志位 ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入 ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了
三次握手的目的:
建立安全可靠的连接,对服务端而言,两次握手是不够的,三次之后两边都知到自己可以发送,又可以接收。防止已失效的连接请求报文段突然又传到了服务端,产生错误
为什么不是两次:
在服务端对客户端的请求进行回应(第二次握手)后,就会理所当然的认为连接已建立,而此时有可能客户端并没有收到服务端的回应。此时,客户端仍认为连接未建立,服务端会对已建立的连接保存必要的资源,如果大量的这种情况,服务端会崩溃。
-
TCP 四次挥手
四次挥手的目的
TCP 是全双工模式,客户端请求关闭连接,不再发送数据了,但是可以接收服务端的数据。第一次挥手时,当服务端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉客户端,“你发的 FIN 报文我收到了”,然后等到我服务端所有的报文都发送完了,我才发送 FIN 报文。故需要四次挥手。只有当服务端不再发送数据了,才算关闭,这样减小了丢失数据的风险
四次挥手的过程
- 第一次挥手:Client 端发起挥手请求,向 Server 端发送标志位是 FIN=1 的 TCP 报文段,设置序列号 seq=k,此时,Client 端进入 FIN_WAIT_1 状态,这表示 Client 端没有数据要发送给 Server 端了。
- 第二次分手:Server 端告诉 Client 端,我确认并同意你的关闭请求,过程是 Server 端收到了 Client 端发送的 FIN=1 报文段,向 Client 端返回一个标志位是 ACK=1 的报文段,确认位 ack 设为 seq=k+1,Client 端进入 FIN_WAIT_2 状态
- 第三次分手:Server 端向 Client 端发送标志位是 FIN=N 的报文段,请求关闭连接,同时 Client 端进入 LAST_ACK 状态。
- **第四次分手:**Client 端收到 Server 端发送的 FIN 报文段,向 Server 端发送标志位是 ACK=1 的报文段,然后 Client 端进入 TIME_WAIT 状态。Server 端收到 Client 端的 ACK=1 报文段以后,就关闭连接。此时,Client 端等待 2MSL ****的时间后依然没有收到回复,则证明 Server 端已正常关闭,那好,Client 端也可以关闭连接了(MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间)
-
TCP 协议为什么可靠
- 确认和重传机制:建立连接时三次握手连接机制是确认重传流量控制的基础,传输过程中如果校验失败,丢包或延时,发送端重传
- 数据排序:TCP有专门的序列号字段,可提供数据 reorder
- 流量控制:TCP窗口会指明双方能够发送接收的最大数据量
- 拥塞控制:TCP滑动窗口机制。TCP建立连接时,各端分配一个缓冲区用来存储接受的数据,并将缓冲区的尺寸发送给另一端,接收方发送的确认消息中包含了自己剩余的缓冲区尺寸,剩余缓冲区空间的数量叫做窗口,所谓滑动窗口,就是接收端可以根据自己的状况通告窗口大小,从而控制发送端的接收,进行流量控制.
-
TCP 的滑动窗口机制
TCP中窗口大小是指tcp协议一次传输多少个数据。因为TCP是一个面向连接的可靠的传输协议,既然是可靠的就需要传输的数据进行确认。TCP窗口机制有两种,一种是固定窗口大小,另一种是滑动窗口。数据在传输时,TCP会对所有数据进行编号,发送方在发送过程中始终保持着一个窗口,只有落在发送窗口内的数据帧才允许被发送;同时接收方也始终保持着一个接收窗口,只有落在窗口内的数据才会被接收。这样通过改变发送窗口和接收窗口的大小就可以实现流量控制
-
基于 TCP 的应用层协议
协议 全称 默认端口 HTTP HyperText Transfer Protocol(超文本传输协议) 80 FTP File Transfer Protocol (文件传输协议) 20用于传输数据,21用于传输控制信息 SMTP Simple Mail Transfer Protocol (简单邮件传输协议) 25 TELNET Teletype over the Network (网络电传) 23 SSH Secure Shell 22 这些协议都是基于(C/S client/server)模式的,需要保证其传输的可靠性,所以需要在客户端和服务器端建立可靠的TCP连接
-
基于 UDP 的应用层协议
协议 全称 默认端口 DNS Domain Name Service (域名服务) 53 TFTP Trivial File Transfer Protocol (简单文件传输协议) 69 SNMP Simple Network Management Protocol (简单网络管理协议) 通过UDP端口161接收,只有Trap信息采用UDP端口162 NTP Network Time Protocol (网络时间协议) 123 都是需要即使通信的,关注实时性
-
应用层的 DNS 使用的是 TCP 还是 UDP?
DNS 协议可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。但大多数情况下 DNS 都使用 UDP 进行传输。都用,但实际上是根据需要传输的 payload 大小来决定使用 udp 还是 tcp
UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送。通常传统的UDP报文一般不会大于512字节
DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议
一、DNS在区域传输的时候使用TCP协议:
- 辅域名服务器会定时(一般3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,会执行一次区域传送,进行数据同步。区域传送使用TCP而不是UDP,因为数据同步传送的数据量比一个请求应答的数据量要多得多。
- TCP是一种可靠连接,保证了数据的准确性
二、域名解析时使用UDP协议:
- 客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过三次握手,这样DNS服务器负载更低,响应更快。理论上说,客户端也可以指定向DNS服务器查询时用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包
-
辨析:TCP 和 UDP
区别如下:
- TCP 面向连接(如打电话要先拨号建立连接),UDP 是无连接的,即发送数据之前不需要建立连接
- TCP 提供可靠的服务,UDP 不可靠。通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达,UDP尽最大努力交付,不保证可靠交付
- TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流。UDP 是面向报文的,应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文
- TCP 协议有流量控制和拥塞控制,UDP 没有。因此 UDP 网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
- TCP 连接只能是点到点的,UDP支持一对一,一对多,多对一和多对多的交互通信
- TCP 首部开销20字节,UDP的首部开销小,只有8个字节
- TCP 的逻辑通信信道是全双工的可靠信道,UDP 则是不可靠信道
故 TCP 协议传输质量高,UDP 协议有较好的实时性
TCP 和 UDP 的应用:
-
辨析:HTTP 和 TCP
HTTP 协议是建立在请求/响应模型上的,第一步就是由客户建立一条与服务器的TCP链接,所以 HTTP 是基于 TCP 的
-
介绍一下 websocket
websocket 是一种网络通信协议,是HTML5 开始提供的一种在单个 TCP 连接上进行全双工通信的协议,这个对比着 http 协议来说,http 协议是一种无状态的、无连接的、单向的应用层协议,通信请求只能由客户端发起,服务端对请求做出应答处理。http 协议无法实现服务器主动向客户端发起消息,Websocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接,就可以一直保持连接状态
第三层 网络层
-
网络层功能概述
负责通过路由选择算法,为报文或分组通过通信子网选择最适当的路径
该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
一般地,数据链路层是解决同一网络内节点之间的通信,而网络层主要解决不同子网之间的通信。例如在广域网之间通信时,必然会遇到路由(即两节点间可能有多条路径)选择问题
-
寻址算法
数据链路层中使用的物理地址(如MAC地址)仅解决网络内部的寻址问题。在不同子网之间通信时,为了识别和找到网络中的设备,每一子网中的设备都会被分配一个唯一的地址。由于各子网使用的物理技术可能不同,因此这个地址应当是逻辑地址(如IP地址)
-
IP 地址的 ABCD 类是怎么划分的
A类地址的表示范围是:0.0.0.0-126.255.255.255,默认网络掩码为:255.0.0.0,A类地址分配给规模特别大的网络使用
B类地址表示范围是:128.0.0.0-191.255.255.255,默认网络掩码为欸:255.255.0.0,B类地址分配给一般的中型网络
C类地址的表示范围是192.0.0.0-223.255.255.255,默认网络掩码是:255.255.255.0,C类地址分配给小型网络,如局域网
D类地址称为广播地址,共特殊协议向选定的节点发送信息使用
-
ARP 协议 地址解析协议
简单的说就是:根据IP地址获取物理地址,也就是MAC地址的一个TCP/IP协议
在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。OSI模式把网络工作分为七层,彼此不直接打交道,只通过接口(layre interface). IP地址在第三层(网络层), MAC地址在第二层(数据链路层)。协议在发送数据包时,首先要封装第三层(IP地址)和第二层 (MAC地址)的报头, 但协议只知道目的节点的IP地址,不知道其物理地址,又不能跨第二、三层,所以得用ARP的服务拿到MAC地址
原理:主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存
-
如何判断有效的IP地址
-
子网掩码
背景:
互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。IP 地址在设计时就考虑到地址分配的层次特点,将每个 IP 地址都分割成网络号和主机号两部分,以便于 IP 地址的寻址操作。IP 地址的网络号和主机号各是多少位呢?如果不指定,就不知道哪些位是网络号、哪些是主机号,这就需要通过子网掩码来实现。
作用:
子网掩码的作用,总的来说,就是将某个 IP 地址划分成网络地址和主机地址两部分
子网掩码是一个32位地址,与 IP 地址配合使用,用于屏蔽 IP 地址的一部分,可以看出有多少位是网络号,有多少位是主机号,从而区别网络标识和主机标识,并说明该 IP 地址是在局域网上,还是在远程网上,可以判断两个IP在不在一个局域网内部
192.168.0.19 子网掩码是:255.255.255.0 C类IP 网络ID:192.168.0 主机ID:19 129.158.79.68 子网掩码是:255.255.0.0 B类IP 网络ID:129.158 主机ID:79.68 18.129.12.185 子网掩码是:255.0.0.0 A类IP 网络ID:18 主机ID:129.15.185
对于A类地址来说,默认的子网掩码是 255.0.0.0
对于B类地址来说,默认的子网掩码是 255.255.0.0
对于C类地址来说,默认的子网掩码是 255.255.255.0
-
路由算法
路由算法:当源节点和目的节点之间存在多条路径时,本层可以根据路由算法,通过网络为数据分组选择最佳路径,并将信息从最合适的路径由发送端传送到接收端。
第二层 数据链路层
-
数据链路的基本概念
链路:网络中两个节点之间的物理通道,链路的传输介质主要有双绞线、光纤和微波
数据链路:网络中两个节点之间的逻辑通道,把实现控制数据传输协议的硬件和软件加到链路上就构成数据链路
帧 frame:链路层的协议数据单元,封装网络层的数据报
-
逻辑链路层DLC & 介质访问控制层MAC
数据链路层分为逻辑链路层(Data Link Control),和介质访问控制层(Mutiple Access Control)两个子层
- DLC是上层,负责建立和维护网络连接,执行差错校验、流量控制和链路控制,还为帧分配序列并跟踪确认
- MAC是下层,解决共享型网络中多用户对信道竞争的问题,完成网络介质的访问控制
-
三种差错控制方法
差错的类型有:噪声、帧错、位错
针对位错(1变成0,0变成1)的差错控制方法有:
- 检错编码:奇偶校验码、循环冗余码CRC
- 纠错编码:海明码
-
三个基本链路层协议
- **停止等待协议:**每发送完一个分组就停止发送,等待对方确认,在收到确认后再发送下一个分组,可以防止丢包的问题。优点是简单,缺点是信道利用率太低。发送
- 滑动窗口协议1 后退N帧协议 GBN:
- 滑动窗口协议2 选择重传协议 SR:
发送窗口大小 接受窗口大小 停等 =1 =1 后退N帧 >1 =1 选择重传 >1 =1 -
两种介质访问控制方法
- 争用型介质访问控制,又称随机型的介质访问控制协议,如 CSMA/CD
- 确定型介质访问控制,又称有序的访问控制协议,如 Token
-
划分信道的两种方法
- 静态划分信道:信道划分介质访问控制。频分多路复用FDM,时分多路复用TDM,波分多路复用WDM,码分多路复用CDM
- 动态分配信道:信道并非在用户通信时固定分配给用户
- 轮询访问介质访问控制:令牌传递协议
- 随机访问介质访问控制:
- ALOHA协议:不监听信道,不按时间槽发送,随机重发
- CSMA协议
- CSMA/CD协议
- CSMA/CA协议
-
MAC地址和IP地址
一个是物理地址,一个是逻辑地址
IP地址含有两个部分,一个是网络地址,一个是主机地址。因此,通过对方的IP地址,是可以判断出对方是否和本机在一个网络。假设两点在一个网络内,只需要MAC地址就可以了。
如果不在一个网络内,本机的网络层就认为数据应该发送给网关。
电脑缓存里有一张ARP表,该表主要有两列:一列是IP地址,另外一列是MAC地址。这张表是随着网卡收到网络中的各种通信数据,不断学习增加的。
如果ARP表中有网关IP地址对应的MAC地址,则问题就转化为网内数据发送,上面已经讲的很清楚了。如果ARP表中没有网关IP地址对应的MAC地址,则启动ARP协议,即向网内广播,询问该IP地址的MAC地址。广播询问的结果是网关收到广播后,发现是问自己的MAC地址,所以就回复询问方自己的MAC地址。然后数据发给网关的问题,也转化为网内数据发送
-
拥塞控制和流量控制
拥塞控制:防止过多的数据冲垮网络,使路由器或链路不至于过载
流量控制:为了不让发送端的速度超过接收端的接受速率,通过改变滑动窗口大小
-
滑动窗口的原理
第一层 物理层
-
三种通信方式
单工通信:只有一个方向的通信,仅需要一条信道
半双工通信:通信的双方都可以发送和接受信息,但任何一方都不能同时发送和接受,需要两条信道
全双工通信:通信的双方都可以发送和接受信息,需要两条信道
-
数字信号&模拟信号
信号:数据的电气/电磁的表现,是数据在传输过程中的存在形式
数字信号:代表消息的参数取值是离散的
模拟信号:代表消息的参数取值是连续的
-
奈氏准则和香农定理
-
四种编码与调制方式
-
数字数据编码为数字信号
- 非归零编码:高1低0
- 曼彻斯特编码:前一个间隔为低电平后一个间隔为高电平表示1
- 差分曼彻斯特编码:若前半个码元的电平与上一个码元的后半个码元的电平相同,则为1,反之则为0
- 反向不归零编码:信号电平反转表示0,信号电平不反转表示1
- 归零编码
-
数字数据调制为模拟信号
调幅、调频、调相
-
模拟数据编码为数字信号
抽样、量化、编码
-
模拟数据调制为模拟信号
频分复用技术
-