IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> lwIP---httpd源码解析(一) -> 正文阅读

[网络协议]lwIP---httpd源码解析(一)

lwIP—httpd源码解析(一)

目录
一、lwIP版本
二、httpd初始化流程
??2.1 初始化入口
三、处理客户端连接

一、lwIP版本
??此处使用lwip 2.1.2版本。
二、httpd初始化流程
??2.1 初始化入口
??代码路径:lwip-2.1.2\lwip-2.1.2\src\apps\http\httpd.c

void httpd_init(void);

??初始化流程如下图:

在这里插入图片描述
??初始化httpd时,按顺序做了以下事情:
??1) 申请一个tcp协议控制块,其中altcp_tcp_new_ip_typetcp_new_ip_type是等价的。
altcp_pcb和tcp_pcb是等价的。

#define altcp_pcb tcp_pcb
#define altcp_tcp_new_ip_type tcp_new_ip_type
struct altcp_pcb *pcb = altcp_tcp_new_ip_type(IPADDR_TYPE_ANY); // new tcp_pcb

??tcp协议控制块tcp_pcb是一个重要的结构体,维护了tcp传输层所需要的数据结构,例如ip地址、端口号、滑动窗口、网络IO回调函数、连接管理、重发机制等。结构体定义在tcp.h中;
??2) 设置tcp_pcb中的local_ip和port,同时加入已绑定的tcp控制块链表tcp_bound_pcbs中管理;

/** List of all TCP PCBs bound but not yet (connected || listening) */
struct tcp_pcb *tcp_bound_pcbs;
TCP_REG(&tcp_bound_pcbs, pcb); // reg to tcp_bound_pcbs list

??3) 监听tcp控制块。申请一个新的tcp_pcb_listen类型,将state置为LISTEN,把原tcp控制块必要的端口IP等信息传给监听控制块,释放原来的tcp_pcb控制块,并且将此控制块放到监听链表tcp_listen_pcbs中。(此处新申请tcp_pcb_listen控制块的原因是为了节约空间,这是一个裁剪版的tcp_pcb协议控制块,在未连接之前不需要完整的tcp控制块);

TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb); // reg to tcp_listen_pcbs list

?? 4) 调用altcp_accept()把回调函数http_accept()注册到上述监听tcp控制块的accept回调成员中。

void tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept)
{
  LWIP_ASSERT_CORE_LOCKED();
  if ((pcb != NULL) && (pcb->state == LISTEN)) {
    struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen *)pcb;
    lpcb->accept = accept; // reg accept to listen tcp_pcb
  }
}

??总结:在lwip的httpd应用中,使用RAW API接口,创建tcp_pcb的方式初始化tcp端口(在RAW API中,没有socket的概念。开发者为了用户的网络编程习惯,在RAW API的基础上封装了类似linux的网络socket编程接口,定义在lwip-2.1.2\lwip-2.1.2\src\api\sockets.c,不过此socket接口虽然使用简单,但效率不及直接操作tcp_pcb编程,故自带的http应用仍采用RAW API的方式)。
??监听控制块由TCP内核中的链表tcp_listen_pcbs管理,采用回调函数的方式响应客户端的connect请求。
??在TCP内核,创建了四个链表存放处于不同TCP状态的tcp_pcb控制块,用于进行管理,代码定义在tcp.c中:

/* The TCP PCB lists. */

/** List of all TCP PCBs bound but not yet (connected || listening) */
struct tcp_pcb *tcp_bound_pcbs;
/** List of all TCP PCBs in LISTEN state */
union tcp_listen_pcbs_t tcp_listen_pcbs;
/** List of all TCP PCBs that are in a state in which
 * they accept or send data. */
struct tcp_pcb *tcp_active_pcbs;
/** List of all TCP PCBs in TIME-WAIT state */
struct tcp_pcb *tcp_tw_pcbs;

/** An array with all (non-temporary) PCB lists, mainly used for smaller code size */
struct tcp_pcb **const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs,
         &tcp_active_pcbs, &tcp_tw_pcbs
};

??TCP state一共有十一种理解TCP流程的核心就是理解这十一种状态的含义以及互相之间的转换,状态定义如下代码所示:

static const char *const tcp_state_str[] = {
  "CLOSED",
  "LISTEN",
  "SYN_SENT",
  "SYN_RCVD",
  "ESTABLISHED",
  "FIN_WAIT_1",
  "FIN_WAIT_2",
  "CLOSE_WAIT",
  "CLOSING",
  "LAST_ACK",
  "TIME_WAIT"
};

??可见在内核中,也是基于状态机的形式管理tcp_pcb协议控制块的。
??至此,完成了一个tcp协议控制块的初始化(类比linux网络编程的说法,是初始化了一个监听套接字socket,并且等待客户端连接)。
三、处理客户端连接
??客户端连接时,按网络数据的流向,lwIP内核处理流程如下:
??(其中netif是lwIP抽象出的网卡结构体,用于联系底层硬件驱动和上层软件的桥梁,是一个重要的结构,定义在lwip-2.1.2\lwip-2.1.2\src\core\netif.c

在这里插入图片描述

未完待续===

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:59:17  更:2021-07-31 16:59:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 17:19:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码