- 本文主要介绍网站请求流程中所用到的协议DNS,HTTP和DHCP相关概念和作用。
#应用层协议
- 常见的应用层协议:
- 超文本传输:HTTP、HTTPS
- 文件传输:FTP
- 电子邮件:SMTP、POP3、IMAP
- 动态主机配置:DHCP
- 域名系统:DNS
#域名
背景
- 由于IP地址不方便记忆,并且不能表达组织的名称和性质,人们设计出了 域名(如baidu.com)
- 但实际上,为了能够访问到具体的主机,最终还是得知道目标主机的IP地址
- 域名申请注册:https://wanwang.aliyun.com/
- 直接使用域名至少需要十几个字节,会增加路由器负担,浪费流量。
域名的级别和分类
- 顶级域名(Top-lever 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 等
- 通用顶级域名(General Top-level Domain,简称 gTLD)
- 二级域名(顶级域名下的域名)
- 在通用顶级域名下,它一般指域名注册人的名称,例如 google、baidu、microsoft 等
- 在国家及地区顶级域名下,它一般指注册类别的,例如 com、edu、gov、net 等
- 顶级域名(Top-lever Domain 简成TLD)
#DNS服务器和常用命令
简介
DNS的全称是:Domain Name System,译为:域名系统
利用DNS协议,可以将 域名(比如baidu.com) 解析成对应的 IP地址(比如220.181.38.148)
DNS可以基于UDP协议(大多数),也可以基于TCP协议,服务器占用53端口
DNS解析流程
- DNS服务器先访问最近的一台DNS服务器(就是是客户端自己配置的DNS服务器,也叫做本地DNS服务器)
- 所有的DNS服务器都记录了DNS根域名服务器的IP地址
- 上级DNS服务器记录了下级DNS服务器的IP地址
- 全球一共13台IPv4的DNS根域名服务器,25台IPv6的DNS根域名服务器
DNS 常用命令
ipconfig /displaydns
查看DNS缓存记录ipconfig /flushdns
清空DNS缓存记录ping 域名
ping 域名会自动解析DNSnslookup 域名
主动解析DNS
#IP地址的分配
静态IP地址
- 手动设置
- 适用场景: 不需要挪动的台式机(学校机房的台式机),服务器等
动态IP地址
- DHCP服务器自动获取IP地址
- 适用场景: 移动设备、无线设备等
DHCP(DISCOVER OFFER REQUEST ACKNOWLEDGE)动态主机配置协议
DHCP 是基于UDP协议的,客户端是68端口,服务器是67端口(双方端口固定)
DHCP服务器会从IP地址池中,挑选一份IP地址“出租”给客户端一段时间,时间到期就会回收
平时家里上网的路由器就可充当DHCP服务器。
DHCP的分配IP的四个阶段
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数据包给客户端
DHCP一些细节
- DHCP服务器是可以跨网段的,通过借助DHCP中继代理(DHCP Replay Agent)实现跨网段分配IP地址
- 客户端会在租期不足时,自动向DHCP服务器发送REQUEST信息申请续约
- 一些常用命令
ipconfig /all
:可以看到DHCP相关的详细信息,比如租约过期时间、DHCP服务器地址等ipconfig /release
:释放租约ipconfig /renew
:重新申请IP地址、申请续约(延长租期)
#HTTP协议
HTTP简介
超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。
后来HTTP协议传递的数据格式不仅仅是HTML,还包括图片,音频等,应用非常广泛。
HTTP是超文本标记语言。
- 1991年,HTTP/0.9
- 只支持GET请求方法获取文本数据(比如HTML文档),且不支持请求头、响应头等,无法向服务器传递太多信息
- 1996年,HTTP/1.0
- 支持POST、HEAD等请求方法,支持请求头、响应头等,支持更多种数据类型(不再局限于文本数据)
- 浏览器的每次请求都需要与服务器建立一个TCP连接,请求处理完成后立即断开TCP连接
- 1997年,HTTP/1.1(最经典、使用最广泛的版本)
- 支持PUT、DELETE等请求方法
- 采用持久连接(Connection: keep-alive),多个请求可以共用同一个TCP连接
- 2015年,HTTP/2.0
- 2018年,HTTP/3.0
- 1991年,HTTP/0.9
HTTP的标准
- 由万维网协会(W3C)、互联网工程任务组(IETF)协调制定,最终发布了一系列的RFC(Request For Comments,可以译为:请求意见稿)
相关补充
URI与URL区别
- URI统一资源标志符(英语:Uniform Resource Identifier,缩写:URI)在电脑术语中是用于标识某一互联网资源名称的字符串。
- URL是一种URI,它标识一个互联网资源,并指定对其进行操作或获取该资源的方法。可能通过对主要访问手段的描述,也可能通过网络“位置”进行标识。
与URL和URN的关系
- 不同操作系统换行方式区别(CRLF)
- windows: \r\n(回车换行)
- linux: /n
- mac: /r
- 不同操作系统换行方式区别(CRLF)
ABNF(Augmented BNF)
简介:
- ABNF是BNF(Backus-Naur Form,译为:巴科斯-瑙尔范式)的修改、增强版
- 在 RFC 5234 中表明:ABNF用作 internet 中通信协议的定义语言
- ABNF是最严谨的HTTP报文格式描述形式,脱离ABNF谈论HTTP报文格式,往往都是不严谨的
- 关于HTTP报文的定义:
ABNF - 核心规则
HTTP报文格式 - 整体
报文格式 - request-line、status -line
报文格式 - header-filed、message-body
URL的编码 - URL中一旦出现了一些特殊字符(比如中文、空格),需要进行 编码
在浏览器地址栏输入URL时,是采用 UTF-8 进行编码
例如:
http://localhost:8080/socket/image/初音.png
http://localhost:8080/socket/image/%E5%88%9D%E9%9F%B3.png
Host请求头指明了请求将要发送到的服务器主机名和端口号。Host让虚拟主机托管成为了可能,也就是一个IP上提供多个Web服务。
Xshell + telnet 面向报文与服务器交互
telnet
命令可以理解为 建立TCP连接,然后我们可以 直接输入报文 来获取响应。简单的 HTTP 报文格式:
1
2GET /hello/ HTTP/1.1
Host: localhost:8080RFC只是规范,服务器在实现相关的功能可能会提高容错能力(也就是不遵守规范)
请求方法(9种)
RFC 7231, section 4: Request methods:描述了 8 种请求方法
GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACERFC 5789, section 2: Patch method:描述了 PATCH 方法
GET:常用于读取的操作,请求参数直接拼接在URL的后面(浏览器对URL是有长度限制)
POST:常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)
HEAD:请求得到与GET请求相同的响应,但没有响应体使用场景:在下载一个大文件前,先获取其大小(HEAD),再决定是否要下载(GET)。以此可以节约带宽资源。
OPTIONS:用于获取目的资源所支持的通信选项,比如 服务器支持的请求方法
OPTIONS * HTTP/1.1
通过向 Tomcat 发送 OPTIONS请求,可以知道它支持以下请求方法
PUT:用于对已存在的资源进行整体覆盖
PATCH:用于对资源进行部分修改(资源不存在,会创建新的资源)
DELETE:用于删除指定的资源
TRACE:请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断
CONNECT:可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel)
- 可以用来访问采用了 SSL (HTTPS) 协议的站点
- 可以用来访问采用了 SSL (HTTPS) 协议的站点
头部字段(Head Fileds)
请求头字段(Request Header Fields)
- 有关要获取的资源或客户端本身信息的消息头
响应头字段(Response Header Fields)
- 有关响应的补充信息,比如服务器本身(名称和版本等)的消息头
实体头字段(Entity Header Fields)
- 有关实体主体的更多信息,比如主体长度(Content-Length)或其MIME类型
通用头字段(General Header Fields)
- 同时适用于请求和响应消息,但与消息主体无关的消息头
- 同时适用于请求和响应消息,但与消息主体无关的消息头
请求头字段
Referer字段可以用于防盗链
- 注意:(*;q=0.2用逗号隔开为一个整体) 值越大,表示优先级越高,如果不指定q值,默认是1.0(1.0是最大值)
- 多线程断点下载(Range)
响应头字段
1
2
3
4
5
6
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain; charset=UTF8");
response.setHeader("Content-Disposition", "attachment; filename=\"lzy.txt\"");
response.getWriter().write("这是我的文件数据");
}
状态码(Status Code)
状态码指示HTTP请求是否已成功完成
状态码分类
- 信息响应:100~199
- 100 Continue
- 客户端在需要请求服务器的一些(敏感)资源时候会需要发送(url ,请求头)区判断服务器是否愿意接受请求(服务器通过url或请求头判断),如果未被拒绝就会继续发送剩余请求体,如果请求已经完成,就忽略这个响应。(一些情况下如果服务器不看请求体就拒绝请求,客户端还发送的请求体是不恰当的或是低效的)
- 100 Continue
- 成功响应:200~299
- 200 OK:请求成功
- 重定向:300~399s
- 302 Found:请求的资源被暂时的移动到了由Location头部指定的URL上(重定向)
- 304 Not Modified:说明无需再次传输请求的内容,也就是说可以使用缓存的内容(静态资源)(依旧会发送请求,只是接收时没有响应体)
- 客户端错误:400~499
- 400 Bad Request:由于语法无效,服务器无法理解该请求, 或是(不满足要求)服务器主动给的
- 401 Unauthorized:由于缺乏目标资源要求的身份验证凭证
- 403 Forbidden:服务器端有能力处理该请求,但是拒绝授权访问
- 404 Not Found:服务器端无法找到所请求的资源
- 405 Method Not Allowed:服务器禁止了使用当前HTTP方法的请求
- 406 Not Acceptable:服务器端无法提供与Accept-Charset以及Accept-Language指定的值相匹配的响应
- 408 Request Timeout:服务器想要将没有在使用的连接关闭
- 一些服务器会在空闲连接上发送此信息,即便是在客户端没有发送任何请求的情况下
- 服务器错误 :500~599
- 500 Internal Server Error:所请求的服务器遇到意外的情况并阻止其执行请求
- 501 Not Implemented:请求的方法不被服务器支持,因此无法被处理
- 服务器必须支持的方法(即不会返回这个状态码的方法)只有 GET 和 HEAD
- 502 Bad Gateway:作为网关或代理角色的服务器,从上游服务器(如tomcat)中接收到的响应是无效的
- 503 Service Unavailable:服务器尚未处于可以接受请求的状态
- 通常造成这种情况的原因是由于服务器停机维护或者已超载
- CTRL+ F5 强制刷新,不使用缓存(浏览器)
- 信息响应:100~199
form 提交 - 常用属性、multipart/form-data
action:请求的URI
method:请求方法(GET、POST)
enctype:POST请求时,请求体的编码方式:
- application/x-www-form-urlencoded(默认值)
- 会用&分隔参数,用=分隔键和值,(不论get/post)通过表单提交的queryString字段编码是文件按方式(请求的Html)的编码方式为准,而请求的pathInfo部分则按照浏览器设定的编码方式编码为准。
- multipart/form-data
- 文件上传时必须使用这种编码方式
- application/x-www-form-urlencoded(默认值)
multipart/form-data 可参考 RFC 1521
同源策略、跨域资源共享
浏览器有个同源策略(Same-Origin Policy)
artifacts :编译后的Java类,Web资源等的整合,用以测试、部署等工作。再白话一点,就是说某个module要如何打包,例如war exploded、war、jar、ear等等这种打包形式。某个module有了 Artifacts 就可以部署到应用服务器中了。(打包)
jar:Java ARchive,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便分发Java平台应用软件或库;
war:Web application ARchive,一种JAR文件,其中包含用来分发的JSP、Java Servlet、Java类、XML文件、标签库、静态网页(HTML和相关文件),以及构成Web应用程序的其他资源;
exploded:在这里你可以理解为展开,不压缩的意思。也就是war、jar等产出物没压缩前的目录结构。建议在开发的时候使用这种模式,便于修改了文件的效果立刻显现出来。
默认情况下,IDEA的 Modules 和 Artifacts 的 output目录已经设置好了,不需要更改,打成war包的时候会自动在 WEB-INF目录下生成classes,然后把编译后的文件放进去。
默认情况下,AJAX请求只能发给同源的URL
- 同源:指的是协议、域名(IP)、端口相同
- 同源:指的是协议、域名(IP)、端口相同
CORS (Cross-Origin Resource Sharing),跨域资源共享(解决Ajax请求)
- CORS实现需要客户端和服务器同时支持
- 客户端所有的浏览器都支持(IE至少为IE10)服务器需要返回响应的响应头(Access-Control-Allow-Origin)
注意:
img、script、link
等标签是不受同源策略影响。
代理服务器(Proxy Server)
- 特点:
- 本身不生产内容
- 处于中间位置转发上下游的请求和响应
- 面向下游的客户端:它是服务器
- 面向上游的服务器:它是客户端
- 特点:
正向代理和反向代理
正向代理: 代理对象是客户端
- 正向代理的作用:
- 隐藏客户端身份(IP隐藏)
- 绕过防火墙(突破访问限制)
- Internet访问控制
- 数据过滤
- …
- 一些免费的正向代理
- 正向代理的作用:
反向代理: 代理对象是服务端
- 隐藏服务器身份
- 安全防护
- 负载均衡
补充
- Fiddler、Charles 等抓包工具的原理:在客户端启动了正向代理服务
- Wireshark的原理:通过底层驱动,拦截网卡上流过的数据
代理服务器 - 相关的头部字段
CDN (Content Delivery Network或Content Distribution Network)内容分发网络
- 利用最靠近每位用户的服务器来服务
- 更快更可靠地将音乐、图片、视频等资源文件(一般是静态资源)传递给用户
- CDN运营商在全国、乃至全球的各个大枢纽城市都建立了机房
- 部署了大量拥有高存储高带宽的节点,构建了一个跨运营商、跨地域的专用网络
- 内容所有者向CDN运营商支付费用,CDN将其内容交付给最终用户
注意:
- 向源站发起请求之前,会向逐渐上层CDN父节点请求,如果没有对应资源那么才会逐层向上请求。