没有合适的资源?快使用搜索试试~ 我知道了~
Vpp tcp层代码解析.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 3 下载量 148 浏览量
2021-09-19
15:10:02
上传
评论
收藏 256KB PDF 举报
温馨提示
试读
22页
vpp tcp 三次握手建连和挥手断连的代码流程解析,含状态机图
资源推荐
资源详情
资源评论
Vpp tcp 层代码解析
一、vpp tcp 建连三次握手流程
服务端
vppcom_app_create:
创建 app 与 vpp 通信的 socket、app_wrk、app_wrk->event_queue、用于
检测 app 是否挂掉的 rx_thread_fn 线程;
以下为创建的线程的线程处理函数执行:
vppcom_worker_register:
与 vppcom_app_create 的流程大致相同
vppcom_epoll_create:
创建 epoll session
vppcom_session_create:
创建用于监听的服务端 session
vppcom_session_bind:
将服务端的 ip、端口、协议类型记录到服务端 session 的 transport 结构
体
vppcom_session_listen:
vcl_send_session_listen:向 vpp 端发送 SESSION_CTRL_EVT_LISTEN 类
型事件(事件中记录 client_index》》app 端的 memctl_index、work_index》》
vpp_work_index(vpp 端创建的 app_wrk)、listen 的端口、ip、协议类型信息、
消息的 context 成员为本连接的 session index 消息)
vpp 端:session_queue_node 节点 session_event_dispatch_ctrl 》》
session_mq_listen_handler--》main 线程执行
vnet_listen:
1、session_endpoint_in_ns:判断是否为本地
ip(全 0 或 127.0.0.1) ,若 不 为本 地 ip , 根据 ip 查找查 找 接口 记录到
sep->sw_if_index;
2 、 app_listener_alloc_and_init ( 一 个
application 上的 app_wrk 公用 app_listener)
从 app->listeners 池 子 申 请
app_listenter 节点
创 建 listen_session , 调
session_listen--》transport_start_listen--》调 tcp_proto->start_listen-》
tcp_session_bind-》tcp_connection_bind 传入 listen_session_index 和服务
端监听的五元组:
从 tcp_main->listener_pool 申
请 listener 节点(tcp_connection_t),将五元组信息拷贝到 listener,状态
设置为 TCP_STATE_LISTEN,赋值拥塞控制算法 cc_algo;
将 listener 节点的 timers 设置
为非法;将 listener 在 tcp_main->listener_pool 中的 index 返回;
将 listener 的 index 赋 值 到
listen_session 的 connection_index
app_listenter 和 listen_session 互相记
录 index;
根 据 本 地 app 根 据 app 查 找
session_table index 、 全 局 app 根 据 协 议 类 型 和 sep 的 fib_index 查 找
session_table index,调 session_lookup_add_session_endpoint 根据服务端
ip、端口、协议类型计算 hash key,key->value 成员记录 listen_session handle,
将 key 记录到 session_table 的 v4_session_hash 队列;
3、app_worker_start_listen
app_lostener->workers 位 图 设 置
app_wrk->wrk_map_index 对应位为 1;
app_worker_init_listener : 传 入
app_wrk 和 listen_session
从 sm_main->segment_managers
申请 segment_manager;
将 segment_manager 和
listen_session 计算 hash 值记录到 app_wrk->listeners_table;
mq_send_session_bound_cb:
封装 SESSION_CTRL_EVT_BOUND 类型消息,消息
中创建的 listen_session handle、五元组、vpp_evt_q(thread 0 的 session_main
上的 wrk 的 vpp_event_queue)
app 端: vppcom_wait_for_session_state_change 等待服务端 session
的 session_state 为 STATE_LISTEN,其中从 app_event_queue 等待消息,并调
vcl_handle_mq_event 根据消息类型进行处理,其中 SESSION_CTRL_EVT_BOUND
事件调 vcl_session_bound_handler 进行处理;
vcl_session_bound_handler:
将 vpp 端的 listen_session handle
记录到 app 端的 session->vpp_handle 并将其余 app 端 的 session index 计算
hash 值记录到 wrk->session_index_by_vpp_handles
vpp_evt_q 记 录 到
session->vpp_evt_q 和 wrk->vpp_event_queues[0];
置 session->session_state 为
STATE_LISTEN;
第一次握手
vpp 端:
接 收 到 客 户 端 connect 发 送 过 来 的 建 连 请 求 的 syn 报 文 后 ,
tcp46_input_inline- 》 tcp_input_lookup_buffer- 》
session_lookup_connection_wt4- 》 session_lookup_listener4_i 查 找 到
listener 连 接 , 调 tcp_input_dispatch_buffer 根 据 listener 连 接 状 态
( TCP_STATE_LISTEN ) 和 报 文 flag ( TCP_FLAG_SYN ) 获 取 下 一 节 点 为
TCP_INPUT_NEXT_LISTEN 节 点 ( 即 tcp4_listen_node 节 点 ) , 节 点 处 理 函 数
tcp46_listen_inline 从 tcp_main->wrk_ctx[thread_id]->connections 申 请
child 连接;child 连接获取五元组,fib_index,设置状态为 TCP_STATE_SYN_RCVD;
session_stream_accept:
为 child 连 接 申 请 session ( 从
session_main.wrk[thread_index].sessions 申请),session 与 child 互相记
录 index , session 记 录 listenter_handle , 设 置 session 状 态 为
SESSION_STATE_CREATED
app_worker_init_accepted:传入创建的 session
application_listener_select_worker:
为 vpp 端的 listen_session 分配 app_wrk(从 1 开始依次往后分配),child
session 记录该 app_worker 的 index 到 app_wrk_index 成员;
app_worker_get_listen_segment_manager (app_wrk, listener)-- 获 取
listener session 的 segment_manager(服务端管理的客户端都从 listener
session 的 segment manager 申请 fifo)
app_worker_alloc_session_fifos (sm,
s):为 child session 从 segment_manager 申请或分配 rx_fifo、tx_fifo
session_lookup_add_connection : 将 连 接 的 五 元 组 和
child session 计算 hash 值记录到 session_table 的 v4_session_hash 链表
tcp_send_synack : 构 造 ack 回 复 报 文 , tcp 头 部 的 flags 为
TCP_FLAG_SYN | TCP_FLAG_ACK;
第三次握手:
vpp 端:收到 app 端发送的 syn 的 ack 报文交 tcp4-rcv-process 节点进
行处理(查找到第一次握手的 child connection 的状态为 TCP_STATE_SYN_RCVD、
tcp 头 部 的 flags 为 TCP_FLAG_SYN | TCP_FLAG_ACK ) , 节 点 处 理 函 数
tcp46_rcv_process_inline
将 child connection 的状态设置为 TCP_STATE_ESTABLISHED;
session_stream_accept_notify:
置 vpp 端 child 对 应 的 session 的 状 态 为
SESSION_STATE_ACCEPTING;
app_worker_accept_notify : 执 行
mq_send_session_accepted_cb 回调,传入 child session
构造 SESSION_CTRL_EVT_ACCEPTED 类型消
息,消息填充:context 为 vpp 端的 application 的 index、listener_handle、
child session 的 rxtx fifo 和 segment_manager handle、客户端五元组、
vpp_evt_q、child session handle 为消息的成员 handle;
发送事件失败,将 session 状态置回 SESSION_STATE_CREATED
app 端:
若 vcl_handle_mq_event 先 处 理
SESSION_CTRL_EVT_ACCEPTED 事件
vcl_session_accepted : 将 消 息 放 listener 的
session->accept_evts_fifo、child handle 和 listener session index 计算
hash 存 放 在 wrk->session_index_by_vpp_handles 队 列 ; 添 加
SESSION_IO_EVT_ACCEPTED_RX 到 unhandle 事件队列
vppcom_epoll_wait 检 查 到
SESSION_IO_EVT_ACCEPTED_RX 事件时,由于 listener session 被添加到 epoll
且监听 epoll_in 事件,则添加一个 epoll_in 事件;
若 vppcom_epoll_wait 先处理 SESSION_CTRL_EVT_ACCEPTED
事件,调 vcl_session_accepted 后直接上一个 epoll_in 事件;
若在 vppcom_epoll_ctl 将 listener session 添加到 epoll
上时,SESSION_CTRL_EVT_ACCEPTED 事件已被处理但还没调 epoll_wait,检查到
listener session 的 accept_evts_fifo 上 有 数 据 , 添 加 一 个
SESSION_IO_EVT_ACCEPTED_RX 事件到 unhandled_evts 队列;
vppcom_epoll_ctl:
将服务端 session 添加到 epoll session;
以下在线程处理函数的 while(1)循环内执行:
vppcom_epoll_wait:
若 epoll 到的 fd 为 listen_fd,调 vppcom_session_accept(传入 listen session
handle、设置 accept 的客户端连接的 socket 属性的 flag):
剩余21页未读,继续阅读
资源评论
- weixin_397413462022-03-04用户下载后在一定时间内未进行评价,系统默认好评。
- TOceanFish2022-02-17用户下载后在一定时间内未进行评价,系统默认好评。
- 我觉得名字短一点是不是更能装逼2022-04-06用户下载后在一定时间内未进行评价,系统默认好评。
picaso77
- 粉丝: 94
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功