HTTP
HTTP是一种超文本传输协议(Hypertext Transfer Protocol)
超文本
我们保存的信息通常都以文本即简单字符的形式存在,文本是一种能够被计算机解析的有意义的二进制数据包。而随着互联网的高速发展,两台电脑之间能够进行数据的传输后,人们不满足只能在两台电脑之间传输文字,还想要传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转,那么文本的语义就被扩大了,这种语义扩大后的文本就被称为超文本(Hypertext)。
传输
超文本会被解析成为二进制数据包,由传输载体(例如同轴电缆,电话线,光缆)负责把二进制数据包由计算机终端传输到另一个终端的过程成为传输
协议
这里只讲下网络协议。网络协议就是网络中(包括互联网)传递、管理信息的一些规范。
到这里可以总结下http就是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
与HTTP有关的组件
网络模型
网络是一个复杂的系统,不仅包括大量的应用程序、端系统、通信链路、分组交换机等,还有各种各样的协议组成。
为了给网络协议的设计提供一个结构,网络设计者以分层(layer) 的方式组织协议,每个协议属于层次模型之一。每一层都是向它的上一层提供服务(service),即所谓的服务模型(service model)。每个分层中所有的协议称为 协议栈(protocol stack)。因特网的协议栈由五个部分组成:物理层、链路层、网络层、运输层和应用层。
应用层
应用层是网络应用程序和网络协议存放的分层,包括很多协议,如HTTP,FTP,DNS等。应用层分布在多个端系统上,一个端系统应用程序与另外一个端系统应用程序交换信息分组,我们把位于应用层的信息分组称为 报文(message)。
运输层
因特网的运输层在应用程序断点之间传送应用程序报文,在这一层主要有两种传输协议TCP和UDP。
TCP 向它的应用程序提供了面向连接的服务,它能够控制并确认报文是否到达,并提供了拥塞机制来控制网络传输,因此当网络拥塞时,会抑制其传输速率。
UDP 协议向它的应用程序提供了无连接服务。它不具备可靠性的特征,没有流量控制,也没有拥塞控制。我们把运输层的分组称为报文段(segment)。
网络层
因特网的网络层负责将称为数据报(datagram)的网络分层从一台主机移动到另一台主机。网络层一个非常重要的协议是IP协议,所有具有网络层的因特网组件都必须运行IP协议,IP协议是一种网际协议,除了IP协议外,网络层还包括一些其他网际协议和路由选择协议,一般把网络层就称为IP层,由此可知IP协议的重要性。
链路层
为了将分组从一个节点(主机或路由器)运输到另一个节点,网络层必须依靠链路层提供服务。链路层的例子包括以太网、WiFi和电缆接入的DOCSIS协议。因为数据从源目的地传送通常需要经过几条链路,一个数据包可能被沿途不同的链路层协议处理,我们把链路层的分组称为帧(frame)。
物理层
虽然链路层的作用是将帧从一个端系统运输到另一个端系统,而物理层的作用是将帧中的一个个比特从一个节点运输到另一个节点,物理层的协议仍然适用链路层协议,这些协议与实际的物理传输介质有关,例如,以太网有很多物理层协议:关于双绞铜线、关于同轴电缆、关于光纤等等。
OSI模型
表示层
数据压缩和数据加密以及数据描述,数据描述使得应用程序不必担心计算机内部存储格式的问题。
会话层
提供了数据交换的定界和同步功能,包括建立检查点和恢复方案。
浏览器
浏览器正式的名字叫做Web Broser,是检索、查看互联网上网页资源的应用程序,Web,实际上指的就是 World Wide Web,也就是万维网。
web服务器
Web服务器的正式名称叫做 Web Server,Web服务器一般指的是网站服务器,上面说到浏览器是HTTP请求的发起方,那么 Web 服务器就是 HTTP 请求的应答方,Web服务器可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个Web服务器是Apache、 Nginx 、IIS。
CDN
CDN的全称是Content Delivery Network,即内容分发网络。它应用了HTTP协议里的缓存和代理技术,代替源站响应客户端的请求。CDN是构建在现有网络基础之上的网络,它依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
WAF
WAF是一种Web应用程序防护系统(Web Application Firewall),它是一种通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品,它是应用层面的防火墙,专门检测HTTP流量,是防护Web应用的安全技术。
WebService
WebService是一种Web应用程序,WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
HTML
HTML 称为超文本标记语言,是一种标识性的语言。
与 HTTP 有关的协议
TCP/IP
TCP/IP 我们一般称之为协议簇,TCP/IP协议簇中不仅仅只有TCP协议和IP协议,它是一系列网络通信协议的统称。
TCP 协议的全称是 Transmission Control Protocol的缩写,意思是传输控制协议,HTTP使用TCP作为通信协议,这是因为TCP是一种可靠的协议,而可靠能保证数据不丢失。
IP 协议的全称是 Internet Protocol的缩写,它主要解决的是通信双方寻址的问题。IP 协议使用IP地址 来标识互联网上的每一台计算机,可以把IP地址想象成为你手机的电话号码,你要与他人通话必须先要知道他人的手机号码,计算机网络中信息交换必须先要知道对方的IP地址。(关于TCP和IP更多的讨论我们会在后面详解)
DNS
计算机网络中的每个端系统都有一个IP地址存在,而把IP地址转换为便于人类记忆的协议就是DNS协议。
DNS 的全称是域名系统(Domain Name System,缩写:DNS),它作为将域名和IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
URI / URL
URI的全称是(Uniform Resource Identifier),中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源。
URL的全称是(Uniform Resource Locator),中文名称是统一资源定位符,也就是我们俗称的网址,它实际上是 URI 的一个子集。
HTTPS
HTTP 一般是明文传输,很容易被攻击者窃取重要信息,鉴于此,HTTPS 应运而生。HTTPS 的全称为 (Hyper Text Transfer Protocol over SecureSocket Layer),全称有点长,HTTPS 和 HTTP 有很大的不同在于 HTTPS 是以安全为目标的 HTTP 通道,在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在 HTTP 的基础上增加了 SSL 层,也就是说 HTTPS = HTTP + SSL。(这块我们后面也会详谈 HTTPS)
HTTP 请求响应过程
我们假设访问的URL地址为http://www.jiangtong.com/someDepartment/home.index,当我们输入网址并点击回车时,浏览器内部会进行如下操作:
- DNS服务器首先会进行域名的映射,找到访问http://www.jiangtong.com的地址,然后http客户端进程在80端口发起一个服务器到http://www.jiangtong.com的TCP连接(80是HTTP的默认端口)。在客户端和服务器进程中都会有一个套接字与其相连。
- HTTP客户端通过它的套接字向服务器发送一个HTTP请求报文,该报文中包含了路径/someDepartment/home.index的资源。
- HTTP服务器通过它的套接字接受该报文,进行请求的解析工作,并从其存储器(RAM 或磁盘)中检索出对象http://www.jiangtong.com/someDepartment/home.index,然后把检索出来的对象进行封装,封装到HTTP响应报文中,并通过套接字向客户进行发送。
- HTTP服务器随机通知TCP断开TCP连接,实际上是需要等到客户接受完响应报文后才会断开 TCP 连接。
- HTTP客户端接受完响应报文后,TCP连接会关闭。HTTP客户端从响应中提取出报文中是一个HTML响应文件,并检查该HTML文件,然后循环检查报文中其他内部对象。
- 检查完成后,HTTP客户端会把对应的资源通过显示器呈现给用户。
详解HTTP请求报文
www.example.com:80/path/to/myf…
http:http:// 告诉浏览器使用何种协议。对于大部分 Web 资源,通常使用 HTTP 协议或其安全版本,HTTPS 协议。另外,浏览器也知道如何处理其他协议。例如, mailto: 协议指示浏览器打开邮件客户端;ftp:协议指示浏览器处理文件传输。
主机:www.example.com既是一个域名,也代表管理该域名的机构。它指示了需要向网络上的哪一台主机发起请求。当然,也可以直接向主机的 IP address 地址发起请求。但直接使用 IP 地址的场景并不常见。
端口:80,两个主机之间要发起TCP连接需要两个条件,主机 + 端口。
路径:/path/to/myfile.html 是 Web 服务器上资源的路径。以端口后面的第一个 / 开始,到 ? 号之前结束,中间的 每一个/ 都代表了层级(上下级)关系。这个 URL 的请求资源是一个 html 页面。
查询参数:?key1=value1&key2=value2 是提供给 Web 服务器的额外参数。
锚点:#SomewhereInTheDocument是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”,它给予浏览器显示位于该“加书签”点的内容的指示。
请求分析
请求头部
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
Host: 对象所在的主机
Connection: close 表示的是浏览器需要告诉服务器使用的是非持久连接
User-agent: 这是请求头用来告诉 Web 服务器,浏览器使用的类型是 Mozilla/5.0,即 Firefox 浏览器
Accept-language告诉Web服务器,浏览器想要得到对象的法语版本,前提是服务器需要支持法语类型,否则将会发送服务器的默认版本。
HTTP 的请求标头分为四种: 通用标头、请求标头、响应标头 和 实体标头。
通用标头
通用标头主要有三个,分别是 Date、Cache-Control 和 Connection
Date: 基本格式Date: Wed, 21 Oct 2015 07:28:00 GMT
Cache-Control: 可以出现在请求标头和响应标头中。取值
- max-age: 资源被认为仍然有效的最长时间,与Expires不同,这个请求是相对于request标头的时间,而 Expires 是相对于响应标头。 (请求标头)
- s-maxage:重写了max-age和Expires请求头,仅仅适用于共享缓存,被私有缓存所忽略, (请求标头)
- max-state:表示客户端将接受的最大响应时间,以秒为单位。 (响应标头)
- min-fresh: 表示客户端希望响应在指定的最小时间内有效。(响应标头)
Connection:Connection决定当前事务(一次三次握手和四次挥手)完成后,是否会关闭网络连接。分为close和keep-alive两种。
HTTP1.1通用标头实体标头
实体标头是描述消息正文内容的 HTTP 标头。实体标头用于 HTTP 请求和响应中。头部Content-Length、 Content-Language、 Content-Encoding 是实体头。
Content-Length:实体报头指示实体主体的大小,以字节为单位,发送到接收方。
Content-Language:实体报头描述了客户端或者服务端能够接受的语言,例如Content-Language: de-DE。
Content-Encoding:实体报头用来压缩媒体类型。如gzip、compress、deflate、identity等。
实体标头字段请求标头
GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0
Host
Host 请求头指明了服务器的域名(对于虚拟主机来说),以及(可选的)服务器监听的TCP端口号。如果没有给定端口号,会自动使用被请求服务的默认端口(比如请求一个 HTTP 的 URL 会自动使用80作为端口)。
Host: developer.mozilla.org
Referer
HTTP Referer 属性是请求标头的一部分,当浏览器向web服务器发送请求的时候,一般会带上 Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
Upgrade-Insecure-Requests
Upgrade-Insecure-Requests是一个请求标头,用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应。
If-Modified-Since
HTTP 的 If-Modified-Since 使其成为条件请求:
- 返回200,只有在给定日期的最后一次修改资源后,服务器才会以200状态发送回请求的资源。
- 如果请求从开始以来没有被修改过,响应会返回304并且没有任何响应体。 If-Modified-Since通常与If-None-Match搭配使用,If-Modified-Since用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段Last-Modified来确定。
大白话说就是如果在Last-Modified之后更新了服务器资源,那么服务器会响应200,如果在Last-Modified之后没有更新过资源,则返回 304。
If-None-Match
If-None-Match Http请求标头使请求成为条件请求,对于GET和HEAD方法,仅当服务器没有与给定资源匹配的ETag时,服务器才会以200状态发送回请求的资源。对于其他方法,仅当最终现有资源的ETag与列出的任何值都不匹配时,才会处理请求。
内容协商的分类有很多种,主要的几种类型是Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。
Accept
接受请求 HTTP 标头会通告客户端其能够理解的 MIME 类型。一般 MIME 类型也会和 q 这个属性一起使用,q 是什么?q 表示的是权重,来看一个例子
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
这是什么意思呢?若想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值,没有显示权重的时候默认值是1.0 ,我给你列个表格你就明白了
Accept-Charset
accept-charset 属性规定服务器处理表单数据所接受的字符集。此属性的默认值是 unknown,表示表单的字符集与包含表单的文档的字符集相同。常用的字符集有:UTF-8 - Unicode 字符编码 ;ISO-8859-1 - 拉丁字母表的字符编码
Accept-Language
首部字段Accept-Language用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。和Accept首部字段一样,按权重值 q来表示相对优先级。
响应标头
响应标头是可以在 HTTP 响应种使用的 HTTP 标头。
200 OK
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Mon, 18 Jul 2016 16:06:00 GMT
Etag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"
Keep-Alive: timeout=5, max=997
Last-Modified: Mon, 18 Jul 2016 02:36:04 GMT
Server: Apache
Set-Cookie: mykey=myvalue; expires=Mon, 17-Jul-2017 16:06:00 GMT; Max-Age=31449600; Path=/; secure
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
x-frame-options: DENY
响应状态码
以 2xx 为开头的都表示请求成功响应。
Access-Control-Allow-Origin
一个返回的 HTTP 标头可能会具有Access-Control-Allow-Origin,Access-Control-Allow-Origin 指定一个来源,它告诉浏览器允许该来源进行资源访问。否则-对于没有凭据的请求 *通配符,告诉浏览器允许任何源访问资源。例如,要允许源https://mozilla.org 的代码访问资源,可以指定:
Access-Control-Allow-Origin: https://mozilla.org
Vary: Origin
如果服务器指定单个来源而不是 *通配符的话 ,则服务器还应在 Vary 响应标头中包含 Origin ,以向客户端指示服务器响应将根据原始请求标头的值而有所不同。
Keep-Alive
上面我们提到,HTTP 报文标头会分为四种,这其实是按着上下文来分类的还有一种分类是根据代理进行分类,根据代理会分为端到端头和逐跳标头而Keep-Alive表示的是Connection非持续连接的存活时间,如下
Connection: Keep-Alive
Keep-Alive: timeout=5, max=997
Keep-Alive 有两个参数,它们是以逗号分隔的参数列表,每个参数由一个标识符和一个由等号 = 分隔的值组成。
timeout:指示空闲连接必须保持打开状态的最短时间(以秒为单位)。
max:指示在关闭连接之前可以在此连接上发送的最大请求数。
Server
服务器标头包含有关原始服务器用来处理请求的软件的信息。
Set-Cookie
Transfer-Encoding
首部字段Transfer-Encoding规定了传输报文主体时采用的编码方式。
X-Frame-Options
首部字段 X-Frame-Options 属于 HTTP 响应首部,用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。
参考资料: 看完这篇HTTP,跟面试官扯皮就没问题了