1. HTTP概况
1.1 一些术语
基本概念
- Web页面:(也叫文档)由一些对象组成。
- 对象:可以是HTML,JPEG图像,Java小程序,声音剪辑文件等。
- Web页面含有一个基本的HTML文件,该HTML文件又包含若干对象的引用(
链接
)。web网页嵌套着许多对象的链接,而不是对象本身。
web页面的对象数量 = HTML基本文件+其他(图像,视频等)个数 - 通过
URL
对每个对象进行引用(访问)
访问协议,用户名,口令,端口等
WWW
URL
- 定义:
统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序(www)上用于指定信息位置的表示方法 - 格式:URL的一般语法格式为:
protocol :// hostname[:port] / path / [:parameters][?query]#fragment
其中带方括号的为可选项
- protocol(协议):用于指定所使用的协议,例如常用的协议名有:HTTP (超文本传输协议),HTTPS(安全超文本传输协议),FTP (文件传输协议),FTPS (安全文件传输协议),SFTP (SSH 文件传输协议)等等。
HTTPS,是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。它使用安全套接字层(SSL)进行信息交换,因此加密的详细内容就需要SSL。
https://前缀的URL是使用 SSL/TLS 安全协议,在请求和响应之间进行加密。
HTTPS协议的主要作用是将http协议进行加密,通过建立安全通道来保证数据传输的安全。
在HTTPS通信过程中,使用了数字证书来进行身份验证和加密通信。
数字证书是由可信任的第三方机构颁发的,用于验证通信双方的的身份是否合法。
HTTPS使用的是443端口号,而不是像HTTP使用的80端口号。
- hostname(主机名):是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。部分网站支持匿名访问,有些则需要输入用户名与口令才能访问。
在主机名前包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。
- port(端口号):用于指定资源所在的端口号。
默认情况下,HTTP 使用的端口号是80,HTTPS 使用的端口号是443。
在标准的 URL 语法中,端口号是放在主机名后面的,而不是放在 URL 的最后面。例如,以下是一个包含端口号的 URL:
http://www.example.com:8080/index.html
在这个例子中,主机名为 www.example.com,端口号为 8080,路径为 /index.html。
然而,有些非标准的 URL 可能会将端口号放在最后面,但这并不是标准的 URL 语法。这样的 URL 可能在某些特定情况下能够正常工作,但在大多数情况下可能会导致问题。
因此,建议遵守标准的 URL 语法规范,将端口号放在主机名后面。
- path(路径):用于指定资源所在的路径,即文件或目录的相对路径。
- parameters(查询参数):用于指定一些查询参数,以便在请求时向服务器传递一些额外的信息。
- query(查询):
可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。 - fragment(片段标识符):用于指定资源的一部分,例如视频中的时间戳或文档中的页码等等。
1.2 HTTP概述
“超文本”(Hyper Text,HT )是超级文本的中文缩写。
- 超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。显示文本及与文本之间相关的内容。
- 其中的文字包含有可以链结到其他位置或者文档的连结,将不同
对象
通过超链接连接在一起形成网状结构,允许从当前阅读位置直接切换到超文本连结所指向的位置。
超文本传输协议(Hypertext Transfer Protocol,HTTP)
- 简单的请求-响应协议
- 它通常运行在TCP之上。
- 默认端口:80端口
- 它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
请求和响应消息的头以ASCII形式给出
;- 消息内容则具有一个类似MIME的格式。
- 套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象
- TCP(Transmission Control Protocol):是一种可靠的、面向连接的传输协议,可以实现数据包的可靠传输和流量控制等功能。
- UDP(User Datagram Protocol):
是一种不可靠的无连接协议,可以实现快速数据传输,但可能会存在数据丢失等问题。
- 面向无连接的服务
指通信双方不需要事先建立一条通信线路,而是把每个带有目的地址的包(报文分组)送到线路上,由系统自主选定路线进行传输- 面向连接的服务
通信双方在通信时,要事先建立一条通信线路,其过程有建立连接、使用连接和释放连接三个过程在计算机网络中,有状态和无状态是指网络协议是否保存网络连接状态的信息。
1.无状态协议是指协议不保存关于网络连接状态的信息。无状态协议不对先前请求或响应进行记录,每次请求都需要提供完整的信息。例如,HTTP协议就是一个无状态的协议,它不会保存客户端发送的请求信息,每个请求都是独立的。
2.有状态协议则是指协议保存关于网络连接状态的信息。有状态协议会对先前的请求或响应进行记录,以便后续处理。例如,FTP协议就是一个有状态的协议,它会在服务器端保存客户端的连接状态信息,以便后续处理。
在计算机网络中,有状态和无状态协议各有优缺点。无状态协议可以更好地支持并发处理和负载均衡,因为无状态协议不会保存连接状态信息,因此更容易实现多个请求的处理,同样的服务器资源条件下支持用户数量更多。
而有状态协议则可以更好地支持需要保存连接状态信息的场景,例如需要保持会话的Web应用程序。
需要注意的是,有状态协议如果处理不当容易受到攻击,例如FTP服务器的匿名访问权限容易导致FTP服务器被攻击。因此,在实际应用中需要根据具体情况选择合适的协议。
2. HTTP连接
HTTP连接分为 持续(持久)连接
和 非持续(非持久)连接
如果想看某次HTTP连接采用哪种方式可以抓包后根据HTTP请求或响应报文中Connection的值来判断。
- 非持续连接
- 持续连接
Connection: Keep-Alive
2.1 非持续连接的HTTP
非持续连接指在客户端和服务器建立连接后,客户端和服务器只能在一次请求和响应之间进行通信(即TCP连接只进行一次数据传输),之后连接将被关闭
- 最多只有
一个对象
在TCP连接上发送 - 下载多个对象需要多个TCP连接
- HTTP/1.0使用非持续连接
非持续连接传输数据的流程图示例:
响应时间模型与RTT
- RTT包括:分组传播时延,分组在中间路由器和交换机上的排队时延,分组处理时延。
2.2 持续连接的HTTP
- 持续连接指请求和响应可以交错进行,多个对象在一个(在客户端与服务器之间的)TCP连接上传输。所有的请求/响应经过相同TCP连接发送。
- HTTP/1.1默认使用持续连接
3. HTTP报文格式
HTTP规范[RFC:1945;RFC2616;RFC7540]包含对HTTP报文格式的定义。
HTTP报文类型:
- 请求报文
- 响应报文
3.1 HTTP请求报文
3.1.1 HTTP请求报文通用格式
实体体在使用POST方法时被才会被使用,当使用GET方法时实体体为空。
- HTTP请求行:方法字段,URL字段,HTTP版本字段
- 方法字段类型:GET,POST,HEAD,PUT,DELETE
- GET:经常在HTML表单中使用,并在(表单字段中)所请求的URL中包括输入的数据。在输入数据与正常URL直间要用英文状态下问号(?)隔开,多个参数用&符合结合起来,共同组成拓展URL链接。例如:http://www.somesite.com/animalsearch?monkey&bananas。
- POST:用户提交表单时,HTTP客户常常使用POST方法。在请求报文的实体体中包含的就是用户在表单字段中输入的值。(部分网站会对输入的值进行加密,如下图password)
- HEAD:类似于GET。当服务器收到一个HEAD方法请求报文后,会使用一个HTTP报文进行响应,但是不会返回请求对象。常用于web应用程序的调试跟踪。
- PUT:常与web发行工具联合工具使用,允许用户上传对象到指定web服务器指定路径(目录)。
- DELETE:允许用户或应用程序删除web服务器上的对象。
- 首部行:
- HOST:对象所在主机
- Connection:是否使用持久连接
- User-agent:用户代理(即浏览器向服务器发送请求的浏览器类型)
- Accept-language:表示用户想要得到的对象的版本(如果对象存在),fr表示希望得到法语版本。
3.1.2 提交表单输入
3.1.3 HTTP版本类型
3.2 HTTP响应报文
3.2.1 响应报文格式
- 通用响应报文格式
- 下图为上个例子中请求报文的响应报文
- HTTP状态行
- 版本:HTTP/1.1
- 状态码:200 ,语句:OK
- 首部行:
- Connection:连接方式(持续,非持续)。
- Date:服务器产生并发送该响应报文的日期和时间(
服务器从它的文件系统中检索到对象,将该对象插入到响应报文并发送该响应报文的时间
) - Server:产生(响应)报文的服务器,类似于请求报文中的User-agent。
- Last-Modified:对象创建或最后修改的日期和时间。
- Content-Length:发送对象的字节数。
- Content-Type:指示实体体中对象的文本格式。(图中为HTML文本)
3.2.2 响应状态码
4. 用户与服务器的交互:Cookie
4.1 用户-服务器状态:Cookies
- 用户第一次访问使用cookie的电子商务时,服务器为他分配一个ID(以关联该用户的行为,把其之后的行为和用户信息等归结到一个ID下,便于为用户提供个性化服务,同时也会保存用户信息以识别。)
- 之后发往该服务器的请求都会携带一个首部行 cookie:xxx。(数字或字母代码)
- 由于cookie存储用户信息的功能,可以使HTTP从无状态协议变为“有状态协议”,便于支撑更多应用,提供更多服务。
4.2 Cookies:维护状态
- 使用cookie跟踪用户状态:
4.3 Cookies便利与隐私问题
5. Web缓存
5.1 定义解释
- web缓存器(Web cache):也叫代理服务器(proxy server),是能够代替初始服务器来满足HTTP请求的网络实体。
- web缓存器有自己的磁盘存储空间,保留最近请求过的对象的副本
- 工作过程:
- 当某次请求的对象在缓存器中存在时,web缓存器就直接用HTTP响应报文向客户浏览器返回该对象
- web缓存器中没有该对象时,打开一个与该对象的初始服务器的TCP连接。在该缓存器到初始服务器的TCP连接上发送该对象的HTTP请求。
- 缓存器收到该请求响应后,在本地存储空间存储一份副本,并通过客户浏览器与web缓存器之间的TCP连接发送给客户浏览器。
- 这个过程中,web缓存器既是客户又是服务器。
推高速缓存与拉高速缓冲
推高速缓存和拉高速缓存都是网络缓存的一种,主要用来缓解网络延迟和提高数据传输速度。
推高速缓存是指将数据从服务器推到客户的浏览器,当客户需要这些数据时,浏览器直接从缓存中获取,而不需要再次从服务器下载。一些浏览器会将经常访问的网页缓存到本地,以减少网络延迟和提高访问速度。
拉高速缓存是指客户浏览器发起请求时,服务器将数据缓存在本地网络中,当客户需要这些数据时,直接从本地网络中获取,而不需要再次从服务器下载。这种方式常用于视频、图片等大数据的缓存,可以减少网络延迟和提高数据传输速度。
总的来说,推高速缓存和拉高速缓存都是为了提高网络性能,减少网络延迟,提高数据传输速度。
5.2 缓存示例
5.2.1 更快的接入链路
5.2.2 安装本地缓存
6. 条件GET方法
- 产生:
高速缓存虽然能够减少响应时间,但存放在缓存器中的对象副本可能是陈旧的,为了确保对象是最新的,HTTP引入了条件GET方法。
- 构成条件:
- 请求报文使用GET方法
- 请求报文包含一个“If-Modified-Since”首部行
If-Modified-Since首部行的值为服务器发送的响应报文中 Last-Modified 首部行的值
- 该请求报文告诉服务器,仅当指定日期之后对象被修改过,才发送该对象
- 如果对象被修改过,发送修改后的对象并更新缓存
- 否则不发送该对象,响应报文如下图示例: