HTTP于1990年问世,那时候HTTP并没有作为正式的标准被建立,被称为HTTP/0.9
HTTP正式作为标准被公布是在1996年5月,版本被命名为HTTP/1.0,该协议至今仍被广泛用在服务器端。
HTTP/1.1于1997年1月公布,是目前主流的HTTP协议版本。
HTTP/2.0正在制定中。
TCP/IP不是某个协议,而是互联网相关的各类协议族的总称。详细内容参见TCP/IP详解学习笔记
TCP/IP协议族按层次分别为以下4层:
应用层:决定了向用户提供应用服务时的通信活动,该层包括FTP DNS HTTP
传输层:对上层应用层,提供处于网络连接中的两台计算机之间的数据传输,该层包括TCP UDP
网络层:用来处理在网络上流动的数据包,该层规定了通过怎样的路径达到对方计算机并把数据包传送给对方
链路层:用来处理连接网络的硬件部分,网卡 光纤
TCP/IP通信传输流程(http举例)
首先作为发送端的客户端在应用层(http协议)发出一个想看某个web页面的http请求。接着,为了传输的方便,在传输层(tcp协议)把从应用层处收到的数据(http请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。在网络层(ip协议)增加作为通信目的地的MAC地址后转发给链路层。这样,发往网络的通信请求就齐全了。
IP协议的作用是把各种数据包传送给对方
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址
TCP协议为了更容易送达大数据才把数据分割,采用三次握手策略确保数据最终送达对方
三次握手策略:
发送端首先发送一个带SYN(synchronize)标志的数据包给对方,接收端收到后回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后发送端再回传一个带ACK(acknowledgement)标志的数据包代表握手结束。
DNS提供域名到IP地址之间的解析服务
按流程顺序分别为:
DNS服务:把用户输入的域名解析为IP地址
HTTP协议:生成针对目标web服务器的HTTP请求报文
TCP协议:为了方便通信将HTTP请求报文分割成报文段,把每个报文段可靠的传给对方
IP协议:搜索对方的地址,一边中转一边传送
TCP协议:从对方那里接收报文段并按序号从组请求报文
HTTP协议:对web服务器请求的内容的处理
URI(Uniform Resource Identifier)某个协议方案的资源的定位标识符
URL(Uniform Resource Locator)表示互联网资源的具体地点
请求报文是由请求方法、请求URI、协议版本、可选的请求头部字段和内容实体构成的。
响应报文基本上是由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段及实体主体构成。
HTTP协议自身不对请求和响应之间的通信状态进行保存
GET:用来访问已被URI识别的资源
POST:用来传输实体的主体
GET方法和POST方法的区别:
安全性
数据长度:
GET请求能够被缓存,以GET请求的URL能够保存为浏览器书签,而POST请求则都不能
Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
以下其他方法均不常用
PUT:传输文件 HEAD:获得报文首部 DELETE:删除文件 OPTUIONS:询问支持的方法 TRACK:追踪路径 CONNECT:要求用隧道协议连接代理
持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻服务器端荷载。在HTTP/1.1中所有连接默认都是持久连接
持久连接使得多数请求以管线化方式发送,即能同时并行发送多个请求。
cookie技术是通过在请求和响应报文中写入cookie信息来控制客户端的状态
Cookie会根据从服务器发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。服务器端接收到客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
HTTP报文大致可分为报文首部和报文主体两块,两者有最初出现的空行来划分,通常并不一定要有报文主体
请求行:包含用于请求的方法,请求URI和HTTP版本
状态行:包含响应结果的状态码,原因短语和HTTP版本
首部字段:包含表示请求和响应的各种条件和属性的各类首部,一般分别为:通用首部、请求首部、响应首部和实体首部。
其他:包含HTTP的RFC里未定义的首部(Cookie等)
常用的内容编码方式有以下几种:
执行范围请求时,会用到首部字段Range来指定资源的byte范围
针对范围请求,响应会返回状态码为206 Partial Content的响应报文
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。如首部字段中的Accept、Accept-Charset、Accept-Enoding、Accept-Language、Content-Language
1XX | informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作已完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器端错误状态码) | 服务器处理请求出错 |
200 OK 表示从客户端发来的请求在服务器端被正常处理
204 No Content 表示服务器接收的请求已成功处理,但返回的响应报文中不允许返回任何实体的主体部分
206 Partial Content 表示客户端进行了范围请求,服务器成功执行了这部分GET请求
304 Not Modified 表示客户端发送附带条件的GET请求时,其访问的资源(自上次访问以来或者根据请求的条件)未变化
401 Bad Request 表示报文中存在语法错误
403 Forbidden 表示对请求资源的访问被服务器拒绝了
404 Not Found 表示服务器上无法找到请求的资源
501 Internet Sever Error 表示服务器端在执行请求时发生了错误
503 Service Unavailable 表示服务器暂时处于超负荷或正在停机维护,现无法处理请求
在相同的IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI
代理服务器的基本行为接收客户端发送的请求后转发给其他服务器,代理不改变请求URI,转发时需要附加Via首部字段已标记出经过的主机信息。
使用代理服务器的理由:
网关能使通信线路上的服务器提供非HTTP服务(SQL数据查询)
隧道的目的是确保客户端能与服务器进行安全的通信
通用首部字段
Cache-Control | 控制缓存的行为 |
Cache-Control | 逐跳首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
请求首部字段
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言 |
Authorization | web认证信息 |
Expect | 期待服务器的特定行为 |
Form | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
if-Match | 比较实体标记ETag |
if-None-Math | 比较实体标记 |
if-Modified-Since | 比较资源的更新时间 |
if-Unmodified-Since | 比较资源的更新时间 |
if-Range | 资源未更新时发送实体byte的范围请求 |
Max-Forwards | 最大传输逐跳数 |
Proy-Authorization | 代理服务器要求的客户端认证信息 |
Referer | 对请求中URI的原始获取方 |
Range | 实体的字节范围请求 |
TE | 传输编码的优先级 |
User-Agent | http客户端程序的信息 |
响应首部字段
Accept-Range | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Petry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体首部字段
HTTPS并非应用层的一种新协议,只是HTTP通信接口部分用SSL和TLS协议代替而已,其实就是身披SSL协议这层外壳的HTTP
SSL采用一种叫做公开密钥加密的加密处理方式
公开密钥加密使用一对非对称的密钥,私有密钥和公开密钥,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密
公开密钥加密处理起来比共享密钥加密方式更为复杂,因此若在通信时使用公开密钥加密方式,效率会很低。所以HTTPS采用采用共享密钥加密和公开密钥加密两者并用的混合加密机制
混合加密机制原理:
http瓶颈:
消除http瓶颈方法尝试:
WebSocket协议主要特点:
为了实现WebSocket通信需要将Http的Upgrade首部字段值设为websocket,对于之前的握手请求,返回状态码101 Switching Proticols.成功握手确立WebSocket连接之后,不再使用HTTP的数据帧,而采用WebSocket独立数据帧
WebSocket API
javascript可调用“The Websocket API”内提供的websocket程序接口,以实现websocket协议下双全工通信