零、参考
Linux网络编程(HTTP协议)
-HTTP服务器端和客户端的作用
- Linux下用c创建HTTP客户端和服务器
- 代码解析
Linux网络编程----http
-HTTP连接的基础知识
- HTTP协议介绍
- HTTPS协议介绍
- 服务器代码
- 运行情况
网络编程之http服务器(C/C++)(基于libevent实现)
- 安装libevent库
- http服务器代码示例
- http相关知识
- 日志类设计
- 套接字代码
- http服务器类
- 连接处理回调类
- 请求类、响应类
- 线程池设计
- 项目测试
一、服务器和客户端
HTTP服务器和客户端之间通过TCP/IP协议建立连接,并使用HTTP协议进行数据交换。服务器监听特定的端口(通常是80),客户端通过连接到服务器上的特定端口发送HTTP请求。
1.1 HTTP服务器
HTTP服务器是指能够接收、处理和响应HTTP请求的软件或硬件设备。它在服务器端运行,并等待客户端的HTTP请求。
主要功能包括:
- 监听网络端口,接收来自客户端的HTTP请求。
- 解析并处理接收到的HTTP请求,包括验证请求、提取请求的目标资源等。
- 执行相应的处理逻辑,如查询数据库、生成动态内容等。
- 生成HTTP响应,包括构建响应头和响应体。
- 发送响应给客户端,将处理结果返回给客户端。
- 常见的HTTP服务器软件包括Apache HTTP Server、Nginx、Microsoft IIS等。
1.2 HTTP客户端
HTTP客户端是发送HTTP请求给服务器并接收响应的软件或应用程序。它位于客户端(如Web浏览器、移动应用程序等)。
主要功能包括:
- 构建HTTP请求,包括请求行、请求头和请求体。
- 将请求发送给指定的HTTP服务器。
- 接收并解析来自服务器的HTTP响应。
- 提取响应头和响应体中的数据。
- 根据需要处理响应数据,如渲染网页、显示图像等。
二、协议格式
2.1 HTTP的协议格式
请求协议格式如下:
- 请求行:[请求方法] + [URI] + [HTTP版本]。
- 请求报头:请求的属性,这些属性都是以key: value的形式按行陈列的。
- 空行:遇到空行表示请求报头结束。
- 请求正文:请求正文允许为空字符串,如果请求正文存在,则在请求报头中会有一个Content-Length属性来标识请求正文的长度。
响应协议格式如下:
- 状态行:[HTTP版本] + [状态码] + [状态码描述]。
- 响应报头:响应的属性,这些属性都是以key: value的形式按行陈列的。
- 空行:遇到空行表示响应报头结束。
- 响应正文:响应正文允许为空字符串,如果响应正文存在,则在响应报头中会有一个Content-Length属性来标识响应正文的长度。
2.2 请求方法
HTTP/1.1协议中共定义了八种方法
- HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
- HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
- GET:向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
- HEAD:向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
- POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
- PUT:向指定资源位置上传其最新内容
- DELETE:请求服务器删除Request-URL所标识的资源
- CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
- TRACE:回显服务器收到的请求,主要用于测试或诊断
2.3 状态码
http状态码大全(100 - 599状态码 全面讲解)
状态码分类:
常见状态码:
状态码 | 状态信息 | 说明 |
---|---|---|
200 | OK | 当您的操作将在响应正文中返回数据时,出现此结果。 |
204 | No Content | 当您的操作成功,但不在响应正文中返回数据时,出现此结果。 |
304 | Not Modified(重定向) | 当测试实体自上次检索以来是否被修改时,出现此结果。 |
403 | Forbidden | 客户端错误 |
401 | Unauthorized | 客户端错误 |
413 | Payload Too Large(客户端错误) | 当请求长度过长时,出现此结果。 |
400 | BadRequest(客户端错误) | 当参数无效时,出现此结果。 |
404 | Not Found(客户端错误) | 当资源不存在时,出现此结果。 |
405 | Method Not Allowed(客户端错误) | 由于方法和资源组合不正确而出现此错误。 例如,您不能对一个实体集合使用 DELETE 或 PATCH。 |
412 | Precondition Failed | 客户端错误 |
501 | Not Implemented(服务器错误) | 当未实施某个请求的操作时,出现此结果。 |
503 | Service Unavailable(服务器错误) | 当 Web API 服务不可用时,出现此结果。 |