怎么自己的电脑做网站服务器国家重大项目建设库网站打不开
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:46
当前位置: 首页 > news >正文
怎么自己的电脑做网站服务器,国家重大项目建设库网站打不开,信息门户网站是什么,wordpress选项卡分页文章目录 一、HTTP/2 特性实现#xff1a;nghttp2 源码剖析1.1 二进制帧1.2 多路复用1.3 头部压缩1.4 服务器推送1.5 总结 二、使用 nghttp2 库创建一个 HTTP/2 客户端三、结语 在互联网时代#xff0c;网络传输协议的作用至关重要。在本文中#xff0c;我们将对 HTTP/2 的一… 文章目录 一、HTTP/2 特性实现nghttp2 源码剖析1.1 二进制帧1.2 多路复用1.3 头部压缩1.4 服务器推送1.5 总结 二、使用 nghttp2 库创建一个 HTTP/2 客户端三、结语 在互联网时代网络传输协议的作用至关重要。在本文中我们将对 HTTP/2 的一些核心特性进行深入的剖析并通过实例代码展示如何使用 nghttp2 库来实现 HTTP/2 的高效特性。 一、HTTP/2 特性实现nghttp2 源码剖析 在我们开始探索如何使用 nghttp2 库创建一个 HTTP/2 客户端之前首先让我们结合 nghttp2 库的源码了解 HTTP/2 的主要特性是如何实现的。 1.1 二进制帧 作为 HTTP/2 的基础二进制帧的处理方式对于整个协议的性能和可靠性有着至关重要的影响。HTTP/2 使用二进制帧来传输数据这使得数据传输更加高效和可靠。 在 nghttp2 中二进制帧的实现可以在 nghttp2_frame.c 文件中找到。每个帧由一个固定长度的帧头9 字节和一个可选的帧负载组成。帧头包括以下字段长度24位、类型8位、标志8位、保留位1位和流标识符31位。 nghttp2 提供了一系列 API 来处理二进制帧如 nghttp2_frame_pack() 用于将帧结构体编码为二进制数据nghttp2_frame_unpack() 用于将二进制数据解码为帧结构体。 1.2 多路复用 接下来我们来看看 nghttp2 是如何实现 HTTP/2 的另一个重要特性多路复用。通过多路复用HTTP/2 可以在一个连接上并行处理多个请求和响应这大大提高了网络利用率。 在 nghttp2 中多路复用的实现可以在 nghttp2_stream.c 文件中找到。nghttp2 使用优先级队列来管理多个流以实现多路复用。 当新的帧到达时nghttp2 会根据帧头中的流标识符找到对应的流。然后根据帧类型和优先级对流进行处理。例如数据帧会被传递给应用程序进行处理而控制帧如 WINDOW_UPDATE会被用来更新流的状态。 1.3 头部压缩 头部压缩是 HTTP/2 的另一个重要特性它可以有效地减少网络传输的开销。HTTP/2 使用 HPACK 算法压缩头部减少了网络传输的开销。 在 nghttp2 中头部压缩的实现可以在 nghttp2_hd.c 文件中找到。nghttp2 提供了一系列 API 来处理头部压缩如 nghttp2_hd_deflate() 用于压缩头部nghttp2_hd_inflate() 用于解压缩头部。 HPACK 算法使用了两种技术来压缩头部静态表和动态表。静态表包含了常见的头部字段动态表则在连接过程中逐渐学习头部字段。通过这两个表HPACK 可以有效地压缩头部数据。 1.4 服务器推送 最后我们来看看 nghttp2 是如何实现 HTTP/2 的服务器推送特性的。HTTP/2 允许服务器主动向客户端推送资源提高了页面加载速度。 在 nghttp2 中服务器推送的实现可以在 nghttp2_push.c 文件中找到。服务器可以通过 nghttp2_submit_push_promise() 函数提交一个 PUSH_PROMISE 帧告知客户端即将推送的资源。然后服务器可以使用 nghttp2_submit_response() 函数发送推送资源的响应。 客户端可以通过设置回调函数来接收服务器推送的资源。例如可以使用 nghttp2_session_callbacks_set_on_push_promise() 函数设置 PUSH_PROMISE 帧的回调以及 nghttp2_session_callbacks_set_on_data_chunk_recv() 函数设置接收到推送数据的回调。 1.5 总结 通过以上的源码分析我们可以看到HTTP/2 的主要特性在 nghttp2 中得到了很好的实现。这些特性共同让 HTTP/2 成为了一个高效、可靠的网络传输协议。 二、使用 nghttp2 库创建一个 HTTP/2 客户端 理论知识了解了之后接下来我们通过一个实例来看看如何使用 nghttp2 库创建一个 HTTP/2 客户端。 下面的 C 语言示例代码演示了如何使用 nghttp2 库创建一个 HTTP/2 客户端。这个客户端会向服务器发送一个 GET 请求打印出响应并加入错误处理、超时、取消请求、流量控制等特性。 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include netdb.h #include nghttp2/nghttp2.h#define PORT 8080 #define BUFFER_SIZE 4096// 发送回调函数 static ssize_t send_callback(nghttp2_session *session, const uint8_t *data, size_t length, int flags, void *user_data) {int fd *(int *)user_data;ssize_t sent write(fd, data, length);if (sent 0) {perror(Failed to send data);exit(EXIT_FAILURE);}return sent; }// on_frame_send_callback 函数 static int on_frame_send_callback(nghttp2_session *session, const nghttp2_frame *frame, void *user_data) {if (frame-hd.type NGHTTP2_DATA) {printf(Sent data frame\n);}return 0; }// on_data_chunk_recv_callback 函数 static int on_data_chunk_recv_callback(nghttp2_session *session, uint8_t flags, int32_t stream_id, const uint8_t *data, size_t len, void *user_data) {printf(Received data chunk: %.*s\n, (int)len, data);// 检查是否需要流量控制ssize_t window_size nghttp2_session_get_stream_remote_window_size(session, stream_id);if (window_size len) {printf(Stream window size is too small, need to increase\n);nghttp2_submit_window_update(session, NGHTTP2_FLAG_NONE, stream_id, len - window_size);}return 0; }// on_stream_close_callback 函数 static int on_stream_close_callback(nghttp2_session *session, int32_t stream_id, uint32_t error_code, void *user_data) {printf(Stream %d closed with error code %d\n, stream_id, error_code);return 0; }int main(int argc, char **argv) {if (argc ! 3) {fprintf(stderr, Usage: %s host path\n, argv[0]);return 1;}const char *host argv[1];const char *path argv[2];struct addrinfo hints {0}, *res;hints.ai_family AF_INET;hints.ai_socktype SOCK_STREAM;int error getaddrinfo(host, 80, hints, res);if (error) {fprintf(stderr, Failed to resolve host: %s\n, gai_strerror(error));return 1;}int fd socket(res-ai_family, res-ai_socktype, res-ai_protocol);if (fd 0) {perror(Failed to create socket);return 1;}if (connect(fd, res-ai_addr, res-ai_addrlen) 0) {perror(Failed to connect);return 1;}// 设置套接字超时struct timeval timeout {5, 0}; // 5 secondssetsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, timeout, sizeof(timeout));nghttp2_session_callbacks *callbacks;nghttp2_session_callbacks_new(callbacks);nghttp2_session_callbacks_set_send_callback(callbacks, send_callback);nghttp2_session_callbacks_set_on_frame_send_callback(callbacks, on_frame_send_callback);nghttp2_session_callbacks_set_on_data_chunk_recv_callback(callbacks, on_data_chunk_recv_callback);nghttp2_session_callbacks_set_on_stream_close_callback(callbacks, on_stream_close_callback);nghttp2_session *session;nghttp2_session_client_new(session, callbacks, fd);nghttp2_session_callbacks_del(callbacks);nghttp2_nv headers[] {MAKE_NV(:method, GET),MAKE_NV(:path, path),MAKE_NV(:scheme, http),MAKE_NV(:authority, host),};int32_t stream_id nghttp2_submit_request(session, NULL, headers, sizeof(headers) / sizeof(headers[0]), NULL, NULL);char buffer[BUFFER_SIZE];ssize_t bytes_read;while ((bytes_read read(fd, buffer, BUFFER_SIZE))c0) {if (nghttp2_session_mem_recv(session, (const uint8_t *)buffer, bytes_read) 0) {fprintf(stderr, Failed to process data\n);break;}if (nghttp2_session_send(session) 0) {fprintf(stderr, Failed to send data\n);break;}}// 取消请求nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, stream_id, NGHTTP2_CANCEL);nghttp2_session_del(session);close(fd);return 0; }在上述代码中我们创建了一个 HTTP/2 客户端这个客户端连接到服务器发送一个 GET 请求并打印出响应。 on_frame_send_callback 函数在每次发送帧时被调用。在这个函数中我们打印了一条消息表明我们发送了一个数据帧。 on_data_chunk_recv_callback 函数在每次接收数据块时被调用。在这个函数中我们打印了接收到的数据块并检查了流的窗口大小。如果窗口大小小于数据块的长度我们就提交一个窗口更新帧以增加窗口大小。这是流量控制的一种形式。 on_stream_close_callback 函数在流关闭时被调用。在这个函数中我们打印了流的 ID 和错误代码。 在主函数中我们增加了错误检查以处理获取地址信息、创建套接字和连接套接字时可能出现的错误。我们还设置了套接字的接收超时。如果在指定的时间内没有接收到数据read 函数将返回一个错误。 在读取和处理数据的循环中我们增加了错误检查以处理接收和发送数据时可能出现的错误。 最后我们使用 nghttp2_submit_rst_stream 函数提交了一个 RST_STREAM 帧以取消请求。这个帧将导致流立即关闭任何未发送或未接收的数据都将被丢弃。 三、结语 通过对 nghttp2 库的源码剖析我们对 HTTP/2 的主要特性有了深入的理解。同时我们也演示了如何使用 nghttp2 库创建一个 HTTP/2 客户端。希望通过本文的分析能够帮助读者更好地理解 HTTP/2 协议为客户端开发提供更高效、可靠的网络传输支持。
- 上一篇: 怎么自己搭建博客网站厂字形网页布局网站
- 下一篇: 怎么自己在微信上做网站淘宝上网站开发退款
相关文章
-
怎么自己搭建博客网站厂字形网页布局网站
怎么自己搭建博客网站厂字形网页布局网站
- 技术栈
- 2026年03月21日
-
怎么自己创建网站或者app椒江网站建设578做网站
怎么自己创建网站或者app椒江网站建设578做网站
- 技术栈
- 2026年03月21日
-
怎么自己编码做网站厦门网站建设招标
怎么自己编码做网站厦门网站建设招标
- 技术栈
- 2026年03月21日
-
怎么自己在微信上做网站淘宝上网站开发退款
怎么自己在微信上做网站淘宝上网站开发退款
- 技术栈
- 2026年03月21日
-
怎么自己制作一个网站的书源房产信息网海南
怎么自己制作一个网站的书源房产信息网海南
- 技术栈
- 2026年03月21日
-
怎么自己做电影网站wordpress文章id排序
怎么自己做电影网站wordpress文章id排序
- 技术栈
- 2026年03月21日
