HTTP(Hypertext Transfer Protocol)是一种超文本传输协议,是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
网络是一个复杂的系统,不仅包含大量的应用程序、端系统、通信链路等,还有各种各样的协议组成。为了给网络协议的设计提供一个结构,网络设计者以分层的方式组织协议,每个协议属于层次模型之一。每一层都是向它的上一层提供服务(service),即所谓的服务模型(service model)。每个分层中所有的协议称为协议栈(protocol stack)
理论比较完整,但实用性不高
在实际中得到广泛应用
在学习计算机网络原理时采用的折中办法,即综合OSI和TCP/IP的优点,采用一种五层协议的体系结构
在互联网中,任何协议都不会单独的完成信息交换,HTTP 也一样。虽然 HTTP 属于应用层的协议,但是它仍然需要其他层次协议的配合完成信息的交换,那么在完成一次 HTTP 请求和响应的过程中,需要哪些协议的配合呢?
TCP/IP 我们一般称之为协议簇,什么意思呢?就是 TCP/IP 协议簇中不仅仅只有 TCP 协议和 IP 协议,它是一系列网络通信协议的统称。而其中最核心的两个协议就是 TCP / IP 协议,其他的还有 UDP、ICMP、ARP 等等,共同构成了一个复杂但有层次的协议栈。
应用层决定了向用户提供应用服务时通信的活动
TCP/IP协议簇内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统)服务就是其中两类
传输层对上层应用层提供处于网络连接中的两台计算机之间的数据传输,在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)
TCP 向它的应用程序提供了面向连接的服务,它能够控制并确认报文是否到达,并提供了拥塞机制来控制网络传输,因此当网络拥塞时,会抑制其传输速率
UDP 协议向它的应用程序提供了无连接服务。它不具备可靠性的特征,没有流量控制,也没有拥塞控制。我们把运输层的分组称为 报文段(segment)
网络层用来处理网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多选项内选择一条传输路线
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围内
从上图我们可以清晰的看到HTTP使用的传输层协议为TCP协议,而网络层使用的是IP协议(当然还使用了很多其他协议),所以说 HTTP是基于TCP/IP协议簇来传递数据。
TCP 协议的全称是 Transmission Control Protocol ,意思是传输控制协议,HTTP 使用 TCP 作为通信协议,这是因为 TCP 是一种可靠的协议,能保证数据不丢失。
IP 协议的全称是 Internet Protocol ,作用是把各种数据包传送给对方,而要保证传送到对方需要满足各种条件,其中两个重要的条件是IP地址和MAC地址
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可以变换,但MAC地址基本上不会更改
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部消息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去,这种把数据信息包装起来的做法称为封装
你有没有想过为什么你可以通过键入 www.bilibili.com 就能够获取你想要的网站?计算机网络中的每个端系统都有一个 IP 地址存在,而把 IP 地址转换为便于人类记忆的协议就是 DNS 协议
DNS(Domain Name System)的全称是域名系统,DNS服务是位于应用层的协议。它提供了域名到IP地址之间的解析服务。DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。
当我们输入一个地址访问一个网站时,输入的地址格式必须要满足 URI 的规范
URI用字符串标识某一互联网资源,而URL表示资源的地点
URL的全称是(Uniform Resource Locator),中文名称是统一资源定位符,表示资源的地点,也就是我们俗称的网址,它是 URI 的一个子集
URI(Uniform Resource Identifier)的中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源,URI就是某个协议方案表示的资源的定位标识符
表示指定的URI,要使用涵盖全部必要信息的绝对URI、绝对URL和相对URI
http://user:[email protected]:80/dir/index.htm?uid=1#ch1
http:// 协议方案名
user:pass 登录信息
www.example.jp 服务器地址
80 服务器端口号
dir/index.htm 带层次的文件路径
uid=1 查询字符串
ch1 片段标识符
HTTP 一般是明文传输,很容易被攻击者窃取重要信息,鉴于此,HTTPS 应运而生。HTTPS 的全称为 (Hyper Text Transfer Protocol over SecureSocket Layer),HTTPS 和 HTTP 有很大的不同在于 HTTPS 是以安全为目标的 HTTP 通道,在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在 HTTP 的基础上增加了 SSL 层,也就是说 HTTPS = HTTP + SSL
HTTP是一个基于TCP/IP协议簇来传递数据,所以这HTTP建立连接也就是建立TCP连接,TCP如何建立连接,先来看看TCP包信息结构
TCP报文包=TCP头信息+TCP数据体,而在TCP头信息中包含了6种控制位(上图红色框中),这六种标志位就代表着TCP连接的状态
URG:紧急数据(urgent data),这是一条紧急信息
ACK:确认已收到
PSH:提示接收端应用程序应该立即从tcp接收缓冲区中读走数据
RST:表示要求对方重新建立连接
SYN:表示请求建立一个连接
FIN:表示通知对方本端要关闭连接了
按层次分,TCP位于运输层,提供可靠的字节流服务
字节流服务是指为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理
为了准确无误地将数据送达目标处,TCP协议采用了三次握手策略,握手过程中使用了TCP的标志——SYN(synchronize)和ACK(acknowledgement)
1.客户端发送位码为SYN=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:
我要连接你)
2.服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),SYN=1,ACK=1,随机产生seq=7654321的包(服务器:
好的,你来连吧)
3.客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ACK是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ACK=1,服务器收到后确认seq值与ACK=1则连接建立成功(客户端:好的,我来了)
因为三次是最少的安全次数,两次不安全,四次浪费资源
随着HTTP的普及,文档中包含大量图片的情况多了起来,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销
为了解决上述问题,HTTP/1.1和一部分的HTTP/1.0想出了持久连接
特点:只要任意一端没有明确提出断开连接则保存TCP连接状态,即只要建立连接就能一次性发送所有请求的资源了
持久连接使得多数请求以管线化方式发送成为可能。以前发送请求后需等待并收到响应才能发送下一个请求,管线化技术使得能同时并行发送多个请求而不需要一个接一个地等待响应了
HTTP是无状态协议,无法根据之前的状态进行本次的请求处理
假设要求登录认证的Web页面本身无法进行状态的管理,那么每次跳转新页面就要再次登录,为了解决这个矛盾引进了Cookie技术
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态
用于HTTP协议交互的信息称为HTTP报文。请求端的HTTP报文叫做请求报文,响应端的叫做响应报文。HTTP报文本身是由多行数据构成的字符串文本
HTTP报文大致可分为报文首部和报文主体两部分,两者由最初出现的空行来划分。通常不一定有报文主体
报文首部:在客户端和服务器处理时起至关重要作用的信息几乎都在这边
报文主体:所需的用户和资源的信息都在这边
包含用于请求的方法,请求URI和HTTP版本
包含表明响应结果的状态码,原因短语和HTTP版本
包含表示请求和响应的各种条件和属性的各类首部,一般有四种首部:通用首部、请求首部、响应首部、实体首部
可能包含HTTP的RFC里未定义的首部(Cookie等)
请求报文实例:
GET/HTTP/1.1 请求行
-------------------------------------------------------------------------------------
Host:hackr.jp
USer-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, daflate
DNT: 1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache 各种首部字段
--------------------------------------------------------------------------------------
空行(CR+LF)
响应报文实例:
HTTP/1.1 200 OK 状态行
---------------------------------------------------------------------
Data: Fri, 13 Jul 2012 02:45:26 GMT
Server: Apache
Last-MOdified: Fri, 31 Aug 2007 02:02:20 GMT
ETag: "45bael-16a-46d776ac"
Accept-Ranges: bytes
Content-Length: 362
Connection: close
Content-Type: text/html 各种首部字段
---------------------------------------------------------------------
空行(CR+LF)
---------------------------------------------------------------------
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>hackr.jp</title>
</head>
<body>
<img src="hackr.gif" alt="hackr.jp" width="240" height="84" />
</body>
</html> 报文主体
方法的作用在于可以指定请求的资源按期望产生某种行为
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获得报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端是否正常、通知出现的错误等工作
状态码由三位数字和原因短语组成,如:200 OK
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
HTTP首部字段是构成HTTP报文的要素之一,在客户端和服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用
使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容
HTTP首部字段由首部字段名和字段值构成,中间用冒号分割
首部字段名:字段值,例如 Content-Type: text/html
另外,首部字段名可对应多个字段值,如下:
Keep-Alive: timeout=15, max=100
请求报文和响应报文双方都会使用的首部
从客户端向服务器发送请求报文时使用的首部。补充了请求的附加内容、客户信息、响应内容相关优先级等信息
从服务器向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐条首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言(自然语言) |
Authorization | Web认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与If-Match相反) |
If-Range | 资源未更新时发送实体Byte的范围请求 |
If-Unmodified-Since | 比较资源的更新时间 |
Max-Forwards | 最大传输逐条数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体的字节范围请求 |
Referer | 对请求中URI的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP客户端程序的信息 |
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接收字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的按照信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源最后修改 日期时间 |
【注】:本文参考博客:看完这篇HTTP,跟面试官扯皮就没问题了和一文搞懂HTTP协议(带图文)以及本文很多数据摘自书籍《图解HTTP》(上野宣 著)