HTTP协议 2021-06-05

一、认识HTTP

什么是HTTP

HTTP(Hypertext Transfer Protocol)是一种超文本传输协议,是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

HTTP协议的特点

  1. 支持客户/服务器模式
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径
  3. 灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记
  4. 无连接:限制每次连接只处理一个请求,服务器完成客户请求并受到客户应答后即断开连接,这种方式可以节省传输时间
  5. 无状态:协议对于事务处理没有记忆能力,服务器不指定客户端是什么状态,即服务器对我们的请求进行处理但不会记录任何数据

二、网络模型

了解网络模型

网络是一个复杂的系统,不仅包含大量的应用程序、端系统、通信链路等,还有各种各样的协议组成。为了给网络协议的设计提供一个结构,网络设计者以分层的方式组织协议,每个协议属于层次模型之一。每一层都是向它的上一层提供服务(service),即所谓的服务模型(service model)。每个分层中所有的协议称为协议栈(protocol stack)

三种计算机网络协议的分层

  • OSI的七层协议体系结构

理论比较完整,但实用性不高

HTTP协议 2021-06-05_第1张图片

  • TCP/IP的四层体系结构

在实际中得到广泛应用

HTTP协议 2021-06-05_第2张图片

  • 五层协议体系结构

在学习计算机网络原理时采用的折中办法,即综合OSI和TCP/IP的优点,采用一种五层协议的体系结构

HTTP协议 2021-06-05_第3张图片


三、与HTTP有关的协议

在互联网中,任何协议都不会单独的完成信息交换,HTTP 也一样。虽然 HTTP 属于应用层的协议,但是它仍然需要其他层次协议的配合完成信息的交换,那么在完成一次 HTTP 请求和响应的过程中,需要哪些协议的配合呢?

TCP/IP协议簇

TCP/IP 我们一般称之为协议簇,什么意思呢?就是 TCP/IP 协议簇中不仅仅只有 TCP 协议和 IP 协议,它是一系列网络通信协议的统称。而其中最核心的两个协议就是 TCP / IP 协议,其他的还有 UDP、ICMP、ARP 等等,共同构成了一个复杂但有层次的协议栈。

  • TCP/IP的分层管理
  1. 应用层

应用层决定了向用户提供应用服务时通信的活动

TCP/IP协议簇内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统)服务就是其中两类

  1. 传输层

传输层对上层应用层提供处于网络连接中的两台计算机之间的数据传输,在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)

TCP 向它的应用程序提供了面向连接的服务,它能够控制并确认报文是否到达,并提供了拥塞机制来控制网络传输,因此当网络拥塞时,会抑制其传输速率

UDP 协议向它的应用程序提供了无连接服务。它不具备可靠性的特征,没有流量控制,也没有拥塞控制。我们把运输层的分组称为 报文段(segment)

  1. 网络层

网络层用来处理网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多选项内选择一条传输路线

  1. 链路层

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围内

HTTP协议 2021-06-05_第4张图片

从上图我们可以清晰的看到HTTP使用的传输层协议为TCP协议,而网络层使用的是IP协议(当然还使用了很多其他协议),所以说 HTTP是基于TCP/IP协议簇来传递数据。

  • TCP协议

TCP 协议的全称是 Transmission Control Protocol ,意思是传输控制协议,HTTP 使用 TCP 作为通信协议,这是因为 TCP 是一种可靠的协议,能保证数据不丢失。

  • IP协议

IP 协议的全称是 Internet Protocol ,作用是把各种数据包传送给对方,而要保证传送到对方需要满足各种条件,其中两个重要的条件是IP地址和MAC地址

IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可以变换,但MAC地址基本上不会更改

  • 工作原理

发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部消息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去,这种把数据信息包装起来的做法称为封装

HTTP协议 2021-06-05_第5张图片

DNS协议

你有没有想过为什么你可以通过键入 www.bilibili.com 就能够获取你想要的网站?计算机网络中的每个端系统都有一个 IP 地址存在,而把 IP 地址转换为便于人类记忆的协议就是 DNS 协议

DNS(Domain Name System)的全称是域名系统,DNS服务是位于应用层的协议。它提供了域名到IP地址之间的解析服务。DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。

URI/URL协议

当我们输入一个地址访问一个网站时,输入的地址格式必须要满足 URI 的规范

URI用字符串标识某一互联网资源,而URL表示资源的地点

  • URL

URL的全称是(Uniform Resource Locator),中文名称是统一资源定位符,表示资源的地点,也就是我们俗称的网址,它是 URI 的一个子集

  • URI

URI(Uniform Resource Identifier)的中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源,URI就是某个协议方案表示的资源的定位标识符

  • 关系图

HTTP协议 2021-06-05_第6张图片

  • 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  			片段标识符

HTTPS协议

HTTP 一般是明文传输,很容易被攻击者窃取重要信息,鉴于此,HTTPS 应运而生。HTTPS 的全称为 (Hyper Text Transfer Protocol over SecureSocket Layer),HTTPS 和 HTTP 有很大的不同在于 HTTPS 是以安全为目标的 HTTP 通道,在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在 HTTP 的基础上增加了 SSL 层,也就是说 HTTPS = HTTP + SSL

各种协议与HTTP协议的关系

