shuguang's blog

环境决定基础,选择决定价值,努力决定方向。

网络协议 - 应用层

  • 本文主要介绍网站请求流程中所用到的协议DNS,HTTP和DHCP相关概念和作用。

  • 本文也着重介绍了HTTP请求和应答过程中的相关规则,包括报文格式、状态码、跨代理和CDN相关知识。


#应用层协议

  • 常见的应用层协议:
    1. 超文本传输:HTTP、HTTPS
    2. 文件传输:FTP
    3. 电子邮件:SMTP、POP3、IMAP
    4. 动态主机配置:DHCP
    5. 域名系统: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 等
    • 二级域名(顶级域名下的域名)
      • 通用顶级域名下,它一般指域名注册人的名称,例如 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服务器)
    • 所有的DNS服务器都记录了DNS根域名服务器的IP地址
    • 上级DNS服务器记录了下级DNS服务器的IP地址
    • 全球一共13台IPv4的DNS根域名服务器,25台IPv6的DNS根域名服务器
      DNS解析流程
  • DNS 常用命令

    • ipconfig /displaydns 查看DNS缓存记录
    • ipconfig /flushdns 清空DNS缓存记录
    • ping 域名 ping 域名会自动解析DNS
    • nslookup 域名 主动解析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地址、申请续约(延长租期)
          DHCP请求流程

      DHCP抓包


