计算机网络--应用层(HTTP,DNS解析等)
文章目录
记录学习应用层重要协议,大家可以学习:王道考研,敖丙
DNS
我们在上网的时候,通常使用的是域名,而不是 IP 地址,因为域名方便人类记忆;
那么实现这一技术的就是 DNS 域名解析,DNS 可以将域名网址自动转换为具体的 IP 地址;
域名的层级关系
DNS 中的域名都是用句点来分隔的,比如 www.server.com
,这里的句点代表了不同层次之间的界限;
在域名中,越靠右的位置表示其层级越高;(从右往左依次就是,顶级域名 com,二级域名)
根域是在最顶层,它的下一层就是 com 顶级域,再下面是 server.com
所以域名的层级关系类似一个树状结构:
- 根 DNS 服务器
- 顶级域 DNS 服务器(com)
- 权威 DNS 服务器(server.com)
本地域名服务器:当一个主机发出 DNS 查询请求时,这个查询请求报文就发给本地域名服务器(不属于上述的域名服务器层次结构);
根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。
域名解析的工作流程
当浏览器进行地址访问时,首先查询本地的域名服务器的高速缓存,如果没有就向操作系统的缓存要,还没有就检查本机域名解析文件 hosts
,如果还是没有,就会向 DNS 服务器进行查询,查询的过程如下:
- 客户端首先会发出一个 DNS 请求,询问 www.server.com 的 IP ,并发给本地域名服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址);
- 本地域名服务器收到客户端的请求后,如果缓存里的表中能找到 www.server.com 则它直接返回 IP 地址,如果没有,本地 DNS 会去询问它的根域名服务器,根域名服务器是最高层次的,它不直接用于域名解析,但能通过域名返回本地域名服务器一个顶级域名服务器地址;
- 本地域名服务器收到顶级域名服务器的地址后,就会去顶级域名服务器中继续查询;
- 此时,顶级域名服务器会根据域名返回本地域名服务器对应的一个权威域名服务器地址;
- 于是本地域名服务器转向权威域名服务器进行 IP 地址的查询,此时,该权威域名服务器就会返回对应的 IP 地址;
- 本地域名服务器再将 IP 地址返回客户端,客户端和目标建立连接。
FTP
FTP 使用 TCP 进行连接,它需要两个连接来传送一个文件:
- 控制连接:服务器打开端口号 21 等待客户端的连接,客户端主动建立连接后,使用这个连接将客户端的命令传送给服务器,并传回服务器的应答。
- 数据连接:用来传送一个文件数据。
根据数据连接是否是服务器端主动建立,FTP 有主动和被动两种模式:
- 主动模式:服务器端主动建立数据连接,其中服务器端的端口号为 20,客户端的端口号随机,但是必须大于 1024,因为 0~1023 是熟知端口号。
- 被动模式:客户端主动建立数据连接,其中客户端的端口号由客户端自己指定,服务器端的端口号随机;
主动模式要求客户端开放端口号给服务器端,需要去配置客户端的防火墙。被动模式只需要服务器端开放端口号即可,无需客户端配置防火墙。但是被动模式会导致服务器端的安全性减弱,因为开放了过多的端口号。
ARP 解析 MAC 地址
在传输一个 IP 数据报的时候,确定了源 IP 地址和目标 IP 地址后,就会通过主机「路由表」确定 IP 数据包下一跳。然而,网络层的下一层是数据链路层,所以我们还要知道「下一跳」的 MAC 地址;
由于主机的路由表中可以找到下一条的 IP 地址,所以可以通过 ARP 协议,求得下一跳的 MAC 地址;
ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的;
- 主机会通过广播发送 ARP 请求,这个数据包中包含了想要知道的 MAC 地址的主机 IP 地址;
- 当同个链路中的所有设备收到 ARP 请求时,会去拆开 ARP 请求包里的内容,如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址填入 ARP 响应包返回给主机;
操作系统通常会把第一次通过 ARP 获取的 MAC 地址缓存起来,以便下次直接从缓存中找到对应 IP 地址的 MAC 地址;不过,MAC 地址的缓存是有一定期限的,超过这个期限,缓存的内容将被清除。
DHCP
DHCP 在生活中我们是很常见的了,我们的电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程;
DHCP 交互的 4 个步骤:
- 客户端首先发起 DHCP 发现报文(DHCP DISCOVER) 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的地址,所以使用的是 UDP 广播通信,其使用的广播目的地址是 255.255.255.255(端口 67) 并且使用 0.0.0.0(端口 68) 作为源 IP 地址。DHCP 客户端将该 IP 数据报传递给链路层,链路层然后将帧广播到所有的网络中设备。
- DHCP 服务器收到 DHCP 发现报文时,用 DHCP 提供报文(DHCP OFFER) 向客户端做出响应。该报文仍然使用 IP 广播地址 255.255.255.255,该报文信息携带服务器提供可租约的 IP 地址、子网掩码、默认网关、DNS 服务器以及 IP 地址租用期。
- 客户端收到一个或多个服务器的 DHCP 提供报文后,从中选择一个服务器,并向选中的服务器发送 DHCP 请求报文(DHCP REQUEST进行响应,回显配置的参数。
- 最后,服务端用 DHCP ACK 报文对 DHCP 请求报文进行响应,应答所要求的参数。
一旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用 DHCP 服务器分配的 IP 地址;
可以发现,DHCP 交互中,全程都是使用 UDP 广播通信;
HTTP
概述
HTTP,超文本传输协议,它的全英文名是 Hyper Text Transfer Protocol;
那么什么是超文本呢?
超文本
指的是 HTML,css,JavaScript 和图片等,HTTP 的出现是为了接收和发布 HTML 页面,经过不断的发展也可以用于接收一些音频,视频,文件等内容。
HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。
状态码概述
-
2xx
类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态- 「200 OK」是最常见的成功状态码,表示一切正常。如果是非
HEAD
请求,服务器返回的响应头都会有 body 数据; - 「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据;
- 「206 Partial Content」是应用于 HTTP 分块下载或断电续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态;
- 「200 OK」是最常见的成功状态码,表示一切正常。如果是非
-
3xx
类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向- 「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问;
- 「302 Moved Permanently」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问;
- 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制;
-
4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义- 「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误;
- 「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错;
- 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端;
-
5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码- 「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道;
- 「501 Not Implemented」表示客户端请求的功能还不支持,类似 “即将开业,敬请期待” 的意思;
- 「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误;
- 「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似 “网络服务正忙,请稍后重试” 的意思;
常见字段
- Host:客户端发送请求时,用来指定服务器的域名;
-
Content-Length 字段:服务器在返回数据时,会有
Content-Length
字段,表明本次回应的数据长度; - Connection 字段:最常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用;
- Content-Type 字段:用于服务器回应时,告诉客户端,本次数据是什么格式;
- Content-Encoding 字段:说明数据的压缩方法,表示服务器返回的数据使用了什么压缩格式;
GET 和 POST
-
Get
方法的含义是请求从服务器获取资源,这个资源可以是静态的文本、页面、图片视频等;POST
方法则是相反操作,它向URI
指定的资源提交数据,数据就放在报文的 body 里; -
GET 方法相对于 POST 是不安全的,因为在发送请求的过程中,请求参数会拼装在 URL 后面,从而导致容易被攻击者窃取;而 POST 方法是把参数放在请求体 body 中的,这对用户来说不可见;
-
GET 请求的 URL 有长度限制,而 POST 请求会把参数和值放在消息体中,对数据长度没有要求;
-
GET 请求在浏览器反复的
回退/前进
操作是无害的,而 POST 操作会再次提交表单请求;
请求的 HTTP 协议格式
GET 请求
主要的两部分:请求行,请求头;
-
请求行
- 请求方式,如:GET
- 请求资源路径,如:/book/1.html
- 请求的协议版本号,如:HTTP/1.1
-
请求头
- Accept:通知服务器,客户端可以接收的数据类型;
- Accept-Language:通知服务器,客户端可以接收的语言类型,如:zh_CN 中文中国,en_US 英文美国;
- Host:请求的服务器 IP 和端口号 PORT;
- User-Agent:表示客户端浏览器的信息;
POST 请求
主要的三部分:请求行,请求头和请求体;
-
请求行
- 请求方式,如:POST
- 请求资源路径,如:/book/1.html
- 请求的协议版本号,如:HTTP/1.1
- 请求头
- 空行
-
请求体
- 请求的数据
响应的 HTTP 协议格式
主要是三部分:响应行,响应头和响应体;
-
响应行
- 响应的协议和版本号,如:HTTP/1.1
- 响应状态码,如:200
- 响应状态描述符,如:OK
-
响应头
- Server:服务器信息
- Content-Type:响应体数据类型
- Content-Length:响应体长度
- Date:请求响应的时间(格林尼治时间)
- 响应体
HTTP 与 HTTPS
- HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题;HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 应用层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输;
- HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输;而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输;
- HTTP 的端口号是 80,HTTPS 的端口号是 443;
- HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的;
HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS
协议;
HTTPS 的工作原理
HTTPS 采用的是对称加密和非对称加密结合的「混合加密」方式;