HTTP相关整理

http

HTTP,HyperText Transfer Protocol,超文本传输协议,用来约束采用http规范进行的计算机之间交互的内容。目前常用的http版本是运行于TCP/IP协议之上,通过TCP协议来实现可靠的数据数据传输,通过IP协议来实现寻址和路由。在http的基础上,还出现了在SSL/TLS协议之上的https协议,涌来补充http安全性不足的缺点。

特点
  • http是一个双向协议,有请求方和应答方。常规的请求方,浏览器;应答方,服务器。
  • http是用于计算机网络中点对点的数据传输
  • 超文本:传输的不是二进制,而是超越了普通文本的文本、音频、视频等内容的混合体
  • http协议是无状态的

http版本

  • HTTP/0.9: 最早使用版本,只有GET请求,获取HTML文档,获取之后立即关闭链接
  • HTTP/1.0:增加了POST等请求方法,增加了响应状态码,引入了协议版本号概念,引入了请求头概念,增加了传输数据的多样性
  • HTTP/1.1:目前使用最广泛;制订了RFC文档,增加了PUT、DELETE等请求,增加了长连接支持,允许数据chunked分块发送,增加了缓存相关概念
  • HTTP/2:衍生于SPDY协议,从纯文本协议变更到了二进制协议;可同时发起多个请求;压缩头部;允许服务器主动推送数据
  • HTTP/3:将底层协议从TCP变更为QUIC
  • HTTPS:运行在SSL/TLS协议上的http

http相关概念

  • URI:即统一资源标识符,作为互联网上资源的唯一身份,结构为协议名+主机名+路径+参数
  • URL:统一资源定位符,是URI的子集
  • HTML:即超文本标记语言,描述超文本文档
  • CDN:Content Delivery Network,内容分发网络。它应用了http协议里的缓存和代理技术,可以代替web服务器响应部分客户端的请求,来实现快速访问的目的。
  • 爬虫:自动访问web资源的应用程序,用来抓去网络上的数据资源进行某些处理。
  • HTML:超文本标记语言
  • Web Service:一种基于http的服务架构技术
  • WAF:网络应用防火墙
  • TCP/IP协议:是一系列网络通信协议的统称,核心为TCP协议和IP协议;IP协议主要是用来解决寻址和路由问题,并且在点对点间传输数据包;TCP协议是建立在IP协议之上,涌来实现稳定可靠的、字节流形式的数据传输。
  • UDP协议:和TCP协议同级别,对IP协议进行了简单的包装,比TCP协议轻量很多,不需要建立链接就可以发送数据但不保证一定发送成功
  • 代理:代理是http请求中请求方和应答方的一个中间环节,一般有正向代理(代客户端)和反向代理(代服务器)之分;代理层次可以做负载均衡、内容缓存、安全防护、数据处理等
  • 转义:URI 引入了编码机制,对于 ASCII 码以外的字符集和特殊字符做一个特殊的操作,把它们转换成与 URI 语义不冲突的形式。
  • MIME type:Accept和Content-Type中的描述的数据类型,text/html、text/plain、image/jpeg、application/json等
  • WebSocket: WebSocket是一个“全双工”的通信协议,利用http协议进行握手,通过第一次请求进行协议升级。
DNS域名系统

域名系统。解析域名为ip地址

  • 根域名服务器:管理顶级域名服务器,返回如cn、com等顶级域名服务器的地址
  • 顶级域名服务器:管理顶级域名下的权威域名服务器
  • 权威域名服务器:管理域名下的主机ip地址
  • 其他域名服务器、浏览器缓存、操作系统缓存、host文件
  • 查找顺序: 浏览器缓存->操作系统缓存->host文件->dns
http队头阻塞与tcp队头阻塞
  • http队头阻塞:在客户端中,向一个服务器顺序发送多个请求,当前面的请求因为某些原因耗时过长,会导致后面的请求被阻塞,一般浏览器会通过并发请求来解决
  • tcp队头阻塞:当消息报文在tcp上按顺序传播时,当某个包出现意外丢失,tcp启动丢包重传,就会导致后面的包陷入等待状态

http报文结构组成

