[计算机]uip_process流程.doc

上传人:音乐台 文档编号:1990718 上传时间:2019-01-28 格式:DOC 页数:7 大小:56.50KB
返回 下载 相关 举报
[计算机]uip_process流程.doc_第1页
第1页 / 共7页
[计算机]uip_process流程.doc_第2页
第2页 / 共7页
[计算机]uip_process流程.doc_第3页
第3页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[计算机]uip_process流程.doc》由会员分享,可在线阅读,更多相关《[计算机]uip_process流程.doc(7页珍藏版)》请在三一文库上搜索。

1、uip_process(u8_t flag)(1)if(flag = UIP_UDP_SEND_CONN),若是则goto udp_send;不是则向下执行;(2)if(flag = UIP_POLL_REQUEST) if(tcpstateflags= UIP_ESTABLISHED &!uip_outstanding(uip_connr)如果处于稳定连接状态且没有数据在缓存中等待确认则:uip_flags = UIP_POLL; UIP_APPCALL();goto appsend;goto drop;else if(flag = UIP_TIMER) uip_len = 0; uip_s

2、len = 0; 如果连接处于等待超时关闭状态则增加超时计数器,如果到达超时期限则关闭当前连接tcpstateflags = UIP_CLOSED;if(tcpstateflags != UIP_CLOSED) 如果连接不处于关闭状态if(uip_outstanding(uip_connr)&(timer- = 0) 已经发送的数据包还未接收到对其的ACK,超时计数器减一且超时计数器值为0如果到达所设定的重发次数则:1、 tcpstateflags = UIP_CLOSED;关闭当前连接2、 uip_flags = UIP_TIMEDOUT;通知应用程序超时;3、 UIP_APPCALL();

3、4、 设置RST+ACK终止连接标志5、 goto tcp_send_nodata;没有到达设定的重发次数则重传数据:1、 重置重传计数器2、 switch(tcpstateflags)根据连接处的不同状态重发不同的数据包case UIP_SYN_RCVD: goto tcp_send_synack;重新发送先前发送的SYN+ACKcase UIP_SYN_SENT:goto tcp_send_syn;重发SYN请求连接case UIP_ESTABLISHED:uip_flags = UIP_REXMIT;UIP_APPCALL(); 调用上层应用程序,通知重新生成数据重发goto appre

4、xmit;进入重发阶段case UIP_FIN_WAIT_1:case UIP_CLOSING: case UIP_LAST_ACK: goto tcp_send_finack;重发FIN+ACK关闭连接else if(tcpstateflags) = UIP_ESTABLISHED) 处于稳定连接状态且上次发送的数据接收到正确的ACK,可以继续发送新数据uip_flags = UIP_POLL;询问应用程序是否有数据要发送UIP_APPCALL();调用应用程序产生数据goto appsend;发送数据 goto drop;if(flag = UIP_UDP_TIMER)当前连接的本地端口不

5、为0则uip_len = uip_slen = 0;uip_flags = UIP_POLL;询问应用程序是否有数据要发送UIP_UDP_APPCALL();调用应用程序产生数据goto udp_send;本地端口为0,表明没有建立DUP连接,则goto drop;(3)检查IP帧头中的IP版本及IP头长度是否符合要求:不符合:goto drop;丢弃此包符合继续向下执行(4)检查目的IP地址是否为本机地址:不是,goto drop;丢弃此包是,向下继续执行 (5)if(BUF-proto = UIP_PROTO_TCP)IP上层协议是否为TCP协议是,goto tcp_input;进入TCP

6、数据处理模块不是,继续向下执行(6) if(BUF-proto = UIP_PROTO_UDP)IP上层协议是否为UDP协议 是,goto udp_input;进入UDP数据处理模块不是,继续向下执行(7) if(BUF-proto != UIP_PROTO_ICMP) 不是TCP不是UDP也不是ICMP协议goto drop;本机只处理UDP、TCP、ICMP数据包,其它包都将丢弃(8) 运行到此处,表明接收到的是ICMP数据包,继续向下执行;icmp_input:此处为ICMP数据包处理部分,比较简单不做详解。此部分仅仅接收ECHO命令,若接收到别的命令,则将数据包丢弃。若接收到的是ECH

7、O命令则返回包含ECHO_REPLY的ICMP数据包给远方主机,主要是用来响应ping命令。udp_input:(1) 根据要求校验UDP数据(2) 在UDP连接列表中寻找接收到的数据包是否属于列表中的连接,若是则 goto udp_found; 如果不是则 goto drop;udp_found:(1) 接收到数据数设置uip_flags = UIP_NEWDATA; 将uip_sappdata ,uip_appdata指向接收到的UDP包的数据部分。(2) 调用UIP_UDP_APPCALL();使应用程序处理接收到的数据;(3) 继续向下执行udp_send:(1) 如果uip_slen

8、 = 0表明没有数据要发送,则直接goto drop;(2) 计算UDP数据包长度,填充UDP、IP帧头中的数据长度及相关选项;(3) 根据要求计算校验和;(4) goto ip_send_nolen;发送UDP数据包;tcp_input:(1) 检查TCP校验和,若正确向下继续,若错误则丢弃此包直接返回;(2) 在TCP连接列表uip_conns中轮询,检查接收到的TCP数据包是否已经建立连接(通过逐个比较源端口、目的端口和源IP是否与链接列表中的相同)。若找到goto found;没有找到则检查接收到的TCP数据包中是否含有SYN请求建立连接标志:若没有则goto reset;发送RST+

9、ACK断开连接;若有则检查uip_listenports监听列表,若TCP数据包目的端口在监听列表中则goto found_listen;若不在监听列表中则向下执行,进入 reset;发送RST+ACK断开连接;reset:(1) 接收到的是RST断开连接包,则直接丢包,返回;(2) 设置RST+ACK标志,填充适当的TCP帧头;(3) goto tcp_send_noconn;发送TCP数据包;found_listen:(1) 从链接列表中找出一个空链接或剩余生存时间最短的连接;(2) 将找到的链接列表根据接收到的TCP数据包进行初始化;(3) 设置TCP状态为UIP_SYN_RCVD;分析

10、TCP的最大段长度;(4) 向下执行,发送ACKtcp_send_synack:(1) 设置ACK标志(2) 向下执行tcp_send_syn:(1) 设置SYN标志(2) 填充TCP选项中最大报文段长度MSS(3) goto tcp_send;found:(1) 若接收到的是RST数据包,则将本连接状态置为UIP_CLOSED,uip_flags = UIP_ABORT;,调用UIP_APPCALL()通知应用程序处理连接断开请求。然后丢弃此包,直接返回;(2) 检查接收到的数据包中的数据编号是否为自己等在等待的数据编号,若不是则goto tcp_send_ack;发送自己期望的数据编号的数

11、据,即请求重传。若是则继续向下;(3) 检查接收到的数据包中是否包含ACK,若是则:更新发送数据序列的编号,使之可以发送后续数据;计算RTT时间,重新设置RTT时间;uip_flags = UIP_ACKDATA;表明接收到ACKuip_connr-len = 0;表明等待ACK的数据长度为0,即可以发送其它数据继续向下;若不是:继续向下;TCP状态机switch(tcpstateflags)case UIP_SYN_RCVD:(1) 检查uip_flags=UIP_ACKDATA即是否接收到对自己发送SYN的ACK确认,若是则:cpstateflags = UIP_ESTABLISHED;/

12、*进入ESTABLISHED状态*/ uip_flags = UIP_CONNECTED;/*连接成功*检查数据包长度是否包含数据部分,若是则uip_flags |= UIP_NEWDATA;调用UIP_APPCALL()处理刚建立的连接和新接收到数据;goto appsend;若不是则goto drop;丢包返回;case UIP_SYN_SENT:(1) 如果接收到ACK且为SYN+ACK则:检查TCP扩展选项,如果有扩展选项从中取出MSS信息;tcpstateflags = UIP_ESTABLISHED;进入ESTABLISHED状态设置接收编号,uip_flags = UIP_CON

13、NECTED | UIP_NEWDATA;调用UIP_APPCALL()处理刚建立的连接和新接收到数据;goto appsend;(2) 没有接收到ACK且为SYN+ACK则:uip_flags = UIP_ABORT;终止连接调用UIP_APPCALL();tcpstateflags = UIP_CLOSED;关闭TCP连接goto reset;case UIP_ESTABLISHED:(1) 接收到远方主机的FIN请求: uip_flags |= UIP_CLOSE;关闭TCP连接如果接收到的数据包中还包含有数据则uip_flags |= UIP_NEWDATA;调用UIP_APPCALL

14、()处理刚关闭的连接和新接收到数据;发送TCP_FIN +TCP_ACK,关闭连接;(2) 如果接收到的数据状态为UIP_NEWDATA | UIP_ACKDATA则:调用UIP_APPCALL();处理接收到的包;appsend:(1) 如果(uip_flags & UIP_ABORT)终止连接则tcpstateflags = UIP_CLOSED;关闭TCP连接;发送RST+ACK关闭连接;(2) 如果(uip_flags & UIP_CLOSE)正常关闭连接则:tcpstateflags = UIP_FIN_WAIT_1;进入等待关闭状态发送FIN+ACK告知对方关闭连接;(3) 如果u

15、ip_slen 0有数据要发送则设置发送数据的长度apprexmit:(1) 如果(uip_slen 0 & uip_connr-len 0)则发送PSH_ACK数据包;(2) 如果(uip_flags & UIP_NEWDATA)仅仅是发送ACK,没有数据要发送则发送对接收到数据的ACK;(3) 以上都不是goto drop;case UIP_LAST_ACK:(1) 如果uip_flags & UIP_ACKDATA接收到对本机发送的FIN的ACK确认则:tcpstateflags = UIP_CLOSED;将连接置为关闭状态uip_flags = UIP_CLOSE;调用UIP_APPC

16、ALL();通知应用程序连接已经断开;case UIP_FIN_WAIT_1:(1) 此时本机已经关闭连接等待对方关闭连接,如果接收到数据并不处理,仅仅将接收到数据包数目加一;(2) 如果接收到FIN请求:如果(uip_flags & UIP_ACKDATA)接收到对本机发送FIN的确认则将连接状态置为tcpstateflags = UIP_TIME_WAIT;否则的话则将连接状态置为tcpstateflags = UIP_CLOSING;uip_flags = UIP_CLOSE; 调用UIP_APPCALL();通知应用程序有一方已经关闭连接goto tcp_send_ack;(2) 如果

17、(uip_flags & UIP_ACKDATA)仅仅接收到ACK则设置连接状态标志tcpstateflags = UIP_FIN_WAIT_2; 进入等待对方关闭阶段(3) 如果(uip_len 0)表明接收到数据包则goto tcp_send_ack;发送对接收到数据的确认ACK;(4) goto drop;case UIP_FIN_WAIT_2:(1) 此时本机已经关闭连接等待对方关闭连接,如果接收到数据并不处理,仅仅将接收到数据包数目加一;(2) 如果接收到对方发送的FIN请求。则设置tcpstateflags = UIP_TIME_WAIT;进入超时关闭状态;uip_flags =

18、UIP_CLOSE; 调用UIP_APPCALL();通知应用程序有一方已经关闭连接goto tcp_send_ack;(3) 如果(uip_len 0)表明接收到数据包则goto tcp_send_ack;发送对接收到数据的确认ACK;(4) goto drop;case UIP_TIME_WAIT:(1)goto tcp_send_ack;case UIP_CLOSING:(1) 如果(uip_flags & UIP_ACKDATA)接收到对FIN的ACK,连接进入超时等待状态tcpstateflags = UIP_TIME_WAIT;Endcasetcp_send_ack:(1) 设置A

19、CK标志 tcp_send_nodata:(1) 将长度设为帧头长度,不包含数据tcp_send_noopts:(1) 将选项长度设为0tcp_send:(1) 填充TCP帧头确认编号和发送编号,IP地址和端口号;(2) 如果tcpstateflags & UIP_STOPPED要求暂停发送数据则将接收窗口设为0;禁止对方往自己发送数据;tcp_send_noconn:(1) 设置TCP包生存时间,传送的数据的长度;(2) 计算TCP校验和ip_send_nolen:(1) 设置IP帧头中的各个选项(2) 计算IP校验和send:(1) 将发送的数据包计数器加一;(2) uip_flags = 0; return;drop:(1)uip_len = 0;(2)uip_flags = 0;(3)return;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1