HTTP协议分析

本文深入探讨了HTTP协议的工作原理,包括其在Web客户端和服务器间通信的角色,以及如何通过请求和应答报文进行数据交换。文章还介绍了HTTP协议的特点,如无连接、媒体独立和无状态性,并详细解释了请求和应答过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前面我们有讨论过IP协议和TCP协议,讨论了他们的功能和他们是如何完成网络通信的。本篇文章中,我们来讨论HTTP协议是如何来完成网络通信的,以及它的功能是什么。

我们都知道我们可以通过浏览器访问任何一个Internet网上的Web服务器。但却不知Web客户端和服务器之间就是使用HTTP协议通信的。HTTP协议是一种应用层协议,它默认使用的传输层协议是TCP协议。

何为HTTP协议:

大家都知道所谓协议,就是指双方遵循的规范,而HTTP协议就是浏览器和web服务器之间进行“沟通”的一种规范。我们在看空间,刷微博等等这些,都是在使用HTTP协议。

UDP协议具有不可靠性和不安全性,显然这很难满足web应用的需要。而TCP协议是基于可靠连接和三次握手的,虽然具有可靠性,但仍然有一定的缺陷。普通的C/S架构软件,顶多上千个Clinent同时连接,而B/S架构的网站,十几万人同时在线也是很平常的事。如果十几万个客户端和服务器一直保持连接状态,那服务器如何承载?

这是因为这个需求,所以就衍生了HTTP协议。

HTTP协议有以下几个特点:

1)HTTP是无连接的:无连接的含义是限制每次连接只处理一个请求。服务器处理完用户的请求,并收到客户的应答后,立即断开连接。采用这种方式可以节省传输时间。但连接的过程还是基于TCP的。

2)HTTP是媒体独立的:只要客户端和服务器知道如何处理数据的内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定合适的MIME-type内容类型。

3)HTTP是无状态的:无状态是指对事务的处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传输的信息量增大。但是若服务器不需要先前的信息时,它的应答就很快。

HTTP报文分为应答报文和请求报文我们就以这两种报文详细来看。

一、HTTP请求

HTTP请求的部分内容如下

GET http://www.baidu.com/index.html HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Host: www.baidu.com
Connection: close

第一行是请求行,其中“GET”是请求方法,表示客户端以只读的方式申请资源。常见的HTTP请求方法有以下几种:

HTTP请求方法
请求方法含义
GET申请获取资源,而不对服务器产生任何其他影响
HEAD和GET方法类似,不过仅要求服务器返回头部信息,而不需要传输任何实际内容
POST客户端向服务器提交数据的方法。这种方法会影响服务器;服务器可能会根据收到的数据动态创建新的资源,也可能更新原有的资源
PUT上传某个资源
DELETE删除某个资源
TRACK要求目标服务器返回原始请求内容。它可用来查看中间服务器(比如代理服务器)对HTTP请求的影响
OPTIONS查看服务器对某个特定URL都支持哪些请求方法。也可把URL设置为*,从而获取服务器支持的所有请求方法
CONNECT

用于某些代理服务器,他们能把请求的连接转化为一个安全隧道

PATCH对某个资源做部分修改

这些方法中,HEAD、GET、OPTIONS和TRACE被视为安全的方法,因为他们只从服务器获取资源或信息,而不对服务器进行任何修改。而POST、PUT、DELETE和PATCH则影响服务器上的资源。

另一方面,GET、HEAD、OPTIONS、PUT和DELETE等请求方法被认为是等幂的(idempotent),即多次连续的、重复的请求和只发送一次该请求具有完全相同的效果。而POST方法不同,连续多次发送同一个请求可能影响服务器上的资源。

值得一提的是,Linux上提供了几个命令:HEAD、GET、和POST。其含义基本与HTTP协议中同名请求方法相同。它们适合用来快速测试Web服务器。

"http://www.baidu.com/index.html"是目标资源的URL。其中"http"是所谓的scheme,表示获取目标资源使用的应用层协议。 "index.html"指定资源文件的名称,这里指的是服务器根目录(站点的根目录,而不是服务器文件系统的根目录“/”)中的索引文件。

“HTTP/1.0”表示客户端(wget程序)使用的HTTP的版本号是1.0。目前主流HTTP版本是1.1。

HTTP请求内容中的第2~4行都是HTTP请求的头部字段。一个HTTP请求可包含多个头部字段,一个头部字段用一行表示,包含字段名称、冒号、空格、和字段的值。HTTP请求中的头部字段可按任意顺序排列。

“User-Agent:Wget/1.12(linux-gnu)”表示客户端使用的应用程序是wget。

“Host:www.baidu.com”表示目标主机名是www.baidu.com。HTTP协议规定HTTP请求中必须包含的头部字段就是目标主机名。