请求报文和响应报文基本相同:
请求行(状态行)+ 头字段 + CRLF + 消息正文

  • 请求行:描述请求的基本信息->请求方法+请求路径+协议版本号+CRLF
    在这里插入图片描述在这里插入图片描述

  • 状态行:描述响应的基本信息->协议版本号+状态码+原因+CRLF
    在这里插入图片描述
    在这里插入图片描述

  • 头字段:通过key:value的形式来描述报文里的内容:key:value+CRLF
    请求报文和响应报文里都有头字段,很多字段是公用的,意义也基本相同,也有很多独有的头字段,同时也可以自定义头字段

  • 消息正文:报文里实际传输的数据
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JkmEiNfB-1595430102758)(0EE54CC334324DADB9225C73ABE6F224)]

常见头字段

请求头字段

  • Host
  • User-Agent
  • If-Modified-Since:If-Modified-Since是标准的HTTP请求头标签,在发送HTTP请求时,把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较,根据时间来判断是否返回数据
  • Accept:客户端告诉服务器可以接收的数据类型
  • Accept-Encoding: 客户端支持的压缩格式
  • Accept-Language:客户端支持的语言类型
  • Accept-Charset:客户端请求的字符集类型
  • Range:bytes=x-y:客户端对数据进行范围请求
  • Cookie
  • If-None-Match:搭配Etag使用控制缓存
  • if-Modified-Since:搭配Last-Modified使用控制缓存

响应头字段

  • Server:服务器软件名+版本号
  • Allow:
  • Content-Type: 服务器发送的数据类型
  • Content-Encoding: 服务器使用的压缩格式
  • ContentLanguage:服务器发送数据使用的语言类型
  • Vary:服务器根据客户端协商时的头字段,返回的信息
  • Transfer-Encoding: chunked 表示报文里的body不是一次性传过来,而是分成许多块传输,这时长度是未知的
  • AcceptRanges: bytes 客户端支持范围请求内容
  • Content-Range:bytes x-y/length 服务器告诉客户端请求片段的范围及总大小
  • Location: 标记了服务器要求重定向的 URI
  • Set-Cookie: 写入cookie

通用头字段

  • Date
  • Content-Length:消息正文里的数据长度
  • Content-Type
  • Connection:keep-alive 开启长连接
  • Connection: close 这次请求后关闭长连接
  • Host:
  • Last-Modified
  • ETag
  • Cache-Control:在客户端设置缓存。max-age缓存存活时间;no_store,不允许缓存;no_cache,可以使用缓存,但要去服务器验证是否过期;must-revalidate缓存过期后再去验证是否可用
  • Via: 叠加记录代理主机名

代理相关字段(某些情况下不可用,应使用代理协议)

  • X-Forwarded-For: 叠加记录代理主机ip和客户端ip
  • X-Real-IP: 记录客户端真实ip
  • X-Forwarded-Host:客户端请求的原始域名
  • X-Forwarded-Proto:客户端请求的原始协议名
请求方法
  • GET
  • HEAD:HEAD方法与 GET 方法类似,但是服务器不会传回实体内容,只会传响应头
  • POST
  • PUT
  • DELETE
响应状态码及常见状态码

1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作

2xx: 请求成功

  • 200 OK
  • 204 No Content
  • 206 Partial Content,配合头字段"Content-Range",表示部分传输

3xx: 重定向

  • 301 永久重定向,搭配头字段Location
  • 302 临时重定向,搭配头字段Location
  • 304 表示资源未修改,一般用于缓存

4xx: 客户端错误,一般是请求报文有错误

  • 400 Bad Request,客户端请求未知错误
  • 403 Forbidden,客户端请求了服务器禁止资源
  • 404 Not Found,客户端请求的资源未找到

5xx: 服务器错误

  • 500 Internal Server Error,服务器内部未知错误
  • 501 Not Implemented,客户端请求不支持
  • 502 Bad Gateway,服务器正常,服务器从其他获取资源发生错误
  • 503 Service Unavailable,服务器网络正忙

Cookie

