HTTP请求

响应报头内容

  • Connection:keep-alive #当浏览器与服务器通信时对于长连接如何进行处理:close/keep-alive
  • Content-Encoding:gzip #数据在传输过程中所使用的压缩编码方式
  • Content-Type:text/html; charset=utf-8 # 数据的类型MIME类型
  • Date:Mon, 10 Jul 2017 06:14:44 GMT #数据从服务器发送的时间
  • ETag:"50b1c1d4f775c61:df3" #当前返回数据的标志,根据实体内容生成一段hash字符串,标识资源的状态,由服务端产生。
  • Last-Modified:Mon, 10 Jul 2017 06:14:02 GMT # 服务器端文件的最后修改时间
  • Server:nginx/1.7.9 #服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置
  • Access-Control-Allow-Origin:www.google.com # HTML5中定义的一种解决资源跨域的策略,代表来源于www.google.com 的请求可以访问这个资源,Access-Control-Allow-Origin: *谁都可以用。如果资源是html页面,可以设置 <meta http-equiv="Access-Control-Allow-Origin" content="*">
  • Content-Security-Policy: script-src 'self' https://apis.google.com #页面上带src的元素资源是不受同源限制的,Content-Security-Policy(内容安全策略,应该也会影响加载的html内联脚本是否可以运行)是改变这种现状的新安全策略
    • 可以配置白名单,在返回html页面时同时返回就能起作用。例如Content-Security-Policy: script-src 'self' https://apis.google.com指示浏览器你只能加载我屁股后面那些规则下的js代码,其他的都一律拒绝
    • 可以通过<meta http-equiv="Content-Security-Policy" content="default-src https://cdn.example.net; child-src 'none'; object-src 'none'">使用)
    • 指令:
      • 可以通过指定一个 default-src 指令替换大部分指令的默认行为,也就说如果你写了default-src 指令,那其他没写的指令都会服从default-src 的规则。
      • script-src:js的匹配特性指,可用于内联js例如:Content-Security-Policy: script-src 'self' 'sha256-4RS22DYeB7U14dra4KcQYxmwt5HkOInieXK1NUMBmQI=' 允许<script sha256=4RS22DYeB7U14dra4KcQYxmwt5HkOInieXK1NUMBmQI=> 的内联JS运行
      • base-uri: 用于限制可在页面的 <base> 元素中显示的网址。
      • child-src: 用于列出适用于工作线程和嵌入的帧内容的网址。例如:child-src https://youtube.com 将启用来自 YouTube(而非其他来源)的嵌入视频。 使用此指令替代已弃用的 frame-src 指令。
      • connect-src: 用于限制可(通过 XHR(ajax请求)、WebSockets(全双工) 和 EventSource(服务端事件))连接的来源。
      • font-src: 用于指定可提供网页字体的来源。Google 的网页字体可通过 font-src https://themes.googleusercontent.com 启用。
      • form-action: 用于列出可从 <form> 标记提交的有效端点。
      • frame-ancestors: 用于指定可嵌入当前页面的来源。此指令适用于 <frame>、<iframe>、<embed> 和 <applet> 标记。此指令不能在 <meta> 标记中使用,并仅适用于非 HTML 资源。
      • img-src: 用于定义可从中加载图像的来源。
      • media-src: 用于限制允许传输视频和音频的来源。
      • object-src: 可对 Flash 和其他插件进行控制。
      • plugin-types: 用于限制页面可以调用的插件种类。
      • report-uri: 用于指定在违反内容安全政策时浏览器向其发送报告的网址。此指令不能用于 <meta> 标记,这就是举报电话。
      • style-src: 是 script-src 版的样式表。
      • upgrade-insecure-requests: 指示 User Agent 将 HTTP 更改为 HTTPS,重写网址架构。 该指令适用于具有大量旧网址(需要重写)的网站。
    • 规则:
      • none 表示不执行任何匹配。
      • self'表示与当前来源(而不是其子域)匹配。
      • unsafe-inline表示允许使用内联 JavaScript 和 CSS。
      • unsafe-eval 表示允许使用类似 eval 的 text-to-JavaScript 机制。

