计算机网络——应用层
一. 应用层
为特定应用程序提供数据传输服务。协议有 HTTP、DNS、DHCP 等协议。数据传输单位是报文。
计算机的自动获取IP地址、自动获取DNS服务器地址,使用的就是DHCP协议(动态主机配置协议)。
二. DNS (域名系统)(端口号53)
DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。
域名到IP地址的解析过程: 将待解析的域名放在DNS请求报文中,以UDP用户数据报的方式发给本地域名服务器,端口号为53。使用UDP是为了减少开销,因为UDP不需要建立连接,而TCP需要建立连接,提供的是可靠的传输服务,增加了很多开销。
域名跟IP怎么对应的?怎么根据域名找IP?
- 通过域名系统DNS解析域名,就可以得到主机的IP地址
- cmd窗口 ping 域名 可以获取IP
三. HTTP(超文本传输协议)(端口号80)
概念:
- HTTP是面向事务的应用层协议。用来传送完成超文本跳转所必须的信息,也能传送互联网上的文本、图像等信息。
- HTTP使用了面向连接的TCP协议,保证了数据的可靠传输。
- HTTP协议本身是无连接、无状态的,也就是同一个客户第二次访问同一个服务器上的页面时,响应时间与第一次相同。HTTP无状态的特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。
- HTTP是面向文本的,因此在报文中的每个字段都是一些ASCII码串(读做askey)。它有两类报文:请求报文和响应报文。
HTTP/1.0 工作流程:
用户点击链接时,HTTP协议首先和服务器建立TCP连接,这里需要使用三次握手来建立连接,当经过一个RTT(往返时间)时间后,也就是三次握手的前两部分完成后,客户端就把HTTP请求报文作为三次握手的第三个报文的数据发给服务器。服务器收到HTTP请求报文后,就把请求的文档作为响应报文返回给客户。
缺点:对诸多链接的对象依次连接时,每请求一个文档就要有两倍的RTT开销,这种非持续连接会加重服务器的负担。
谈下你对 HTTP 长连接和短连接的理解?分别应用于哪些场景?
- HTTP/1.1 之前默认使用短连接。客户端每进行一次 HTTP 请求, 就建立一次连接,任务结束就中断连接。HTTP/1.1 开始默认使用长连接的,长连接只需要建立一次TCP连接就能进行多次HTTP通信。
- 长连接的好处:持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器的负载。另外,减少开销那部分时间,使HTTP请求和响应能够更早结束,可以提高Web页面显示速度。
四. HTTP报文结构
- 请求报文:从客户向服务器发送请求报文。
- 响应报文:从服务器到客户的回答。
HTTP请求报文和响应报文都是由 开始行、首部行、实体主体 三个部分组成。两种报文格式的区别是开始行不同。
- 开始行:用于区分是请求报文还是响应报文。请求报文中的开始行叫做请求行,响应报文中的开始行叫做状态行。三个字段之间用空格隔开,最后有个CR和LF,分别代表回车和换行。(下面详细介绍请求行和状态行)
- 首部行:用来说明浏览器、服务器和报文主体的一些信息,首部行可以有好几行,每行都有首部字段名和它的值,每行结束的地方也要有CR和LF。整个首部行结束时,还需要有个空行来将首部行和后面的实体主体分开。
- 实体主体:报文使用的不多。
五. 请求行
请求行有三个内容:方法、URL、HTTP版本。
方法: 常用的方法有:(HTTP请求有哪些?)
- GET:获取资源。
- POST:传输实体主体
- PUT:上传文件,但没有验证机制,存在安全问题。
- DELETE:删除文件,也没有验证机制,存在安全问题。
- HEAD:获取报文首部,不返回报文的实体主体部分。
- PATCH:对资源进行部分修改。(中文意思:补丁)
- OPTIONS:查询URL能够支持的方法。
- CONNECT:与代理服务器通信时建立隧道。
- TRACE:追踪通信路径。
六. 状态行
状态行有三个内容:HTTP版本、状态码、解释状态码的短语。
五大类状态码:
1xx:是信息状态码,表示接收的请求正在处理。
2xx:是成功状态码,表示请求正常处理完毕。
3xx:是重定向状态码,表示需要进行附加操作来完成请求。
4xx:是客户端错误状态码,表示服务器无法处理请求。
5xx:是服务器错误状态码,表示服务器失效,处理请求出错。
常见状态码:
- 100:表示目前为止正常,客户端可以继续发送请求或者忽略这个响应。(HTTP 1.1 新值的)
- 200:表示请求被成功处理。
- 204:表示请求已经成功处理,但返回的响应报文不包含实体主体。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
- 206:表示客户端进行了范围请求,响应报文包含指定范围的实体内容。
- 301:表示永久重定向。
- 302:表示临时重定向。
- 303:表示临时重定向,同时要求客户端采用 GET 方法获取资源。
- 304: 如果请求报文首部包含一些条件,比如:If-Match,If-None-Match,If-Modified-Since,If-Unmodified-Since,If-Range,如果不满足条件,则服务器会返回 304 状态码。
- 307: 表示临时重定向,同时要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
- 400:表示请求报文中存在语法错误。
- 401:表示请求需要有认证信息。
- 403:表示请求被拒绝。
- 404:表示无法找到对应资源。
- 405:表示请求中的方法被禁止。
- 412:表示先决条件失败。
- 500:表示服务器执行请求时发生错误。
- 503:表示服务器正忙,现在无法处理请求。
七. 常用的请求首部字段(HTTP请求头参数有哪些?)
HTTP 首部有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。
通用首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
请求首部字段名 | 说明 |
---|---|
Host | 告知服务器请求资源所在的主机名和端口号,HTTP1.1规定必须包含在请求首部字段内。 |
If-Match | If-Match 的字段值和请求资源的 ETag 值一致时,才会执行请求(200 OK),否则返回状态码 412 先决条件失败。 |
If-None-Match | If-None-Match 的字段值与请求资源的 ETag 值不一致时,才会执行请求。与 If-Match 作用相反。 |
If-Modified-Since | 请求资源在 If-Modified-Since 字段值指定的日期时间之后发生了更新,才能处理请求,否则返回状态码 304 Not Modified 。请求首部字段 If-Modified-Since 用于确认本地资源的有效性,实体首部字段 Last-Modified 用于获取资源最后的修改时间。 |
If-Unmodified-Since | 请求资源在 If-Unmodified-Since 字段值指定的日期时间之后未发生更新,才能处理请求,否则返回状态码 412 先决条件失败。与 If-Modified-Since 作用相反。 |
If-Range | If-Range 的字段值和请求资源的 ETag 值或时间一致时,作为范围请求来处理。否则返回全体资源。 |
Cookie | 服务器接收到的Cookie信息 |
响应首部字段名 | 说明 |
---|---|
ETag | 资源的匹配信息 |
Set-Cookie | 开始状态管理所使用的Cookie信息 |
实体首部字段名 | 说明 |
---|---|
Last-Modified | 资源最后的修改时间 |
八. Cookie
HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。HTTP/1.1 引入 Cookie 来保存状态信息。
用途:
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置)
- 浏览器行为跟踪(如跟踪用户行为)
创建过程:
- 服务器发送的响应报文包含 Set-Cookie 首部字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。
- 客户端之后对同一个服务器发送请求时,会从浏览器中取出 Cookie 信息并通过 Cookie 请求首部字段发送给服务器。
分类:
- 会话期 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。
- 持久性 Cookie:指定过期时间(Expires)或有效期(max-age)之后就成为了持久性的 Cookie。
作用域:
- Domain 标识指定了哪些主机可以接受 Cookie。
- Path 标识指定了主机下的哪些路径可以接受 Cookie。
HttpOnly: 标记为 HttpOnly 的 Cookie 不能被 JavaScript 脚本调用。
Secure: 标记为 Secure 的 Cookie 只能通过被 HTTPS 协议加密过的请求发送给服务端。
九. Session
除了可以将用户信息通过 Cookie 存储在用户浏览器中,也可以利用 Session 存储在服务器端,存储在服务器端的信息更加安全。
Session与Cookie的区别:
- Cookie和Session都是会话技术,Cookie运行在客户端,Session运行在服务器端。
- Cookie 只能存储 ASCII 码字符串,而 Session 则可以存储任何类型的数据,因此在考虑数据复杂性时首选 Session;
- Cookie 存储在浏览器中,容易被恶意查看。如果非要将一些隐私数据存在 Cookie 中,可以将 Cookie 值进行加密,然后在服务器进行解密;
- 对于大型网站,如果用户所有的信息都存储在 Session 中,那么开销是非常大的,因此不建议将所有的用户信息都存储到 Session 中。
十. 缓存
HTTP/1.1 通过 Cache-Control 首部字段来控制缓存。
1. 优点
- 缓解服务器压力;
- 降低客户端获取资源的延迟:缓存通常位于内存中,读取缓存的速度更快。并且缓存服务器在地理位置上也有可能比源服务器来得近,例如浏览器缓存。
2. 实现方法
- 让代理服务器进行缓存;
- 让客户端浏览器进行缓存。
3. 缓存验证
URL 不能唯一表示资源,比如 http://www.google.com/ 有中文和英文两个资源,只有 ETag 才能对资源进行唯一标识。
缓存验证有两种方式:ETag 和 Last-Modified
-
通过将缓存资源的 ETag 值放入 If-None-Match 首部,服务器收到该请求后,判断缓存资源的 ETag 值和资源最新的 ETag 值是否一致,如果一致则表示缓存资源有效,返回 304 Not Modified。
-
Last-Modified 首部字段也可以用于缓存验证,它表示服务器对资源的最后修改时间。但它只能精确到一秒,是一种弱校验器,所以通常作为 ETag 的备用方案。如果响应首部字段里含有这个信息,客户端可以在后续的请求中带上 If-Modified-Since 来验证缓存。请求资源在 If-Modified-Since 字段值指定的日期时间之后发生了更新,才能处理请求,否则返回状态码 304 Not Modified 。
十一. HTTPS(端口443)
HTTP 优点是连接简单、效率高,缺点:
- 使用明文进行通信,内容可能会被窃听;
- 不验证通信方的身份,通信方的身份有可能遭遇伪装;
- 无法证明报文的完整性,报文有可能遭篡改。
HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信,也就是 HTTPS 使用了隧道进行通信。通过使用 SSL,HTTPS 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
加密
对称**加密: 加密和解密使用同一的**。
- 优点:运算速度快;
- 缺点:无法安全地将**传输给通信方。
非对称**加密: 又称公开**加密,加密和解密使用不同的**。公开**所有人都可以获得,通信发送方获得接收方的公开**后,就可以使用公开**进行加密,接收方收到通信内容后使用私有**解密。
- 优点:可以更安全地将公开**传输给通信发送方;
- 缺点:运算速度慢。
HTTPS采用混合的加密方式: 使用非对称**加密用于传输对称**来保证传输过程的安全性,之后使用对称**加密来保证通信过程的效率。
认证(CA)
- 通过使用 证书 来对通信方进行认证。
- 数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。
- 进行 HTTPS 通信时,服务器会把证书发送给客户端。客户端取得其中的公开**之后,先使用数字签名进行验证,如果验证通过,就可以开始通信了。
完整性保护
-
SSL 提供报文摘要功能来进行完整性保护。
-
HTTP 也提供了 MD5 报文摘要功能,但不是安全的。例如报文内容被篡改之后,同时重新计算 MD5 的值,通信接收方无法意识到发生了篡改。
-
HTTPS 的报文摘要功能之所以安全,是因为它结合了加密和认证这两个操作。
HTTPS 的缺点
- 需要进行加密解密,因此速度会比较慢;
- 需要支付证书授权的高额费用。
十二. HTTP/2.0
HTTP/1.x 的缺陷: HTTP/1.x 实现简单是以牺牲性能为代价的
- 客户端需要使用多个连接才能实现并发和缩短延迟;
- 不会压缩请求和响应首部,从而导致不必要的网络流量;
- 不支持有效的资源优先级,致使底层 TCP 连接的利用率低下。
HTTP/2.0 新特性(二进制分帧层、服务端推送、首部压缩、多路复用 )。(2.0与1.x的区别)
二进制分帧层: HTTP/2.0 将报文分成 HEADERS 帧和 DATA 帧,它们都是二进制格式的。而 HTTP1.x 的解析是基于文本的。
服务端推送: HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 page.html 页面,服务端就把 script.js 和 style.css 等与之相关的资源一起发给客户端。而 HTTP 1.0 需要请求一次 html,然后再请求一次 css,然后再请求一 次 js。
首部压缩: HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 进行了首部压缩,而且要求客户端和服务器同时维护和更新一个之前见过的首部字段表,从而避免了重复传输。
多路复用: HTTP2.0 支持多路复用,同一个连接可以并发处理多个请求,方法是把 HTTP数据包拆为多个帧,并发有序的发送, 然后根据序号在另一端进行重组, 而不需要一个个 HTTP请求顺序到达。
HTTP1.0和HTTP1.1的区别:
- http1.0 需要 keep-alive 参数来告知服务器要建立一个长连接,而 http1.1 默认使用长连接,而且支持同时打开多个 TCP 连接
- HTTP1.1 支持只发送请求头而不发送请求体。 原因是先用请求头判断能否成功,若能成功再发数据,可以节约带宽,post 请求默认就是这样做的。
- HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了;HTTP1.1 则在请求头引入了 range头域,它允许只请求资源的某个部分,可以节约带宽。
- HTTP 1.1 新增状态码100,表示目前为止正常,客户端可以继续发送请求或者忽略这个响应。
- HTTP 1.1 支持流水线,可以在同一条长连接上连续发出请求,而不用等待响应返回,这样可以减少延迟。
HTTPS建立连接的过程?HTTPS的工作过程?
- 客户端向服务器端发起SSL连接请求
- 服务器向客户端发送公钥,并且服务器端保存着唯一的私钥
- 客户端收到公钥并用公钥对双方通信的对称秘钥进行加密,并发送给服务器端
- 服务器收到客户端发来的对称秘钥后,利用自己唯一的私钥对其进行解密,中间方无法对其解密,这样保证了对称秘钥在收发过程中的安全,此时,服务器端和客户端拥有了一套完全相同的对称秘钥。
- 然后进行数据传输,服务器和客户端用对称秘钥对数据进行加密解密,保证了数据收发过程中的安全,即使第三方获得数据包,也无法对其进行解密和篡改。
十三. GET 和 POST
- GET 用于获取资源,POST 用于传输实体主体。
- GET 的参数放在 url 中,POST 的参数放在实体主体中。
- GET 不会改变服务器端的数据,是安全的。POST 会更新服务器端的数据,是不安全的。
- GET 是幂等的,连续调用多次,客户端接收到的结果是一样的;POST 不是幂等的,如果调用多次,会增加多行记录。
- 对于 GET 方式的请求,浏览器会把请求头和请求体一并发送出去;而 POST 先发请求头,再发请求体,实际上是两次请求。