Cookie相关概念
  • domain 所属域名
  • path 所属路径
  • HttpOnly:此 Cookie 只能通过浏览器 HTTP 协议传输,禁止其他方式访问
  • SameSite:通过设置对应的值限定cookie在什么情况下发送
  • Secure:表示这个 Cookie 仅能用 HTTPS 协议加密传输,明文的HTTP 协议会禁止发送
  • Expires:过期时间
  • Max-Age:存活时间
潜在问题
  • XSS跨站脚本攻击,JS 脚本里可以用 document.cookie 来读写 Cookie 数据
  • XSRF跨站请求伪造攻击,

网络分层概念

两个分层模型TCP/IP模型和OSI网络分层模型,相当于实际与理论的关系,层次之间可以对应(除物理层)

TCP/IP 网络分层模型
  • 第一层:链路层,使用MAC地址来标记网络上的设备,发送原是数据包
  • 第二层:网际层,IP协议所在的层次,通过将ip地址替换MAC地址
  • 第三层:传输层,TCP协议和UDP协议所在的层次,实现不同目的的传输
  • 第四层:应用层,HTTP协议所在的层次,除了HTTP协议还有其他很多协议如FTP、SSH等。
OSI 网络分层模型
  • 第一层:物理层,电缆、光纤等
  • 第二层:数据链路层,相当于上面的链路层,二层转发
  • 第三层:网络层,相当于上面的网际层,三层路由
  • 第四层:传输层,相当于上面的传输层
  • 第五层:会话层,维护网络中的连接状态,保持会话和同步
  • 第六层:表示层,把数据转为合适的可理解的语法和语义
  • 第七层:应用层,面向具体的应用传输数据

TCP三次握手与四次挥手

##### 三次握手
三次握手指的是,在http正式发送之前,客户端和服务器有3次交互来确认链接是否成功,通过wireshark抓包内容如下。
在这里插入图片描述

经过了SYN、SYN,ACK、ACK三次交互之后,TCL链接确认起来了,就可以发送后面的http请求了。

四次挥手

在这里插入图片描述

https

HTTP over SSL/TLS

https相关概念
  • SSL/TLS: SSL,安全套接层(Secure Sockets Layer),在OSI模型中处于第5层(会话层);TLS协议由SSL转换而来,目前应用最广泛的是TLS1.2.
  • 密码套件:浏览器和服务器在使用TLS建立连接时需要选择一组恰当的加密算法来实现安全通信,这些算法的组合被称为“密码套件;基本的形式是“密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法”
  • OpenSSL 是著名的开源密码学工具包,是 SSL/TLS 的具体实现
  • 对称加密:加密和解密时使用同一个密钥。常见的AES、DES、ChaCha20等
  • 非对称加密:有公钥和私钥两种密钥。常见的DH、DSA、RSA、ECC 等。ECC中子算法 ECDHE 用于密钥交换,ECDSA用于数字签名。比起RSA,ECC在安全强度和性能上都有明显的优势。
  • 加密分组模式:让算法用固定长度的密钥加密任意长度的明文。最新的分组模式被称为 AEAD,常用的是 GCM、CCM和Poly1305
  • 摘要算法:一种特殊的压缩算法,它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串,摘要算法对输入具有“单向性”和“雪崩效应”;常用的有MD5和SHA。摘要和原文内容是等价的,一般用摘要来验证原文的完整性。
  • 签名:通过私钥加密原文的摘要,生成数字签名
  • 验签:通过公钥解密签名,然后与原文的摘要做比较
  • CA:证书认证机构,给网站的公钥进行签名,宣布公钥可信。CA必须可信。
  • 数字证书:CA对网站公钥相关信息打包后签名生成的信息
  • SNI:由于TLS握手阶段无法获取报文中的域名,所以在握手阶段增加host信息
TLS协议组成
  • 记录协议
  • 警报协议
  • 握手协议
  • 变更密码规范协议