HTTP协议 2021-06-05_第7张图片


四、建立TCP连接

TCP包头信息

HTTP是一个基于TCP/IP协议簇来传递数据,所以这HTTP建立连接也就是建立TCP连接,TCP如何建立连接,先来看看TCP包信息结构

HTTP协议 2021-06-05_第8张图片

TCP报文包=TCP头信息+TCP数据体,而在TCP头信息中包含了6种控制位(上图红色框中),这六种标志位就代表着TCP连接的状态

  • URG:紧急数据(urgent data),这是一条紧急信息

  • ACK:确认已收到

  • PSH:提示接收端应用程序应该立即从tcp接收缓冲区中读走数据

  • RST:表示要求对方重新建立连接

  • SYN:表示请求建立一个连接

  • FIN:表示通知对方本端要关闭连接了

建立连接过程

按层次分,TCP位于运输层,提供可靠的字节流服务

字节流服务是指为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理

  • 三次握手

为了准确无误地将数据送达目标处,TCP协议采用了三次握手策略,握手过程中使用了TCP的标志——SYN(synchronize)和ACK(acknowledgement)

HTTP协议 2021-06-05_第9张图片

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建立连接需要三次握手?

因为三次是最少的安全次数,两次不安全,四次浪费资源

HTTP的连接

  • HTTP协议的初始版本中,每执行一次HTTP通信就要断开一次TCP连接

HTTP协议 2021-06-05_第10张图片

  • 持久连接

随着HTTP的普及,文档中包含大量图片的情况多了起来,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销

为了解决上述问题,HTTP/1.1和一部分的HTTP/1.0想出了持久连接

特点:只要任意一端没有明确提出断开连接则保存TCP连接状态,即只要建立连接就能一次性发送所有请求的资源了

  • 管线化

持久连接使得多数请求以管线化方式发送成为可能。以前发送请求后需等待并收到响应才能发送下一个请求,管线化技术使得能同时并行发送多个请求而不需要一个接一个地等待响应了

  • 使用Cookie的状态管理

HTTP是无状态协议,无法根据之前的状态进行本次的请求处理

假设要求登录认证的Web页面本身无法进行状态的管理,那么每次跳转新页面就要再次登录,为了解决这个矛盾引进了Cookie技术

Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态


五、HTTP报文内的HTTP信息

HTTP报文

用于HTTP协议交互的信息称为HTTP报文。请求端的HTTP报文叫做请求报文,响应端的叫做响应报文。HTTP报文本身是由多行数据构成的字符串文本

HTTP报文大致可分为报文首部和报文主体两部分,两者由最初出现的空行来划分。通常不一定有报文主体

报文首部:在客户端和服务器处理时起至关重要作用的信息几乎都在这边

报文主体:所需的用户和资源的信息都在这边

HTTP协议 2021-06-05_第11张图片

请求报文及响应报文的结构

HTTP协议 2021-06-05_第12张图片

  • 请求行

包含用于请求的方法,请求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方法

方法的作用在于可以指定请求的资源按期望产生某种行为

方法 说明 支持的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状态码负责表示客户端HTTP请求的返回结果、标记服务器端是否正常、通知出现的错误等工作

状态码由三位数字和原因短语组成,如:200 OK

  • 数字中的第一位指定了响应类型,后两位无分类,响应类型有以下5种
类别 原因短语
1XX Informational(信息性状态码) 接收的请求正在处理
2XX Success(成功状态码) 请求正常处理
3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器错误状态码) 服务器处理请求出错
  • 下面介绍14个常用的状态码

HTTP协议 2021-06-05_第13张图片

HTTP首部字段

HTTP首部字段是构成HTTP报文的要素之一,在客户端和服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用

使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容

  • 首部字段结构

HTTP首部字段由首部字段名和字段值构成,中间用冒号分割

首部字段名:字段值,例如 Content-Type: text/html

另外,首部字段名可对应多个字段值,如下:

Keep-Alive: timeout=15, max=100
  • 四种HTTP首部字段类型
  1. 通用首部字段(General Header Fields)

请求报文和响应报文双方都会使用的首部

  1. 请求首部字段(Request Header Fields)

从客户端向服务器发送请求报文时使用的首部。补充了请求的附加内容、客户信息、响应内容相关优先级等信息

  1. 响应首部字段(Response Header Fields)

从服务器向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息

  1. 实体首部字段(Entity Header Fields)

针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息

  • HTTP/1.1 的47种首部字段
  1. 通用首部字段
首部字段名 说明
Cache-Control 控制缓存的行为
Connection 逐条首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知
  1. 请求首部字段
首部字段名 说明
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客户端程序的信息
  1. 响应首部字段
首部字段名 说明
Accept-Ranges 是否接收字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次发起请求的时机要求
Server HTTP服务器的按照信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息
  1. 实体首部字段
首部字段名 说明
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小(单位:字节)
Content-Location 替代对应资源的URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体主体过期的日期时间
Last-Modified 资源最后修改 日期时间

【注】:本文参考博客:看完这篇HTTP,跟面试官扯皮就没问题了和一文搞懂HTTP协议(带图文)以及本文很多数据摘自书籍《图解HTTP》(上野宣 著)

你可能感兴趣的:(Java学习笔记)