【1】Http协议报文
Http请求报文
第一行是请求行。
其中“GET”是请求方法,表示客户端以只读的方式来申请资源。
常见的HTTP请求方法如下所示:
请求方法 | 含义 |
---|---|
GET | 申请获取资源,而不对服务器产生任何其他影响 |
HEAD | 和GET方法类似,不过仅要求服务器返回头部信息,而不需要传输任何实际内容 |
POST | 客户端向服务器提交数据的方法。这种方法会影响服务器:服务器可能根据收到的数据动态创建新的资源,也可能更新原有的资源 |
PUT | 上传某个资源 |
DELETE | 删除某个资源 |
TRACE | 要求目标服务器返回原始HTTP请求的内容,它可用来查看中间服务器(比如代理服务器)对HTTP请求的影响 |
OPTIONS | 查看服务器对某个特定URL都支持哪些请求方法。也可以把URL设置为*,从而获得服务器支持的所有请求方法 |
CONNECT | 用于某些代理服务器,它们能把请求的连接转化为个安全隧道 |
PATCH | 对某个资源做部分修改 |
其中:HEAD、GET、OPTIONS和TRACE被视为安全的方法,因为它们只是从服务器获得资源或信息,而不对服务器进行任何修改。
POST、PUT、DELETE和PATCH则影响服务器上的资源。
http://www.baidu.com/index.html 是目标资源的URL.
HTTP/1.0表示客户端使用的HTTP的版本号是1.0.
HTTP请求内容中的第2~4行都是HTTP请求的头部字段。一个HTTP请求可以包含多个头部字段。一个头部字段用行表示,包含字段名称、冒号、空格和字段的值。HTTP请求中的头部字段可按任意顺序排列。
User-Agent: WgeV1.12 linux gnu 表示客户端使用的程序是wget.
Host: www.baidu.com 表示目标主机名是 www.baidu.com. HTTP协议规定HTTP请求中必须包含的头部字段就是目标主机名。
Connection: close代表这个HTTP请求是长链接还是短链接,如果是短链接,则当本次请求完成后就断开连接,也就是说,同一个客户的多个连续的HTTP请求不能共用同个TCP连接;若是长连接,则在本次连接完成之后可以继续接收其他的连接,即多个HTTP请求可以共用一个TCP连接。
注意:在所有头部字段之后,HTTP 请求必须包含一个空行,以标识头部字段的结束。请求行和每个头部字段都必须以\r\n结束(回车符和换行符):而空行则必须只包含一个\r\n,不能有其他字符,甚至是空白字符。
Http响应报文
第一行是状态行。
HTTP/1.0" 是服务器使用的HTTP协议的版本号。通常,服务器需要使用和客户端相同的HTTP协议版本。
200 OK 是状态码和状态信息。
常见的状态码和状态信息及其含义如下表所示
状态码 | 含义 |
---|---|
200 OK | (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 |
301 Moved Permanently | (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。 |
302 Found | 通知客户端资源能在其他地方找到,但需要使用GET方法来获得它 |
304 Not Modified | 表示被申请的资源没有更新,和之前获得的相同 |
400 Bad Request | 通用客户请求错误 |
401 Unauthorized | 请求需要认证信息 |
403 Forbidden | 访问被服务器禁止,通常是由于客户端没有权限访问该资源 |
404 Not Found | 资源没找到 |
500 Internal Server Error | 通用服务器错误 |
503 Service Unavailable | 暂时无法访问服务器 |
第2~7行是HTTP应答的头部字段。其表示方法与HTTP请求中的头部字段相同。
Server: BWS/1.0 表示目标Web服务器程序的名字是BWS ( Baidu Web Server).
Content-Length: 8024 表示目标文档的长度为8024字节。这个值和wget输出的文档长度致
Content-Type: text/html;charset =gbk 表示目标文档的MIME类型。其中“text”是主文档类型,“html" 是子文档类型。“text/html!" 表示目标文档index.html是text类型中的html文档。
charset" 是text文档类型的一个参数,用于指定文档的字符编码。
Set-Cookie 表示服务器传送个Cookie给客户端。其中,“BAIDUID”指定Cookie的名字,"expires” 指定Cookie的生存时间,“domain"和“path"指定该Cookie生效的城名和路径。
Via 表示在http应答在返回过程中经过的所有代理服务器的地址和名称。这个头部字段的功能有点类似于IP协议的记录路由功能。
注意:在所有头部字段之后,HTTP 应答必须包含一个空行,以标识头部字段的结束。请求行和每个头部字段都必须以\r\n结束(回车符和换行符):而空行则必须只包含一个\r\n,不能有其他字符,甚至是空白字符。
【2】代码示例
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>