一个https请求的完整流程
  • TCP三次握手
  • Client:发送"Client Hello",里面有客户端的版本号、支持的密码套件,还有一个随机数
  • Server:发送"Server Hello",里面有密码套件,随机数
  • Server:发送证书
  • Server:发送"Server Key Exchange", 包含公钥,公钥签名
  • Server:发送"Server Hello Done",消息发送完毕
  • Client去CA认证证书,通过证书公钥认证签名
  • Client:发送"Client Key Exchange",发送客户端公钥
  • 两端生成会话密钥
  • Client:发送"Change Cipher Spec",最后验证,验证后开启加密通话
  • Client:发送"Finished"
  • Server:发送"Change Cipher Spec",最后验证,验证后开启加密通话
  • Server:发送"Finished"
    在这里插入图片描述

与以前的RSA公钥加密客户端对称密钥相比,更具有安全性,因为如果私钥泄露,那么值钱所有的密文都会被解密。通过ECDHE算法两端每次都生成加密的公钥,即使私钥泄露,那么也只会影响这一次的通话,以前的通话安全得到保证。

TLS1.3相关概念
  • 兼容TLS1.3以前版本
  • 通过扩展协议新增功能
  • 缩减加密算法,保留核心算法
  • 删除了Key Exchange过程,减少了TLS握手的次数
关于https的优化
  • HTTPS 连接是计算密集型,而不是 I/O 密集型,因此选择更快的 CPU,最好还内建 AES 优化
  • SSL 加速卡。加解密时调用它的 API,让专门的硬件来做非对称加解密,分担 CPU 的计算压力
  • SSL 加速服务器。用专门的服务器集群来进行TLS握手时候的加密解密计算
  • 软件升级
  • 协议优化。升级协议。选择合适的密钥交换算法(ECDHE)、对称密钥算法
  • 证书优化
  • 会话复用。客户端和服务器缓存会话密钥,通过Session ID开启; 或者为减轻服务器压力,客户端缓存服务器加密传输后的Session Ticket,使用Session Ticket开启会话

http2

http2主要是性能的提升。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GuukphVN-1595430102761)(1A978C4B00824ED7B7F3123981CF2526)]

http2特性
  • http2中废除了起始行,转变成了head头,称为“伪头字段”
  • 头部压缩。在客户端和服务器两端建立字典表,用索引号表示重复的字符串。引入HPACK算法压缩头部。
  • 客户端和服务器要维护头字段值的静态表和动态表
  • 将报文转为二进制,生成多个二进制帧来传输数据
  • TCP连接多路复用,同时传输多个请求的数据帧,解决了http请求队头阻塞的问题
  • HTTP/2 增强了安全性,要求至少是 TLS1.2,而且禁用了很多不安全的密码套件
  • http2中一个流相当于http1中的一次请求-应答
二进制帧结构
  • 帧长度(3个字节)
  • 帧类型(1个字节):数据帧、控制帧
  • 标志位(1个字节):标识帧所处的状态
  • 流标识符(4个字节):表示当前帧所属于哪个流
  • payload:实际传输数据
http2建立连接
  • TCP三次握手
  • TLS握手
  • Client发送连接前言(Magic),表明使用http2连接
http2 和websocket
  • websocket
    WebSocket是一种基于 TCP的轻量级网络通信协议,也是一个“全双工”的通信协议,“ws”和“wss”
    WebSocket利用http协议进行握手,通过第一次请求进行协议升级
  • 两者区别
    websocket含有一套标准的api,可以被代码使用,方便开发;
    websocket的连接需要调用接口关闭,http2可能超时关闭;
    http2因为采用了流的概念,可以多路复用,但是也给服务器推送造成了一定的困难,不能准确的推送到页面,因此只能推送到浏览器缓存(个人理解)。

http3

将http运行在QUIC协议上,解决了TCP容易导致对头阻塞的问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vjCgza0M-1595430102762)(4956BF3CE66E44E3940A1B5391E3BF34)]

WEB服务器

WEB服务器有两种概念,一种是硬件上的概念,指物理形式上的机器或者利用反向代理、负载均衡等技术实现的庞大集群;一种是软件概念如Apache、nginx等,可以响应http请求,并返回相应的内容。

  • OpenResty
  • nginx
  • apache

相关调试

  • wireshark
  • fiddler
  • SSLLabs网站,测试https网站的安全程度

相关文档

  • RFC 文档
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值