计算机网络测试人关于HTTP的学习和梳理
Posted 黑黑白白君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机网络测试人关于HTTP的学习和梳理相关的知识,希望对你有一定的参考价值。
通过阅读《计算机网络–自顶向下方法》,以及结合最近面试的一些经历,作此笔记进行梳理和总结,也为日后的回顾作基底。
1)什么是HTTP?
Web(全称 World Wide Web,WWW,万维网)是一个著名的 Internet(因特网)应用。
- Internet 是一个世界范围的计算机网络,由许多小的网络(子网)互联而成的一个逻辑网,每个子网中连接着若干台计算机(主机)。
- Web 将 Internet 从只是很多数据网之一的地位提升为仅有的一个数据网。
超文本传输协议(HyperText Transfer Protocol,HTTP)是Web 的应用层协议。
- HTTP协议工作于客户端-服务端架构上:
- HTTP由两个程序实现:客户程序、服务器程序,两者运行在不同端系统中,通过HTTP报文进行会话
- HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式
- HTTP协议的默认的端口号为80
1.1 HTTP的基本思想
HTTP定义了Web客户(Web client)向Web服务器(Web server)请求Web页面(Web page)的方式,以及Web服务器向Web客户传送Web页面的方式。
Web页面(Web page)
Web页面(Web page,也叫文档)由对象组成。
- 一个对象(object)只是一个文件,且可通过一个URL地址寻址。
- 文件可以是html文件、JPEG图形、Java小程序、视频片段等
- 多数Web page中有一个HTML基本文件(base HTML file)以及几个引用对象。
- HTML基本文件通过对象的URL地址引用页面中的其他对象
- 每个URL地址由两个部分组成:存放对象的服务器主机名、对象的路径名
Web客户
通常由Web浏览器(Web browser)实现。
Web服务器
用于存储Web对象。
- 流行的Web服务器有Apache、IIS(Microsoft Internet Information Server)
1.2 HTTP特点
-
HTTP是无状态协议(stateless protocol)
无状态是指协议对于事务处理没有记忆能力,即HTTP协议本身不保存请求和响应之间的通信状态。
- HTTP服务器不保存关于客户的任何信息,每当有新的请求发送时,就会有对应的新响应产生。
- 后来,通过Session、Cookie等相关技术,也能保持一些用户的状态,但协议本身还是每次都使用一个连接,依然是无状态连接。
-
HTTP具有无连接的特点:
无连接即限制每次连接只处理一个请求。
- 服务器处理完客户的请求,并收到客户的应答后,即断开连接。
- 采用这种方式可以节省传输时间。
*从短连接到长连接
- HTTP/0.9:采用短连接的方式,即客户端和服务器每进行一次HTTP操作就建立一次连接,任务结束就中断连接。
- 当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源如图像文件等,浏览器就会重新建立另外的HTTP会话。
- HTTP/1.0:默认使用短连接,提出长连接(也叫持久连接)的概念,但当时仅提供初步的支持。
- HTTP/1.1:默认使用长连接。
- 使用长连接的HTTP协议,会在响应头加入:Connection:keep-alive
- 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接
- Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间
- 实现长连接需要客户端和服务端都支持长连接
HTTP既能使用非持续连接,也能使用持续连接:
非持续连接(non-persistent connection):
每个请求/响应对是由一个单独的TCP连接发送
- 总的响应时间=(2*RTT+传输一个文件的时间)*请求对象的个数
- 对于每个连接,客户和服务器都要分配TCP的缓冲区和保持TCP变量,Web服务器的负担较重
持续连接(persistent connection):
所有的请求以及响应由相同的TCP连接发送
- 总的响应时间=2RTT+传输一个文件的时间请求对象的个数
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接,因为短连接、长连接的实现在HTTP之外,与HTTP无关,从HTTP自身来看,HTTP依然是无连接的。
- TCP短连接长连接都由客户端发起,而TCP长连接的保活功能主要由服务器应用提供。
2)HTTP报文格式
HTTP规范([RFC1945],[RFC2616],[RFC7540])中定义了HTTP报文格式。
- HTTP报文有两种:请求报文,响应报文。
2.1 HTTP请求报文
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header line)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式:
2.1.1 请求行(request line)
请求行包含请求方法、URL、协议版本。
-
请求方法:
- HTTP1.0 定义了三种请求方法: GET、POST 和 HEAD方法。
- HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
最常用到的是GET和POST:
- GET:请求指定的页面信息,并返回实体主体。
- POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
- 数据被包含在请求体中。
- POST 请求可能会导致新的资源的建立和/或已有资源的修改。
- POST比GET方式的安全性要高,通过GET提交数据,用户名和密码将明文出现在URL上。
2.1.2 请求头部(header)
头部信息是自定义,其用途在于传递额外信息(浏览器信息、请求的内容类型、相应的语言)。
- 报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
- Accept:客户端接受什么类型的响应。 Accept属性的值可以为一个或多个MIME类型的值(描述消息内容类型的因特网标准,消息能包含文本、图像、音频、视频以及其他应用程序专用的数据)。
- cookie:客户端的Cookie就是通过这个报文头属性传给服务端。服务端通过jsessionid的值将客户端的多个请求与一个Session关联起来。
- Referer:表示这个请求是从哪个URL过来的,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com。
- Cache-Control:对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的。
2.1.3 空行以及请求体(body)
请求体可以承载多个请求参数的数据,包含回车符、换行符和请求数据,并不是所有请求都具有请求数据。
举例:
报文体将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。
- 不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1¶m2=value2”的方式传递请求参数。
2.2 HTTP响应报文
响应报文由响应行(respond line)、响应头部(header)、响应主体(body)三个部分组成。
2.2.1 响应行(respond line)
包括主要包括协议版本,状态码,状态码描述。和请求报文相比,响应报文多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果。
常见状态码:
200 OK:
200表示请求在服务器端被正常处理了。在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。204 No Content:
204表示服务器接收的请求已经成功处理,但是在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。当浏览器在发送请求后接收到204响应,它的显示页面不会发生更新。
- 通常应用在只需要客户端往服务端发送信息,而服务端不需要发送新信息的情况下使用。
301 Moved Permanently:
永久重定向,301状态码表示请求的资源已经分配了新的URI,以后请求该资源应该访问新的URI。也就是说,如果已经把资源对应的URI保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。302 Found
临时重定向,302表示请求的资源已经被分配了新的URI,希望客户端本次能使用新的URI访问。和301不同的是,这种资源的URI变更是临时的,而不是永久的,因此不用去更新书签。304 Not Modified:
304 状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。例如,客户端请求的资源在客户端本地已有缓存,会在请求头部中加入“If-Modified-Since"、"If-None-Match"等字段,服务端根据这些字段信息判断这些资源信息是否经过修改,如果没有则返回 304状态码,客户端可以直接使用缓存中的资源。
- 304 状态码返回时,不包含任何响应的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关系。
400 Bad Request:
400 状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态码。401 Unauthorized:
401 状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。第一次收到 401 状态码表示需要进行用户认证,第二次再收到 401 状态码说明用户认证失败。403 Forbidden:
403 状态码表明对请求资源的访问被服务器拒绝了,当未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源 IP
地址试图访问)等列举的情况都可能发生 403 。404 Not Found:
表示服务器上无法找到请求资源。此外,也可能是服务器端在拒绝请求且不想说明原因的时候使用。500 Internal Server Error:
500 状态码表明服务器端在执行请求时发生了错误。也有可能是 Web应用存在的 bug 或某些临时的故障。503 Service Unavailable:
503 状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
2.2.2 响应头
响应报文头也是由多个属性组成。
常见的HTTP响应报文头属性:
- Cache-Control:响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。常见的取值有private(客户端可以缓存)、public、no-cache(需要使用对比缓存来验证缓存数据)、max-age,no-store(所有内容都不会缓存),默认为private。
- 默认为private,缓存时间为31536000秒(365天)也就是说,在365天内再次请求这条数据,都会直接获取缓存数据库中的数据,直接使用。
- ETag:一个代表响应服务端资源(如页面)版本的报文头属性,如果某个服务端资源发生变化了,这个ETag就会相应发生变化。它是Cache-Control的有益补充,可以让客户端“更智能”地处理什么时候要从服务端取资源,什么时候可以直接从缓存中返回响应。
- Location:这个头配合302状态码使用,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
- Set-Cookie:服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的
- Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
2.2.3 空行和响应体
响应主体包含回车符、换行符和响应返回数据,并不是所有响应报文都有响应数据。
【部分内容参考自】
- 《计算机网络–自顶向下方法》
- 《图解HTTP》
- 《HTTP权威指南》
- 如何理解HTTP的无连接、短连接、长连接?:https://segmentfault.com/a/1190000015821798
以上是关于计算机网络测试人关于HTTP的学习和梳理的主要内容,如果未能解决你的问题,请参考以下文章