“Connection: close”是我们执行wget命令时传入的,用以告诉服务器处理完这个HTTP请求后就关闭连接。但在旧的HTTP协议中,web客户端和web服务器之间的一个TCP连接只能为一个HTTP请求服务。当处理完客户的一个HTTP请求之后,web服务器就主动将TCP连接关闭了。此后,同一客户如果要再发送一个HTTP请求的话,必须与服务器建立一个新的TCP连接。也就是说,同一客户的多个连续的HTTP请求不能共用同一个TCP连接,这称为短连接长连接与之相反,指多个请求可以使用同一个TCP连接。长连接在编程上稍微复杂一些,但在性能上却有很大的提高;它极大地减少了网络上为建立TCP连接导致的负荷,同时对每次请求而言缩减了处理时间,HTTP请求和应答中的“Connection”头部字段就是专门用于告诉对方一个请求完成之后该如何处理连接的,比如立即关闭连接(该头部字段的值为“close”)或者保持一段时间以等待后续请求(该头部字段的值为“keep-alive”)当浏览器访问一个网页时,读者不妨使用netstat命令查看浏览器和web服务器之间的连接是否为长连接,以及该连接维持了多长时间。

在所有头部字段之后,HTTP请求必须包含一个空行,以标识头部字段的结束,请求行和每个头部字段都必须以<CR><LF>结束(回车符和换行符);而空行则必须只包含一个<CR><LF>,不能有其他字符,甚至是空白字符。

在空行之后,HTTP请求可以包含可选的消息体。如果消息体非空,则HTTP请求的头部字段中必须包含描述该消息体长度的字段“Content-Length”。我们的实例只是获取目标服务器上的资源,没有消息体。

二、HTTP应答

HTTP应答的部分内容如下;

HTTP/1.0 200 OK
Server: BWS/1.0
Content-Length: 8024
content-Type: text/html;charset =gbk
Set-Cookie: BAIDUID=A5B6C72D68CF639CE8896FD79A03FBD8:FG=1; expires=Wed,
            04 -Jul-42 00:10:47 GMT; path=/; domain=.baidu.com
Via: 1.0 localhost (squid/3.0 SATBLE18)

第一行是状态行。“HTTP/1.0”是服务器使用的HTTP协议的版本号。通常,服务器需要使用和客户端相同的HTTP协议版本,“200 OK”是状态码和状态信息。常见的状态码和状态信息及其含义如下表所示。

HTTP状态码和状态信息及其含义
状态类型状态码和状态信息含义
1xx 信息100 Continue服务器收到了客户端的请求行和头部信息,告诉客户端继续发送数据部分,客户端通常要先发送Expect: 100-continue头部字段告诉服务器自己还有数据要发送
2xx 成功200 OK请求成功
3xx 重定向301 Moved Permanently资源被转移了,请求将被重定向
302 Found通知客户端资源能在其他地方找到,但需要使用GET方法来获取它
304 Not Modified表示被申请的资源没有更新,和之前获得的相同
307 Temporary Redirect通知客户端资源能在其他地方找到。与302不同的是,客户端可以使用和原始请求相同的请求方法访问目标资源
4xx 客户端错误400 Bad Request通用客户请求错误
401 Unauthorized请求需要认证信息
403 Forbidden访问服务器禁止,通常是由于客户端没有权限访问该资源
404 Not Found资源没找到
407 Proxy Authentication Required客户端需要先获得代理服务器的认证
5xx 服务器错误500 Internal Server Error通用服务器错误
503 Service Unavailable暂时无法访问服务器

第2~7行是HTTP应答的头部字段。其表示方法与HTTP请求中的头部字段相同。

"Server: BWS/1.0"表示目标Web服务器程序的名字是BWS(Baidu Web Server)。

“Content-Lendth: 8024” 表示目标文档的长度为8024字节,这个值和wget输出的文档长度一致。

“Content-Type: text/html; charset =gbk” 表示目标文档为MIME类型,其中“text”是主文档类型,“html”是子文档类型。“text/html”表示index.html是text类型中的html文档。“charset”是text文档类型的一个参数,用于指定文档的字符编码。

“Set-Cookie: BAIDUID=A5B6C72D68CF639CE8896FD79A03FBD8:FG=1; expires=Wed,04 -Jul-42 00:10:47 GMT; path=/; domain=.baidu.com” 表示服务器传送一个Cookie给客户端。其中,“BAIDUID”指定Cookie的名字,“exoires”指定Cookie的生存时间,“domain”和“path”指定该Cookie生效的域名和路径。

HTTP协议是一种无状态的协议,即每个HTTP请求之间没有任何上下文关系。如果服务器处理后续HTTP请求时需要用到前面的HTTP请求的相关信息,客户端必须重传这些信息。这样就导致HTTP其牛群必须传输更多的数据。

在交互式Web应用程序兴起之后,HTTP协议的这种无状态特性就显得不适应了,因为交互式程序通常要承上启下,因此,我们需要使用额外的手段来保持HTTP连接状态,常见的解决方法就是Cookie。Cookie是服务器发送给客户端的特殊信息(通过HTTP应答的头部字段“Set-Cookie”),客户端每次想服务器发送请求的时候都需要带上这些信息(通过HTTP请求的头部字段“Cookie”)。这样服务器就可以区分不同的客户了,基于浏览器的自动登录就是用Cookie实现的。

“Via: 1.0 localhost (squid/3.0 SATBLE18)” 表示HTTP应答在返回过程中经历过得所有代理服务器的地址和名称。这里的localhost实际上指的是“192.168.1.108”。这个头部字段的功能有点类似于IP协议的记录路由功能。

所有头部字段之后,HTTP应答必须包含一个空行,以标识头部字段的结束。状态行和每个头部字段都必须以<CR><LF>结束;而空行则必须包含一个<CR><LF>,不能有其他字符,甚至是空白字符。

空行之后就是被请求文档index.html的内容,其长度是8024字节。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值