目录
一、以一个例子来看HTTP通信
二、HTTP请求
三、HTTP应答
四、HTTP与HTTPS的比较
HTTP协议(超文本传输协议)是OSI7层协议中应用层的协议,它定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。HTTP协议是一种面向连接的协议。今天就来看看有关HTTP通信的内容。
HTTP协议定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向事务的(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。请注意,HTTP不仅传送完成超文本跳转所必需的信息,而且也传送任何可从互联网上得到的信息,如文本、超文本、声音和图像等。
但其实从浏览器请求一个万维网文档到收到整个文档所需的时间(图6-10)。 用户在点击鼠标链接某个万维网文档时,HTTP协议首先要和服务器建立TCP连接。这需要使用三报文握手。当建立TCP连接的三报文握手的前两部分完成后(即经过了一个RTT时间后),万维网客户就把HTTP请求报文,作为建立TCP连接的三报文握手中的第三个报文的数据,发送给万维网服务器。服务器收到HTTP请求报文后,就把所请求的文档作为响应报文返回给客户。
HTTP有两类报文:
(1)请求报文——从客户向服务器发送请求报文,见图a;
(2)响应报文——从服务器到客户的回答,见图b;
下面通过一个例子来说明这两类报文的详细内容。
第一行:请求行,GET是请求方法,表示客户端一请求的方式来申请资源。常见的HTTP请求方法有9种,如下表所示:
请求方法 | 含义 |
GET | 申请获取资源,而不对服务器产生任何其他影响 |
HEAD | 和GET方法类似,不过仅要求服务器返回头部信息,而不需要传输任何实际内容 |
POST |
客户端向服务器提交数据的方法。这种方法会影响服务器:服务器可能根据收到的数据动态创建新的资源,也可能更新原有的资源 |
PUT | 上传某个资源 |
DELETE | 删除某个资源 |
TRACE | 要求目标服务器返回原始HTTP请求的内容。它可用来查看中间服务器(比如代理服务器)对HTTP请求的影响 |
OPTIONS | 查看服务器对某个特定URL都支持哪些请求方法。也可以把URL设置为*,从而获得服务器支持的所有请求方法 |
CONNECT | 用于某些代理服务器,它们能把请求的连接转化为一个安全隧道 |
PATCH | 对某个资源做部分修改 |
这些方法中,HEAD、GET、OPTIONS和TRACE被视为安全的方法,因为它们只是从服务器获得资源或信息,而不对服务器进行任何修改。而POST、PUT、DELETE和PATCH则影响服务器上的资源。
另一方面,GET、HEAD、OPTIONS、TRACE、PUT和DELETE等请求方法被认为是等幂的(idempotent), 即多次连续的、重复的请求和只发送一次该请求具有完全相同的效果。而POST方法则不同,连续多次发送同样一个请求可能进一步影响服务器上的资源。
值得一提的是,Linux 上提供了几个命令: HEAD、GET和POST,其含义基本与HTTP协议中的同名请求方法相同。它们适合用来快速测试Web服务器。
“http://www.baidu.com/inde.html”是目标资源的URL。其中“http"是所谓的scheme,表示获取目标资源需要使用的应用层协议。其他常见的scheme还有ftp、rtsp和file等。"www.baidu.com"指定资源所在的目标主机。"index.html"指定资源文件的名称这里指的是服务器根目录(站点的根目录,而不是服务器的文件系统根目录“/”中的索引文件。
"HTTP1.0"表示客户端使用的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请求和应答中的“Connection”头部字段就是专门用于告诉对方一个请求完成之后该如何处理连接的,比如立即关闭连接(该头部字段的值设为“close") 或者保持一段时间以等待后续请求(该头部字段的值设为“keep-alive")。前者就是所谓的“短连接”:同一个客户的多个连续的HTTP请求不能共用同一个TCP连接。后者与其相反,是所谓的“长连接”,是指多个HTTP请求可以使用同一个TCP连接。长连接在编程上稍微复杂一些,但性能上却有很大提高:它极大地减少了网络上为建立TCP连接导致的负荷,同时对每次请求而言缩减了处理时间。当用浏览器访问一个网页时,可以使用netstat命令来查看浏览器和web服务器之间的连接会否是长连接,以及该连接维持了多长时间。
在所有头部字段之后,HTTP请求必须包含一个空行,以标识头部字段的结束。请求行和每个头部字段都必须以
在空行之后,HTTP请求可以包含可选的消息体。如果消息体非空,则HTTP请求的头部字段中必须包含描述该消息体长度的字段“Content-Length"。我们的实例只是获取目标服务器上的资源,所以没有消息体。
第一行是状态行。“HTTP/1.0”是服务器使用的HTTP协议的版本号。通常,服务器需要使用和客户端相同的HTTP版本。“200 OK”是状态码。这里我们需要记住一些常见的状态码及含义,如下表:
状态类型 | 状态码和状态信息 | 含义 |
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请求中的头部字段表示方法相同。
第2行:“Server: BWS/1.0”表示目标Web服务器程序的名字是BWS(Baidu Web Server)。
第3行:“Connect-Length: 8024”表示目标文档的长度为8024字节。这个值和wget输出的文档长度一致。
第4行:“Connect-Type: text/html;charset =gbk”表示目标文档的MIME类型。其中“text”是主文档类型,“html”是子文档类型。“text/html”表示目标文档index.html是text类型中的html文档。“charset”是test文档类型的一个参数,用于指定文档的字符编码。
第5~6行:“Set-Cookie: BAIDUID=A5B6C72D68CF639CE8896FD79A03FBD8:FG= 1;expires=Wed, 04 -Ju1-42 00:10:47 GMT;path=/;domain=.baidu.com”表示服务器传送一个Cookie给客户端。其中,“BAIDUID”指定Cookie的名字,"expires” 指定Cookic的生存时间,“domain”和“path"指定该Cookie生效的城名和路径。
Cookie的作用:
HTTP请求是一种无状态的协议,即每个HTTP请求之间没有任何上下文关系。如果服务器处理后续HTTP请求时需要用到前面的HTTP请求的相关信息,客户端必须重传这些信息。这样就导致HTTP请求必须传输更多的数据。然而,在交互式Web应用程序兴起之后,HTTP协议的这种无状态特性就显得不适应了,因为交互程序通常要承上启下。因此,我们要使用额外的手段来保持HTTP连接状态,常见的解决方法就是Cookie。 Cookie 是服务器发送给客户端的特殊信息(通过HTTP应答的头部字段“Set-Cookie"),客户端每次向服务器发送请求的时候都需要带上这些信息(通过HTTP请求的头部字段“Cookie")。这样服务器就可以区分不同的客户了。基于浏览器的自动登录就是用Cookie实现的。
第7行:“Via: 1.0 localhost (squid/3.0 STABLE18)”表示HTTP应答在返回过程中经历过的所有代理服务器的地址和名称。这里的localhost实际上指的是“192.168.1.108”。这个头部字段的功能有点类似于IP协议的记录路由功能。
在所有头部字段之后,HTTP应答必须包含一个空行,以标识头部字段的结束。状态行和每个头部字段都必须以
空行之后是被请求文档index.html的内容(当然,我们这里并不关心它的内容),其长度是8024 字节。
1.HTTPS协议需要申请ca证书,,一般免费证书很少,需要交费;
2.HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性SSL加密的传输协议;
3.HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,HTTP默认端口:80,HTTPS默认端口:443;
4.HTTP协议连接很简单,是无状态的(即每个HTTP请求之间没有任何上下文关系);
5.HTTPS协议是由SSL+HTTP协议构成的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
本文内容参考《Linux高性能服务器编程》和《计算机网络第七版》谢希仁著