请求报头内容

  • Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 #表示浏览器支持的 MIME 类型
  • Accept-Encoding:gzip, deflate, sdch # 浏览器支持的压缩类型
  • Accept-Language:zh-CN,zh;q=0.8 #浏览器支持的语言类型,并且优先支持靠前的语言类型
  • Cache-Control:max-age=0 #指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
  • Connection:keep-alive #当浏览器与服务器通信时对于长连接如何进行处理:close/keep-alive
  • Cookie:UM_distinctid=1... #向服务器返回cookie,这些cookie是之前服务器发给浏览器的(会自动设置吗?)
  • Host:t.10jqka.com.cn #请求的服务器URL
  • If-Modified-Since:Mon, 10 Jul 2017 06:14:02 GMT #当强缓存检查失败并有Last-Modified时把Last-Modified的值代入If-Modified-Since,用于给服务器检查数据的最后更新时间,如果没有更新的结果,则服务器发送304报头。如果修改过,则再次去服务器请求资源,返回码和首次请求相同为200,资源为服务器最新资源。
  • If-None-Match : W / "50b1c1d4f775c61:df3" #当强缓存检查失败并在缓存中有ETag存在时会把该像加入请求头中,由于给服务器检查数据实际内容是否更改。优先级高于If-Modified-Since(有该项服务器不会检查If-Modified-Since?)
  • User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36 #用户客户端的一些必要信息
  • Referer: https://www.baidu.com/ #标明引用Web页面的URL(用来判断是否跨域?)
  • Proxy-Authorization 是一个请求首部,其中包含了用户代理提供给代理服务器的用于身份验证的凭证。这个首部通常是在服务器返回了 407 Proxy Authentication Required 响应状态码及 Proxy-Authenticate 首部后发送的
  • Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l // 请求消息头含有服务器用于验证用户代理身份的凭证,通常会在服务器返回401 Unauthorized 状态码以及WWW-Authenticate 消息头之后在后续请求中发送此消息头。.(用于非浏览器验证,浏览器用cookie)
    • 验证类型。 常见的是 "基本验证(Basic)"
    • 如果使用“基本验证”方案,凭证通过如下步骤生成:用冒号将用户名和密码进行拼接(如:aladdin:opensesame)。将第一步生成的结果用 base64 方式编码(YWxhZGRpbjpvcGVuc2VzYW1l)。
    • OAuth认证:对于Http来说,就是放在Authorization header中的不是用户名密码, 而是一个token.

GET

  • ie9的get请求有长度2048的限制

OPTIONS

  • 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。

HEAD

  • 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。

POST

  • 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。

PUT

  • 向指定资源位置上传其最新内容。

PATCH

  • 用来更新局部资源(相对于PUT而言)

DELETE

  • 请求服务器删除Request-URI所标识的资源。

TRACE

  • 回显服务器收到的请求,主要用于测试或诊断。

CONNECT

  • HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

————————————————————————————————————————————————————————————————————————————————————————————————————————————

缓存

  • 强缓存:用户发送的请求,直接从客户端缓存中获取,不发送请求到服务器,不与服务器发生交互行为。
  • 协商缓存:用户发送的请求,发送到服务器后,由服务器判定是否从缓存中获取资源。
  • 谷歌浏览器Network-Disable cache默认勾选(不显示从缓存中拿数据的接口),接口列表Size会显示缓存来源
    • (from memory cache)来至于内存?
    • (from disk cache)来至于硬盘?

浏览器根据请求头判定是否有缓存(强缓存)

  • 当Request Method为get时且Request URL相同时检查缓存中以下响应头
  • Expires: Sun, 03 Dec 2028 09:31:07 GMT 缓存过期时间,注意此处的时间都是指的是服务器的时间。(服务器时间和本地时间不同时容易造成现实和预期不同)
  • Cache-Control: max-age=315360000 可以看成是 Expires的补充。使用的是相对时间的概念。(优先级高于Expires)
    • no-store: 绝对禁止缓存。
    • no-cache: 指定不缓存响应,表明资源不进行缓存。但是设置了no-cache之后并不代表浏览器不缓存,而是在缓存前要向服务器确认资源是否被更改。(服务器怎么确认资源是否被更改?)
    • public:响应会被缓存,并且在多用户间共享。默认是public。(多个浏览器窗口能够共用这个缓存)
    • private: 响应只作为私有的缓存,不能在用户间共享。如果要求HTTP认证,响应会自动设置为private。(什么是HTTP认证?)
    • must-revalidate: 如果页面过期,则去服务器进行获取。
    • max-age: 设置缓存的最大的有效时间,单位为秒(s)。max-age会覆盖掉Expires。会导致再这一周期内不会更新数据,即使浏览器文件已经更新。
    • s-maxage: 只用于共享缓存,比如CDN缓存(s -> share)(CDN指:向中心平台发起请求,中心平台判断哪个服务器响应你的请求)。与max-age 的区别是:max-age用于普通缓存,而s-maxage用于代理缓存。如果存在s-maxage,则会覆盖max-age 和 Expires.(浏览器怎么判断一个缓存是否共享缓存?)