#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

    • HTTP的标准

      • 由万维网协会(W3C)、互联网工程任务组(IETF)协调制定,最终发布了一系列的RFC(Request For Comments,可以译为:请求意见稿)

      HTTP报文格式

    • 相关补充

      • URI与URL区别

        • URI统一资源标志符(英语:Uniform Resource Identifier,缩写:URI)在电脑术语中是用于标识某一互联网资源名称的字符串。
        • URL是一种URI,它标识一个互联网资源,并指定对其进行操作或获取该资源的方法。可能通过对主要访问手段的描述,也可能通过网络“位置”进行标识。
      • 与URL和URN的关系

        • URI可被视为定位符(URL),名称(URN)或两者兼备。统一资源名(URN)如同一个人的名称,而统一资源定位符(URL)代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。
        • 技术上讲,URL和URN属于资源ID
      • ASCll码表

        • 不同操作系统换行方式区别(CRLF)
          • windows: \r\n(回车换行)
          • linux: /n
          • mac: /r

  • ABNF(Augmented BNF)

    • 简介

      • ABNF是BNF(Backus-Naur Form,译为:巴科斯-瑙尔范式)的修改、增强版
      • RFC 5234 中表明:ABNF用作 internet 中通信协议的定义语言
      • ABNF是最严谨的HTTP报文格式描述形式,脱离ABNF谈论HTTP报文格式,往往都是不严谨的
      • 关于HTTP报文的定义:
    • ABNF - 核心规则

      ABNF-核心规则

    • HTTP报文格式 - 整体

      HTTP报文格式-整体

    • 报文格式 - request-line、status -line

      报文格式1

    • 报文格式 - header-filed、message-body
      报文格式2

    • 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
      2
      GET /hello/ HTTP/1.1
      Host: localhost:8080
    • RFC只是规范,服务器在实现相关的功能可能会提高容错能力(也就是不遵守规范)

  • 请求方法(9种)

    • RFC 7231, section 4: Request methods:描述了 8 种请求方法
      GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE

    • RFC 5789, section 2: Patch method:描述了 PATCH 方法

    • GET:常用于读取的操作,请求参数直接拼接在URL的后面(浏览器对URL是有长度限制)

    • POST:常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)

    • HEAD:请求得到与GET请求相同的响应,但没有响应体使用场景:在下载一个大文件前,先获取其大小(HEAD),再决定是否要下载(GET)。以此可以节约带宽资源。

    • OPTIONS:用于获取目的资源所支持的通信选项,比如 服务器支持的请求方法

    • OPTIONS * HTTP/1.1

    • 通过向 Tomcat 发送 OPTIONS请求,可以知道它支持以下请求方法
      OPTIONS请求

    • PUT:用于对已存在的资源进行整体覆盖

    • PATCH:用于对资源进行部分修改(资源不存在,会创建新的资源)

    • DELETE:用于删除指定的资源

    • TRACE:请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断

    • CONNECT:可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel)

      • 可以用来访问采用了 SSL (HTTPS) 协议的站点

  • 头部字段(Head Fileds)

    • 请求头字段(Request Header Fields)

      • 有关要获取的资源或客户端本身信息的消息头
    • 响应头字段(Response Header Fields)

      • 有关响应的补充信息,比如服务器本身(名称和版本等)的消息头
    • 实体头字段(Entity Header Fields)

      • 有关实体主体的更多信息,比如主体长度(Content-Length)或其MIME类型
    • 通用头字段(General Header Fields)

      • 同时适用于请求和响应消息,但与消息主体无关的消息头

    • 请求头字段

      图1

      图2

      图3

    • Referer字段可以用于防盗链

      • 注意:(*;q=0.2用逗号隔开为一个整体) 值越大,表示优先级越高,如果不指定q值,默认是1.0(1.0是最大值)
      • 多线程断点下载(Range)

    • 响应头字段

      图4

      图5

      图6

      1
      2
      3
      4
      5
      6
      @Override
      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)

    • RFC 2616 10.Status Code Definitions 规范中定义

    • 状态码指示HTTP请求是否已成功完成

    • 状态码分类

      • 信息响应:100~199
        • 100 Continue
          • 客户端在需要请求服务器的一些(敏感)资源时候会需要发送(url ,请求头)区判断服务器是否愿意接受请求(服务器通过url或请求头判断),如果未被拒绝就会继续发送剩余请求体,如果请求已经完成,就忽略这个响应。(一些情况下如果服务器不看请求体就拒绝请求,客户端还发送的请求体是不恰当的或是低效的)
      • 成功响应: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 强制刷新,不使用缓存(浏览器)

    • form 提交 - 常用属性、multipart/form-data

      • action:请求的URI

      • method:请求方法(GET、POST)

      • enctype:POST请求时,请求体的编码方式:

        • application/x-www-form-urlencoded(默认值)
          • 会用&分隔参数,用=分隔键和值,(不论get/post)通过表单提交的queryString字段编码是文件按方式(请求的Html)的编码方式为准,而请求的pathInfo部分则按照浏览器设定的编码方式编码为准。
        • multipart/form-data
          • 文件上传时必须使用这种编码方式
      • 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)、端口相同
          同源URL
      • CORS (Cross-Origin Resource Sharing),跨域资源共享(解决Ajax请求)

        • CORS实现需要客户端和服务器同时支持
        • 客户端所有的浏览器都支持(IE至少为IE10)服务器需要返回响应的响应头(Access-Control-Allow-Origin)
      • 注意img、script、link等标签是不受同源策略影响。

  • 代理服务器(Proxy Server)

    • 特点:
      • 本身不生产内容
      • 处于中间位置转发上下游的请求和响应
        • 面向下游的客户端:它是服务器
        • 面向上游的服务器:它是客户端

  • 正向代理反向代理

    • 正向代理: 代理对象是客户端

      正向代理

    • 反向代理: 代理对象是服务端

      • 隐藏服务器身份
      • 安全防护
      • 负载均衡

      反向代理

    • 补充

      • Fiddler、Charles 等抓包工具的原理:在客户端启动了正向代理服务
      • Wireshark的原理:通过底层驱动拦截网卡上流过的数据
    • 代理服务器 - 相关的头部字段

      代理服务器相关头字段

  • CDN (Content Delivery Network或Content Distribution Network)内容分发网络

    • 利用最靠近每位用户的服务器来服务
    • 更快更可靠地将音乐、图片、视频等资源文件(一般是静态资源)传递给用户
    • CDN运营商在全国、乃至全球的各个大枢纽城市都建立了机房
      • 部署了大量拥有高存储高带宽的节点,构建了一个跨运营商、跨地域的专用网络
      • 内容所有者向CDN运营商支付费用,CDN将其内容交付给最终用户

    图7

    图8

    图9

  • 注意

    • 向源站发起请求之前,会向逐渐上层CDN父节点请求,如果没有对应资源那么才会逐层向上请求。