LWIP socket层与协议栈层交互过程分析
来源:互联网 发布:支付宝收费淘宝卖家 编辑:程序博客网 时间:2024/05/16 12:18
LWIP一个很大优势在于支持标准socket应用,完全可以屏蔽底层的交互过程,给使用带来的很多方便。今天以socket创建、连接、收发过程为例,分析下
socket层与协议栈层的数据交互过程。
(1) socket创建
APP层
Socket -> lwip_socket-> (SOCK_STREAM) netconn_new_with_callback(NETCONN_TCP)->
tcpip_apimsg -> (msg.type=TCPIP_MSG_API, msg.function = do_newconn) 发送一个消息并等待
TCP/IP协议栈层
通过tcpip_thread -> sys_mbox_fetch -> case TCPIP_MSG_API:msg.function = do_newconn -> pcb_new(NETCONN_TCP) -> tcp_new() -> tcp_alloc() ->
pcb=memp_malloc() -> pcb初始化-> return
(2)socket connect过程
数据处理流程:
APP 层
connect -> lwip_connect-> netconn_connect-> tcpip_apimsg(&msg)( msg.type = TCPIP_MSG_API, msg.function = do_connect) ->
sys_mbox_post(mbox, &msg);
TCP/IP协议栈层
通过
tcpip_thread->sys_mbox_fetch->case TCPIP_MSG_API: do_connect-> setup_tcp(setup recv_tcp、sent_tcp、poll_tcp and err_tcp)->tcp_connect(setup
paramters)-> tcp_enqueue(Enqueue data for transmission)-> tcp_output-> tcp_output_segment->ip_output->ip_output_if->(netif->output)->
etharp_output-> etharp_send_ip ->(netif->linkoutput)-> low_level_output. 自动处理握手过程
建立好连接后,进行数据的收发,下图比较清晰的看出数据的流动过程:
(3)数据recv接收流程:
TCP/IP协议栈层
ethernetif_input-> low_level_input-> (s_pxNetIf->input)-> tcpip_input-> sys_mbox_trypost
(msg->type = TCPIP_MSG_INPKT)-> tcpip_thread->sys_mbox_fetch-> case TCPIP_MSG_INPKT:(1 or 2)
1. ethernet_input(ARP包处理)-> etharp_arp_input->update_arp_entry(ARP_REQUEST->setup arp reply -> netif->linkoutput) or (ARP_REPLY-> updated
the ARP cache)
2. ip_input-> tcp_input(到pcb链表中去查询各个pcb的相关操作,处理应该回复的数据,根据内容调用TCP_EVENT_ERR、TCP_EVENT_RECV-
> sys_mbox_trypost发送邮箱给APP层)
APP 层
Connect调用返回。
(4)数据send流程
APP 层
Send->lwip_send->netconn_write-> (msg.type=TCPIP_MSG_API, msg.function = do_write)
发送消息
TCP/IP协议栈层
通过
tcpip_thread->sys_mbox_fetch->case TCPIP_MSG_API: do_write->do_writemore( see if has more data to be sent)->tcp_write->将待写数据放入
tcp_enqueue并填充各个数据段,完成数据包->tcp_output->tcp_output_segment->ip_output->ip_output_if->(netif->output)->
etharp_output->etharp_send_ip ->(netif->linkoutput)-> low_level_output
通过今天的分析,把LWIP数据流动过程进行了整理,在吃透一个协议栈之前这样做是必须的,再进行接下来的深入学习。
- LWIP socket层与协议栈层交互过程分析
- 2、LwIP协议栈规范翻译——协议层
- 网络协议栈实现分析5--INET socket 层分析
- socket与各层协议简述
- OSI七层与TCP/IP五层网络架构,个人理解,通过一个http请求的全过程,分析在协议栈中的流转过程
- NS2 Tclcl机制分析, 编译层/解释层交互过程 ------ NS2学习日记 (2)
- Linux内核--网络协议栈深入分析(三)--BSD socket和传输层sock
- Linux内核--网络协议栈深入分析(三)--BSD socket和传输层sock
- 网络协议栈深入分析(三)--BSD socket和传输层sock
- Linux内核--网络协议栈深入分析(三)--BSD socket和传输层sock
- linux协议栈ip层分析
- 5、 LwIP协议栈规范翻译——操作系统仿真层
- ActiveSync应用层程序协议分析-RAPI的握手过程
- ActiveSync应用层程序协议分析-RAPI的握手过程
- OSI7层模型与TCP/IP协议栈4层
- OSI7层模型与TCP/IP协议栈4层
- 交互控制层之界面交互子层分析
- LWIP分析与socket编程方法
- 总结 React 组件的三种写法 及最佳实践 [涨经验]
- 自定义组件
- IFE-17 热身
- 表格td使用百分比宽度 超出显示省略号,鼠标悬浮显示完整信息。样式设置,难点分析
- [转]深入浅出妙用 Javascript 中 apply、call、bind
- LWIP socket层与协议栈层交互过程分析
- Ollydbg异常处理设置项
- String、StringBuffer和StringBuilder的区别
- (转)五大常用算法:分治、动态规划、贪心、回溯和分支界定
- 基本常用命令
- 61.内容提供者ContentProvider--模拟增删改查
- 在shell脚本中捕获java的System.exit()的状态
- SpringMVC整合Shiro
- 记录常用Linux 命令