协商缓存

  • 以下请求头帮助服务器判断是否需要返回数据
  • If-Modified-Since:Mon, 10 Jul 2017 06:14:02 GMT #如果强缓存失效且有Last-modified(服务器端文件的最后修改时间)代入这个报头用于给服务器判断协商缓存中的数据是否在服务器上更新,没有的话返回304。如果修改过,则再次去服务器请求资源,返回码和首次请求相同为200,资源为服务器最新资源。这种方式并不完全可靠,因为如下原因
    • 某些服务器不能精确得到资源的最后修改时间,这样就无法通过最后修改时间判断资源是否更新
    • 如果资源修改非常频繁,在秒以下的时间内进行修改,而Last-modified只能精确到秒
    • 一些资源的最后修改时间改变了,但是内容没改变(增加了请求负担)
  • If-None-Match : W / "50b1c1d4f775c61:df3" #当强缓存检查失败并在缓存中有ETag存在时会把该像加入请求头中,由于给服务器检查数据实际内容是否更改。优先级高于If-Modified-Since,可以避免If-Modified-Since的缺陷
  • 协商缓存不一定会执行,只有当,有缓存-强缓存校验失败+过期缓存中有Last-modified或ETag时才会发起协商缓存请求。而且协商如果失败,反而会造成多发一次请求去请求数据。

————————————————————————————————————————————————————————————————————————————————————————————————————————————

网络

UDP

UDP 是一个面向报文(报文可以理解为一段段的数据)的协议。意思就是 UDP 只是报文的搬运工,不会对报文进行任何拆分和拼接操作。

  • 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了

    • 因为 UDP 没有 TCP 那么复杂,需要保证数据不丢失且有序到达。所以 UDP 的头部开销小,只有八字节,相比 TCP 的至少二十字节要少得多,在传输数据报文时是很高效的。
    • 1,2两个十六位的端口号,分别为源端口(可选字段)和目标端口
    • 3整个数据报文的长度
    • 4整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误
      • IPv4,是互联网协议(Internet Protocol,IP)的第四版,也是第一个被广泛使用,构成现今互联网技术的基础的协议。
  • 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作
  • UDP 是无连接的,也就是说通信不需要建立和断开连接。
  • UDP 也是不可靠的。协议收到什么数据就传递什么数据,并且也不会备份数据,对方能不能收到是不关心的
  • UDP 没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。
  • UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。

TCP

  • Sequence number,这个序号保证了 TCP 传输的报文都是有序的,对端可以通过序号顺序的拼接报文
  • Acknowledgement Number,这个序号表示数据接收端期望接收的下一个字节的编号是多少,同时也表示上一个序号的数据已经收到
  • Window Size,窗口大小,表示还能接收多少字节的数据,用于流量控制(原本每发1个数据包之前都需要等待上一个数据包返回收到确认,但这样很影响效率,所以设置这个值来指定在多少数据量范围内,不需要等待上一个数据包返回确认就可以依次发出,一旦出错才重发)
  • 标识符
    • URG=1:该字段为一表示本数据报的数据部分包含紧急信息,是一个高优先级数据报文,此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。
    • ACK=1:该字段为一表示确认号字段有效,为0表示报文中不包含确认信息,忽略确认号字段。此外,TCP 还规定在连接建立后传送的所有报文段都必须把 ACK 置为一。(接收端通过确认号告诉服务端哪些数据包接收成功?)
    • PSH=1:该字段为一表示接收端应该立即将数据 push 给应用层,而不是等到缓冲区满后再提交。
    • RST=1:该字段为一表示当前 TCP 连接出现严重问题,可能需要重新建立 TCP 连接,也可以用于拒绝非法的报文段和拒绝连接请求。
    • SYN=1:当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文。当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文。
    • FIN=1:该字段为一表示此报文段是一个释放连接的请求报文。

