http是大家既熟悉有陌生的一种协议,http依托tcp/ip协议构建,其已经成为互联网最重要的协议。本文从http在七层模型中的位置、http请求方法、http请求头、http响应报文、http状态码、http延时、http缓存、http长连接、http安全、http应用 几种维度学习http。
一、HTTP之七层网络模型
二、HTTP协议版本异同
http协议共计4个版本分别是http0.9、http1.0、http1.1、http2.0、http3.0,各个版本异同后续补充。
三、HTTP请求方法二、HTTP部分指标汇总
序号 | HTTP请求方法 | HTTP请求方法介绍 | 使用介绍 |
---|---|---|---|
1 | get | 从服务获取一份文档 | 1024个字节限制 |
2 | post | 向服务器发送需要处理的数据 | 支持表单提交、二进制提交等等 |
3 | head | 从服务器获取文档header响应 | 获取header返回响应支持类型 |
4 | delete | 删除指定资源 | 不常用 |
5 | put | 新增修改写入服务器 | |
6 | trace | 对可能经过代理服务器传送到服务器上去的报文进行追踪 | |
7 | options | 服务器支持哪些请求方法 | |
8 | connect | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 | |
9 | patch | 用来将局部修改应用于某一资源,添加于规范RFC5789 |
-
HTTP常用状态码
HTTP状态码 | 已定义范围 | 状态码含义 | 状态码含义 | 是否常见 |
---|---|---|---|---|
100-199 | 100-101 | 信息提示 | 100:说明收到请求的初始化部分,请客户端继续,发送这个状态码之后,服务器在收到请求后必须响应 | 不 |
101:说明服务器根据客户端指定,将协议切换成Update首部所列协议 | ||||
200-299 | 200-206 | 成功 | 200:OK 请求没有问题 | 是 |
201:create 响应创建请求 比如PUT | 否 | |||
300-399 | 300-305 | 重定向 | 301:请求url已被移除 将跳转新的url 收索引擎友好型 | 是 |
302:请求url已不可访问 给出零时url 将来还继续使用老的url | 否 | |||
303:无需等待用户确认重定向 | 是 | |||
400-499 | 400-415 | 客户端或者服务端错误 | 400:用于告知客户端向他发送一个错误请求 | 是 |
403:无权限访问资源 | 是 | |||
404:找不到 | 是 | |||
405:访问方法不支持 比如只支持get 却用post访问 | 是 | |||
408:客户端请求超时 | 是 | |||
500-599 | 500-505 | 服务端错误 | 500:服务器遇到一个妨碍它为请求提供服务的错误 | 否 |
501:超过服务器处理范围 比如:请求方法写错 | 否 | |||
502:作为代理或者网关使用的服务器重请求响应链的下一条链路上收到一条伪响应 | 否 | |||
503:服务器无法为请求提供服务 | 是 | |||
504:408类似 响应超时 | 是 | |||
505:版本不支持 | 否 |
-
Request Headers请求头
功能概况 | 请求头Key | 请求头对应描述 | 协议版本 | 是否常用 |
---|---|---|---|---|
请求首部 | Accept | 浏览器可接受的MIME类型 | HTTP1.0 | 是 |
Accept-Charset | 浏览器可接受的字符集 | 是 | ||
Accept-Encoding | 浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。网页压缩就是基于此 | 是 | ||
Accept-Language | 浏览器所希望的语言种类 | 是 | ||
Authorization | 授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中 | 是 | ||
内容首部 | Content-Length | 表示请求消息正文的长度 | 是 | |
Content-Range | WEB 服务器表明该响应包含的部分对象为整个对象的哪个部分。例如:Content-Range: bytes 21010-47021/47022 断点续传就是基于此原理 | 是 | ||
Content-Type | WEB 服务器告诉浏览器自己响应的对象的类型。例如:Content-Type:application/xml | 是 | ||
Content-Encoding | WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip | 是 | ||
Content-Language | WEB 服务器告诉浏览器自己响应的对象的语言 | 是 | ||
Host | 客户机通过这个头告诉服务器,想访问的主机名。Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回 | 是 | ||
协商缓存 | If-Modified-Since | 客户机通过这个头告诉服务器,资源的缓存时间。只有当所请求的内容在指定的时间后又经过修改才返回它,否则返回304“Not Modified”应答 | 否 | |
If-Match | 如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作 | 否 | ||
If-None-Match | 如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作 | 否 | ||
If-Modified-Since | 如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT | 否 | ||
If-Unmodified-Since | 如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象) | 否 | ||
If-Range | 浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用 | 否 | ||
Last-Modified | WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT | 否 | ||
强缓存 | Cache-Control | no-cache:告知(代理)服务器不能直接使用缓存,要求向原服务器发起请求 no-store:所有内容不会被保存到缓存或者internet临时文件中 max-age=delta-seconds 服务器客户端希望接收一个存在时间(age)不大于delta-seconds秒的资源 max-stale=delta-seconds 服务器(代理)客户端愿意接收一个超过缓存时间的资源,若有定义delta-seconds则为delta-second秒,若没有则为任意超出的时间 min-fresh=delta-seconds 服务器(代理)客户端希望接收一个在小于delta-seconds秒内更新过的资源 no-transform 服务器(代理)客户端希望获取实体数据没有被转化过的资源 only-if-cached 服务器(代理)希望获取缓存过的内容 而不是向原服务器发送请求 cache-extension 自定义扩展值 若服务器不识别该值被忽略 | ||
Pragma | 指定no-cache值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝 | |||
Location | WEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取 | 否 | ||
Referer | 客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 | 是 | ||
User-Agent | User-Agent头域的内容包含发出请求的用户信息。浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用 | 是 | ||
Cookie | 客户机通过这个头可以向服务器带数据 | 是 | ||
Connection | 处理完这次请求后是否断开连接还是继续保持连接。如果Servlet看到这里的值为“Keep- Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小 | 是 | ||
是 |
-
Response Headers响应头
请求头Key | 请求头对应描述 | 协议版本 | 是否常用 |
---|---|---|---|
Allow | 服务器支持哪些请求方法(如GET、POST等) | 是 | |
Content-Encoding | 文档的编码(Encode)方法 | 是 | |
Content-Length | 表示内容长度 | 是 | |
Content- Type | 表示后面的文档属于什么MIME类型 | 是 | |
Date | 当前的GMT时间 | 是 | |
Expires | 告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存 | 是 | |
Last-Modified | 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置 | 是 | |
Location | 这个头配合302状态码使用,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。 | 是 | |
Refresh | 告诉浏览器隔多久刷新一次以秒计 | 一般 | |
Server | 服务器通过这个头告诉浏览器服务器的类型 | 是 | |
Set-Cookie | 设置和页面关联的Cookie | 是 | |
Transfer-Encoding | 告诉浏览器数据的传送格式 | 是 | |
WWW-Authenticate | 客户应该在Authorization头中提供什么类型的授权信息 | 否 | |
vary | 明确告知缓存服务器按照不同的版本处理; 比如:vary: Accept-Encoding(按照缓存版本)、Vary:User-Agent(优化seo web跳转移动) | ||
Cache-Control | public:表明任何情况下都要缓存该资源 private:表明还回的报文中全部或者部分开放给某些用户做缓存使用,其他用户则不能缓存这些数据 no-cache:不使用缓存向服务器重新发起 no-store:所有内容不会被保存到缓存或者internet临时文件中 no-transform:告知客户端缓存文件不得对实体数据做任何改变 only-if-cached:服务器(代理)客户端希望获取缓存的内容,而不是向服务器发出去请求 must-revalidate:当前资源一定是向原服务器发出去验证请求,如果请求失败返回504 proxy-revalidate:与must-revalidate类似仅仅用于共享缓存 max-age=delta-seconds:告知客户端资源在delta-seconds秒内是新鲜的无需向服务器发出请求 s-maxage=delta-seconds:同max-age仅仅用于共享缓存单位秒 cache-extension:自定扩展值如果服务器不识别忽略此值 | 是 |
四、HTTP延时
-
协议延时
拥塞控制算法延时
Nagle延时算法:Nagle的初衷避免发送大量的小包,防止小包泛滥于网络,理想情况下,对于一个TCP连接而言,网络上每次只能一个小包存在。它更多的是端到端意义上的优化。tomcat默认此项是开启状态如果想关闭-Dsun.net.httpserver.nodelay=false。
CORK算法:提高网络利用率,理想情况下,完全避免发送小包,仅仅发送满包以及不得不发的小包。
TCP握手延时
对于http请求如果使用频率很高,握手将是一个很大的开销,可以使用http长连接,特别适合服务器之间的http通讯。
TIME_WAIT 时延和端口耗尽时延
TCP在关闭时,不会立即被开放给下一次TCP链接使用,会在内存中存留一段时间,来保证同一端口不被重复使用。
-
外界原因导致延时
地域过远延时用cdn,css js 图片文件不合理规划延时,dns解析延时等等。
五、HTTP缓存
为什么要使用缓存?缓存可以加速客户端的渲染、降低服务端带宽压力、提升服务器并发能力,但是缓存也带来了更新问题。以下场景适合用缓存,比如 html、css、js、字典类请求、区域类请求,这些服务或者文件更新比较慢用缓存也是优化应用的一种途径。大型网站大量的使用缓存百度首页就是一个例子,图中画圈的部分memory cache(内存缓存)、disk cache(文件系统缓存)都是百度使用缓存的例子。memory cache、disk cache区别不在本文赘述,后续研究浏览器相关的帖子在讨论。
- 缓存相关请求响应头
Cache-Control 请求/响应头,缓存控制字段,可以说是控制http缓存的最高指令,要不要缓存也是它说了算。Expires 响应头 代表资源过期时间,由服务器返回提供,GMT格式日期,是http1.0的属性,在与max-age(http1.1)共存的情况下,优先级要低,Last-Modified 响应头 资源最新修改时间,由服务器告诉浏览器,if-Modified-Since 请求头 资源最新修改时间,由浏览器告诉服务器(其实就是上次服务器给的Last-Modified,请求又还给服务器对比),和Last-Modified是一对,它两会进行对比。Etag 响应头 资源标识,由服务器告诉浏览器。if-None-Match 请求头,缓存资源标识,由浏览器告诉服务器(其实就是上次服务器给的Etag),和Etag是一对,它两会进行对比。
- max-age和Expires的区别
max-age是http1.1的属性,Expires是http1.0的属性,为了做到向下兼容,一般写两个。但如在1.1环境下,max-age优先级比Expires高。max-age是相对过期时间,Expires是绝对过期时间。max-age在浏览器成功缓存文件后,只需相对请求成功之后的多长时间不再发起请求就好了,而Expires总是需要服务器返回一个精准的GMT格式的日期,并以这个日期为标准来判断缓存是否过期,相对就比较麻烦,所以才有了max-age这样的存在来代替它。同理,no-cache和 Pargma也是这样的存在,一个是1.1的属性,一个是1.0向下兼容同时写了两个。
- CDN缓存
如果响应要求更高推荐使用cdn
- 缓存是否有效与用户操作
用户操作 | Expires、Cache-Control | Last-Modified、Etag |
---|---|---|
地址栏回车 | 有效 | 有效 |
页面链接跳转 | 有效 | 有效 |
新开窗口 | 有效 | 有效 |
前进、后退 | 有效 | 有效 |
F5刷新 | 无效 | 有效 |
Ctrl+F5刷新 | 无效 | 无效 |
六、HTTP长连接
谈起http长连接,他的原理是降低http通讯过程中建立关闭连接的过程,有人测试http长连接比端连接在相同请求的情况下[测试报告],效率提升25%。长连接是一直保持吗?http长连接不是一直保持的,服务器在通讯过程中可能随时断开长连接。程序设计的时候不要天然认为长连接会一直保持通讯状态,要有再次建立长连接的机制。
短连接的步骤为:建立连接-发送请求报文-接收响应报文-关闭连接...建立连接-发送请求报文-接收响应报文-关闭连接
长连接的步骤为:建立连接-发送请求报文-接收响应报文...-关闭连接
- 如何开启长连接
#http信息
Connection:Keep-Alive
#请求10次断开连接,长连接超时为120秒
Keep-Alive:max=10,timeout=120
#tomcat开启 Tomcat中的相关设置,在server.xml 中的Connector 元素中。
keepAliveTimeout:此时间过后连接就close了,单位是millieconds
maxKeepAliveRequests:最大长连接个数(1表示禁用,-1表示不限制个数,默认100个,一般设置在100~200之间)
maxKeepAliveRequests="1"就可以避免tomcat产生大量的TIME_WAIT连接,从而从一定程度上避免tomcat假死
- HTTP长连接如何保持的?
http长连接没有保持心跳的机制,他只有最大超时时间和连接请求超过次数断开的机制,所以http长连接在应对网络抖动反馈是比较慢的。
- HTTP长连接 VS Netty长连接
性能对比
待更新[先抛个锚点,后续研究netty专题做测试]
及时反馈
netty通过心跳的设计这块比http长连接做的更优秀
七、HTTP安全
HTTP安全面临哪些考验
- 常见的http安全问题
隐私泄露 http是明文传播传输内容都会被中间人看到。例如:不要连接私人wifi啥的
劫持 劫持分为DNS 劫持、客户端劫持、链路劫持 由于网络访问的中间人可以串改用户浏览器界面。 例如:电信前几年经常劫持我浏览的界面推送广告(链路劫持)、百度前几年被DNS劫持定向到国外网站、前几年流行的脚本攻击(客户端劫持)
- http安全问题解决办法
DNS劫持:对于用户来说不要使用陌生软件安装升级好杀毒软件保护dns不被串改
客户端劫持:客户端劫持主要指XSS(跨站脚本攻击),应对方式如下: 1.对于用户来说不要连接陌生wifi。 2.对于用户来说不要访问陌生危险的链接。 3.对于站长来说要对于所有的网站输入框要对所有的脚本输入检查。 4.保护服务器安全不要被黑客串改代码。
链路劫持:1.对于用户来说不要连接陌生wifi。2.对于用户来说,保护好自己的路由器的账户密码。 3.有一种针对营运商的网络攻击这种危害面比较大我们用户也无法掌控。
HTTPS解决什么问题?
- tomcat使用自制作证书
tomcat提供了单向验证、双向验证两种证书认证,需要先生成证书在修改tomcat server.xml文件,然后在导入客户端认证证书即可访问https网站。
#如何制作证书这里就不说了
#tomcat单向认证
<Connector port="443" protocol="HTTP/1.1"
maxThreads="150" SSLEnabled="true" schema="https"
secure="true" clientAuth="false" sslProtocol="TLS"
#证书路径
keystoreFile="srv/ftp/cas/server/server.p12"
#证书密码
keystoreType="pkcs12"
keystorePass="sheng123" />
#tomcat双向认证
<Connector port="443" protocol="HTTP/1.1"
maxThreads="150" SSLEnabled="true"
scheme="https" secure="true" clientAuth="true"
sslProtocol="TLS" keystoreFile="/srv/ftp/cas/server/server.p12"
keystoreType="pkcs12" keystorePass="sheng123"
truststoreFile="/usr/local/tomcat/ca-trust.p12 truststoreType="jks"
truststorePass="sheng123"/>
- 自制证书、免费CA证书和付费CA证书的区别?
上面访问带证书的网站发现需要导入证书这个操作,说明浏览器不认我们私有证书。如果需要整正的证书服务,我们需要购买商业证书。免费证书即为免费型的 DV SSL 证书,可以保护一个完整的域名,不支持通配符阿里云上有免费的。
八、HTTPS传输过程
客户端先从服务器获取到证书,证书中包含公钥
客户端将证书进行校验
客户端生成一个对称密钥,用证书中的公钥进行加密,发送给服务器
服务器得到这个请求后用私钥进行解密,得到该密钥
客户端以后发出后续的请求,都使用这个对称密钥进行加密。
服务器收到这个密文也用这个密钥进行解密
九、HTTP应用
- 常见音视图文原理
- 断点续传原理
- 多线程下载原理
- http代理原理
其他文档