网络-应用层
应用层
基础概念
应用层常见的协议
- 超文本传输:
HTTP、HTTPS - 文件传输:
FTP - 电子邮件:
SMTP、POP3、IMAP - 动态主机配置:
DHCP - 域名系统:
DNS
域名(Domain Name)
由于IP地址不方便记忆,并且不能表达组织的名称和性质,人们设计出了域名(比如baidu.com),但实际上,为了能够访问到具体的主机,最终还是得知道目标主机的IP地址。域名申请注册
如果干脆全程使用域名,不用IP地址会有什么问题?
IP地址是固定4个字节,域名随随便便都至少十几个字节,这无疑会增加路由器的负担,浪费流量
根据级别不同,域名可以分为:
- 顶级域名(
Top-level Domain, 简称TLD) - 二级域名
- 三级域名
- ...
顶级域名
通用顶级域名(General Top-level Domain,简称gTLD) 包括 .com(公司) .net(网络机构) .org(组织机构) .edu(教育) .gov(政府部门) .int(国际组织) 等
国家及地区顶级域名(Country Code Top-level Domain 简称 ccTLD) 包括 .cn(中国) .jp(日本) .uk(英国)
新通用顶级域名(New Generic Top-level Domain, 简称New gTLD) 包括 .vip .xyz .top .club .shop 等
二级域名
二级域名是指顶级域名之下的域名
- 在通用顶级域名下,它一般指域名注册人的名称,例如
google、baidu、microsoft - 在国家及地区的顶级域名下,它一般指注册类别的,例如
com、edu、gov、net等
DNS
DNS的全称是:Domain Name System,译为:域名系统- 利用
DNS协议,可以将域名(比如baidu.com) 解析成对应的IP地址(比如220.181.38.148) DNS可以基于UDP协议,也可以基于TCP协议,服务器占用53端口
DNS 服务器
- 客户端会首先访问最近的一台
DNS服务器(也就是客户端自己配置的DNS服务器) - 所有的
DNS服务器都记录了DNS根域名服务器(域名最后隐藏的".") 的IP地址 - 上级
DNS服务器记录了下一级DNS服务器的IP地址 - 全球一共
13台IPv4的DNS根域名服务器、25台IPv6的DNS根域名服务器
常用命令
ipconfig /displaydns : 查看DNS缓存记录
ipconfig /flushdns :清空DNS缓存记录
ping 域名
nslookup 域名
DHCP
DHCP(Dynamic Host Configuration Protocol),译为:动态主机配置协议DHCP协议基于UDP协议,客户端是68端口,服务器是67端口
DHCP服务器会从IP地址池中,挑选一个IP地址“出租”给客户端一段时间,时间到期就回收它们- 平时家里上网的路由器就可以充当
DHCP服务器
- 平时家里上网的路由器就可以充当
分配IP地址的4个阶段
DISCOVER: 发现服务器,发广播包(源IP是0.0.0.0,目标IP是255.255.255.255,目标MAC是FF:FF:FF:FF:FF:FF)
OFFER:提供租约,服务器返回可以租用的IP地址,以及租用期限、子网掩码、网关、DNS等信息,注意:这里可能会有多个服务器提供租约
REQUEST:选择IP地址,客户端选择一个OFFER,发送广播包进行回应
ACKNOWLEDGE:确认,被选中的服务器发送ACK数据包给客户端,至此IP地址分配完毕
细节
DHCP服务器可以跨网段分配IP地址么?(DHCP服务器、客户端不在同一个网段)
可以借助
DHCP中继代理(DHCP Relay Agent)实现跨网段分配IP地址
自动续约
客户端会在租期不足的时候,自动向
DHCP服务器发送REQUEST信息申请续约
常用命令
ipconfig /all :可以看到DHCP相关的详细信息,比如租约过期时间、DHCP服务器地址等
ipconfig /release:释放租约
ipconfig /renew:重新申请IP地址、申请续约(延长租期)
HTTP
HTTP(Hyper Text Transfer Protocol),译为超文本传输协议,是互联网中应用最广泛的应用层协议之一。设计HTTP最初的目的是:提供一种发布和接收HTML页面的方法,由URI来标识具体的资源,后面用HTTP来传递的数据格式不仅仅是HTML,应用非常广泛
HTML(Hyper Text Markup Language):超文本(不单单可以表达文本,还可以表达超过文本的信息)标记语言,用以编写网页
URI包含URL,可能是不完整的一个路径(相对路径),URL是完整路径
版本
- 1991年,HTTP/0.9
只支持
GET请求方法获取文本数据(比如HTML文档),且不支持请求头、响应头等,无法向服务器传递太多的数据
- 1996年,HTTP/1.0
支持
POST、HEAD等请求方法,支持请求头、响应头等,支持更多种数据类型(不再局限于文本数据),浏览器的每次请求都需要跟服务器建立一个TCP连接,请求处理完成后立即断开TCP连接
- 1997年,HTTP/1.1 (最经典、使用最广泛的版本)
支持
PUT、DELETE等请求方法,采用持久连接(Connection:Keep-alive),多个请求可以共用同一个TCP连接 (以前的请求是请求网页HTML要三次握手、四次挥手,如果网页里面有图片又要三次握手、四次挥手,现在是可以一次连接,传递完毕资源后再断开连接,或者根本不断开连接,直到关闭网页再关闭连接)
- 2015年,HTTP/2.0
- 2018年,HTTP/3.0
标准
-
HTTP的标准由万维网协会(W3C)、互联网工程任务组(IETE)协调制定,最终发布了一些了的RFC -
RFC (Request For Comments,可以译为:请求意见稿),
HTTP/1.1最早是在1997年的RFC_2068中记录的,该规范在1999年的RFC_2626中已作废,2014年又由RFC_7230系列的RFC取代。 -
HTTP/2标准于2015年5月以RFC_7540正式发表,取代HTTP/1.1成为HTTP的实现标准 -
中国的RFC
-
1996年3月,清华大学提交的适应不同国家和地区中文编码的汉字统一传输标准被IETF通过为RFC_1922,成为中国大陆第一个被认可为RFC文件的提交协议
报文格式
注意每个换行部分有一个回车和换行符,请求头和请求体之间也有回车和换行符
ABNF
ABNF是BNF(Backs-Naur Form,译为:巴科斯-瑙尔范式)的修改、增强版
在RFC_5234中表明:ABNF用作internet中通信协议的定义语言
ABNF是最严谨的HTTP报文格式描述形式,脱离ABNF谈论HTTP报文格式,往往都是片面、不严谨的
关于HTTP报文格式的定义
ABNF核心规则
ABNF表示的报文格式
URL的编码
URL中一旦出现了一些特殊字符(比如中文、空格),需要进行编码
在浏览器地址栏输入URL时,是采用UTF-8进行编码
请求方法
RFC 7231,section 4: Request methods:描述了8中请求方法
GET HEAD POST PUT DELETE CONNECT OPTIONS TRACE
RFC 5789,section 2: Patch method: 描述了PATCH方法
POST(增删改):常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)
GET(查) : 常用于读取的操作,请求参数直接拼接在URL的后面(浏览器对URL是有长度限制的)
HEAD:请求得到与GET请求相同的响应,但没有响应体
使用场景举例:在下载一个大文件前,先获取其大小,再决定是否要下载。以此可以节约带宽资源。
OPTIONS:用于获取目的资源所支持的通信选项,比如服务器支持的请求方法
PUT:用于对已存在的资源进行整体覆盖
PATCH:用于对资源进行部分修改(资源不存在,会创建新的资源)
DELETE:用于删除指定的资源
TRACE:请求服务器回显其收到的请求信息(发出什么就收到什么),主要用于HTTP请求的测试或诊断
CONNECT:可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel)
可以用来访问采用了SSL(HTTPS)协议的站点
头部字段
头部字段可以分为4种类型 (了解即可,主要看请求头和响应头)
请求头字段(Request Header Fields): 有关要获取的资源或客户端本身信息的消息头
响应头字段(Response Header Fields): 有关响应的补充信息,比如服务器本身(名称和版本等)的消息头
实体头字段(Entity Header Fields): 有关实体主体的更多信息,比如主体长度(Content-Length) 或其MIME类型
通用头字段(General Header Fields): 同时适用于请求和响应消息,但与消息主体无关的消息头
部分详解
请求体Origin 和 响应头Access-Control-Allow-Origin 用在跨域,受到同源策略(基于安全策略)影响,前端和后台要进行跨域处理
Cookie 和 Set-Cookie
Cookie: 在客户端(浏览器)存储一些数据,存储到本地磁盘(硬盘),服务器可以返回Cookie交给客户端去存储
Session:在服务器存储一些数据,存储到内存中(默认时长是30分钟)
状态码(Status Code)
在RFC 2616 10.Status Code Definitions规范中定义,状态码指示HTTP请求是否已成功完成
状态码可以分为5类:
- 信息响应:100~199
- 成功响应:200~299
- 重定向:300~399
- 客户端错误:400~499
- 服务器错误:500~599
常见状态码
- 100 Continue
请求的初始部分已经被服务器收到,并且没有被服务器拒绝。客户端应继续发送剩余的请求,如果请求已经完成,就忽略这个响应
- 200 OK
请求成功
- 302 Found
请求的资源被暂时的移动到了由
Location头部指定的URL上 (会进行重定向)
- 304 Not Modified
说明无需再次传输请求的内容,也就是说可以使用缓存的内容(服务器给回的响应体中没有数据,使用缓存资源)
- 400 Bad Request
由于语法无效,服务器无法理解该请求
- 401 Unauthorized
用于缺乏目标资源要求的身份验证凭证(网页中出现身份验证的弹框)
- 403 Forbidden
服务器端有能力处理该请求,但是拒绝授权访问
- 404 Not Found
服务端无法找到所请求的资源
- 405 Method Not Allowed
服务器禁止使用当前
HTTP方法的请求 (服务器可以处理GET方法,但是某个请求禁止了GET方法)
- 406 Not Acceptable
服务端无法提供与
Accept—Charset以及Accept-Laguage指定的值相匹配的响应
- 408 Request Timeout
服务器响应将没有在使用的连接关闭,一些服务器在空闲连接上发送此消息,即便是客户端没有发送任何请求的情况下
- 500 Internal Server Error
所请求的服务器遇到意外的情况,并阻止其执行请求(服务器宕机)
- 501 Not Implemented
请求的方法不被服务器支持,因此无法被处理,服务器必须支持的方法(即不会返回这个状态码的方法)只有
GET和HEAD
- 502 Bad Gateway
作为网关或代理角色的服务器,从上游服务器(如
tomcat)中接收的响应是无效的
- 503 Service Unavailable
服务器尚未处于可以接受请求的状态(通常造成这种情况的原因是由于服务器停机维护或者已超载)
表单(form)提交
常用属性
action:请求的URI
method:请求的方法 (GET、POST)
enctype:post请求时,请求体的编码方式
application/x-www-form-urlencoded(默认值)
- 用&分隔参数,用=分隔键和值,字符用URL编码方式进行编码,举例:
username=123&password=456(类似普通的post请求体格式)multipart/form-data
- 文件上传时候必须使用这种编码方式
multipart/form-data
参考RFC 1521
代理服务器(Proxy Server)
特点:本身不生成内容,处于中间位置转发上下游的请求和响应
- 面向下游的客户端:它是服务器
- 面向上游的服务器:它是客户端
正向代理、反向代理
正向代理:代理的对象是客户端
作用
- 隐藏客户端身份
- 绕过防火墙(突破访问限制)
- Internet访问控制
- 数据过滤
等等
反向代理:代理的对象是服务器
作用
- 隐藏服务器身份
- 安全防护
- 负载均衡
等等
抓包工具的原理
Fiddler、Charles等抓包工具的原理:在客户端启动了正向代理服务
需要注意的是Wireshark的原理是:通过底层驱动,拦截网卡上流过的数据
代理服务器- 相关的头部字段
CDN
CDN(Content Delivery Network 或 Content Distribution Network),译为:内容分发网络
- 利用最靠近每位用户的服务器
- 更快更可靠的将音乐、图片、视频等资源文件(一般是静态资源)传递给用户
使用CDN前后
- CDN运营商在全国、乃至全球的各个大枢纽城市都建立了机房,部署了大量拥有高存储带宽的节点,构建了一个跨运营商、跨地域的专用网络,* * 内容所有者向CDN运营商支付费用,CDN将其内容交付给最终用户
使用CDN前
使用CDN后
HTTPS
HTTPS (HyperText Transfer Protocol Secure),译为超文本传输安全协议,常称为HTTP over TLS、HTTP over SSL、HTTP Secure
由网景公司于1994年首次提出
HTTPS的默认端口号是443(HTTP是80)
现在在浏览器上输入 http://www.baidu.com
会自动重定向到 https://www.baidu.com
SSL/TLS
HTTPS是在HTTP的基础上使用SSL/TLS来加密报文,对窃听和中间人攻击提供合理的保护
SSL/TLS 也可以用在其他的协议上,比如
- FTP + SSL/TLS --> FTPS
- SMTP + SSL/TLS --> SMTPS
定义
SSL/TLS - 工作在哪一层
在应用层和传输层之间
OpenSSL
OpenSSL 是 SSL/TLS协议的开源实现,始于1998年,支持windows、Mac、Linux等平台
Linux、Mac一般自带OpenSSLWindows下载安装OpenSSL
常用命令
生成私钥、生成公钥
- 可以使用OpenSSL构建一套属于自己的CA,自己给自己颁发证书,称为“自签名证书”
HTTPS的成本
HTTPS的通信过程
TLS 1.2的连接
TLS 1.2的连接 - ①
TLS 1.2的连接 - ②
TLS 1.2的连接 - ③
TLS 1.2的连接 - ④
TLS 1.2的连接 - ⑤
TLS 1.2的连接 - ⑥
TLS 1.2的连接 - ⑦
TLS 1.2的连接 - ⑧
TLS 1.2的连接 - ⑨、⑩

浙公网安备 33010602011771号