HTTP(搁置)的更多相关文章

  1. session的固化(搁置)

    Session在其生命周期中,可能会在运行时状态和持久化状态之间转换. 会话从运行时状态变为持久化状态的过程称为 -- 搁置:在以下情况下,Session会被搁置: 当服务器总之或单个Web应用终止时 ...

  2. IDEA_Shelve代码搁置与恢复

    日常开发中,经常会遇到在当前分支开发到一半,但是需要Checkout上个版本解决bug或调查问题的情况.这个时候,我们是将代码提到Push远程?还是直接Rollback? 最理想的做法,就是将当前的开 ...

  3. 是时候搁置Grunt,耍一耍gulp了

    也算是用了半年Grunt,几个月前也写过一篇它的入门文章(点此查看),不得不说它是前端项目的一个得力助手.不过技术工具跟语言一样日新月异,总会有更好用的新的东西把旧的拍死在沙滩上(当然Grunt肯定没 ...

  4. Hadoop 学习目录(搁置)

    简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.Hadoop实现了一个分布式文件系 ...

  5. .Net Core 学习目录(搁置)

    简介 .NET Core 是.NET Framework的新一代版本,是微软开发的第一个官方版本,具有跨平台 (Windows.Mac OSX.Linux) 能力的应用程序开发框架 (Applicat ...

  6. 搁置:vue-element-admin

    初衷 了解桌面应用类前端搭建的解决方案 -------------------------------------------------------------------------------- ...

  7. C#异步编程(一)

    异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,肯定会有很多不足之处, 希望大家照顾照顾新人,有错误之处可以指出来,我会虚心接受的. 何谓异步 与同步相对 ...

  8. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  9. 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)

    建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...

随机推荐

  1. idea14导入eclipse项目并部署运行完整步骤

    idea14导入eclipse项目并部署运行完整步骤 2015年05月12日 14:08:04 阅读数:40456 首先说明一下:idea里的project相当于eclipse里的workspace, ...

  2. 【Mysql】mysql使用触发器创建hash索引

    概述 若设计的数据表中,包含较长的字段,比如URL(通常都会比较长),查询时需要根据该字段进行过滤: select * from table_xxx where url = 'xxxxxxx'; 为了 ...

  3. Linux rpm包安装MySQL数据库问题总结

    1.安装包准备 2.按顺序安装以下安装包 一定要按顺序安装,因为前面的包是后面包的依赖 [root@iz2ze1bzpi3orra8lboxqiz mysql]# rpm -ivh Percona-S ...

  4. 延时队列:Java中的DelayQueue

    Java中的DelayQueue位于java.util.concurrent包下,本质是由PriorityQueue和BlockingQueue实现的阻塞优先级队列. 放入队列的元素需要实现java. ...

  5. hadoop集群部署

    1) 安装jdk 下载jdk-6u21-linux-i586.bin 然后修改/etc/profile: export JAVA_HOME=/usr/local/jdk export CLASSPAT ...

  6. HDOJ 2003 求绝对值

    #include<cstdio> #include<cmath> int main() { double a; while (scanf_s("%lf", ...

  7. Html5弹幕视频播放器插件

    Danmmu Player是一个具备弹幕功能的Html5视频播放器.我们在观看视频的时候,可以对视频发表自己的观点,当点击发送按钮后,发表的内容会在视频屏幕上以彩弹的形式发出,并做滚动展示动画效果,即 ...

  8. typescript泛型类 泛型方法

    /* 泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能. 在像C# ...

  9. Windows平台下使用CodeBlocks+GCC编译器生成动态dll,C#调用报错

    报无法加载dll错误,解决方法: 1) 编译选择设置成x86,即-m322) 必须在c#程序目录下加上libgcc_s_dw2-1.dll

  10. MySQL数据库order by 奇慢无比

    今天遇到个奇葩的问题, sql 数据量很大 有where 和order by,不加order by 速度很快,加了就很慢 一.首先我们对这条sql执行查询计划: explain select t.or ...