uip_process运行流程 struts2运行流程

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_process运行流程 struts2运行流程

{

①uip_flags = UIP_POLL;

②UIP_APPCALL();

③goto appsend;

}

goto drop;

}

else if(flag == UIP_TIMER)

{

uip_len = 0;

uip_slen = 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();
  4. 设置RST+ACK终止连接标志
  5. gototcp_send_nodata;

②没有到达设定的重发次数则重传数据:

  1. 重置重传计数器
  2. switch(tcpstateflags)根据连接处的不同状态重发不同的数据包

    caseUIP_SYN_RCVD:

    gototcp_send_synack;重新发送先前发送的SYN+ACK

    caseUIP_SYN_SENT:

    gototcp_send_syn;重发SYN请求连接

    caseUIP_ESTABLISHED:

    uip_flags= UIP_REXMIT;

    UIP_APPCALL();调用上层应用程序,通知重新生成数据重发

    gotoapprexmit;进入重发阶段

    caseUIP_FIN_WAIT_1:

    caseUIP_CLOSING:

    caseUIP_LAST_ACK:

    goto tcp_send_finack;重发FIN+ACK关闭连接

}

else if(tcpstateflags) ==UIP_ESTABLISHED)处于稳定连接状态且上次发送的数据接收到正确的ACK,可以继续发送新数据

{

①uip_flags= UIP_POLL;询问应用程序是否有数据要发送

②UIP_APPCALL();调用应用程序产生数据

③gotoappsend;发送数据

}

}

goto drop;

}

if(flag == UIP_UDP_TIMER)

{

当前连接的本地端口不为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数据处理模块

②不是,继续向下执行

  1. if(BUF->proto == UIP_PROTO_UDP)IP上层协议是否为UDP协议

    ①是,gotoudp_input;进入UDP数据处理模块

    ②不是,继续向下执行

  2. if(BUF->proto != UIP_PROTO_ICMP)不是TCP不是UDP也不是ICMP协议

    ①goto drop;本机只处理UDP、TCP、ICMP数据包,其它包都将丢弃

  3. 运行到此处,表明接收到的是ICMP数据包,继续向下执行;

    ———————————————————————————————————————

    icmp_input:

    此处为ICMP数据包处理部分,比较简单不做详解。

    此部分仅仅接收ECHO命令,若接收到别的命令,则将数据包丢弃。若接收到的是ECHO命令则返回包含ECHO_REPLY的ICMP数据包给远方主机,主要是用来响应ping命令。

    ———————————————————————————————————————

    udp_input:

  4. 根据要求校验UDP数据
  5. 在UDP连接列表中寻找接收到的数据包是否属于列表中的连接,若是则goto udp_found;

    如果不是则 goto drop;

    udp_found:

  6. 接收到数据数设置uip_flags = UIP_NEWDATA; 将uip_sappdata,uip_appdata指向接收到的UDP包的数据部分。
  7. 调用UIP_UDP_APPCALL();使应用程序处理接收到的数据;
  8. 继续向下执行

    udp_send:

  9. 如果uip_slen == 0表明没有数据要发送,则直接gotodrop;
  10. 计算UDP数据包长度,填充UDP、IP帧头中的数据长度及相关选项;
  11. 根据要求计算校验和;
  12. goto ip_send_nolen;发送UDP数据包;

    ———————————————————————————————————————

  13. 检查TCP校验和,若正确向下继续,若错误则丢弃此包直接返回;
  14. 在TCP连接列表uip_conns中轮询,检查接收到的TCP数据包是否已经建立连接(通过逐个比较源端口、目的端口和源IP是否与链接列表中的相同)。

    若找到goto found;

    没有找到则检查接收到的TCP数据包中是否含有SYN请求建立连接标志:

    若没有则goto reset;发送RST+ACK断开连接;

    若有则检查uip_listenports监听列表,若TCP数据包目的端口在监听列表中则goto found_listen;若不在监听列表中则向下执行,进入 reset;发送RST+ACK断开连接;

    reset:

  15. 接收到的是RST断开连接包,则直接丢包,返回;
  16. 设置RST+ACK标志,填充适当的TCP帧头;
  17. goto tcp_send_noconn;发送TCP数据包;

    found_listen:

  18. 从链接列表中找出一个空链接或剩余生存时间最短的连接;
  19. 将找到的链接列表根据接收到的TCP数据包进行初始化;
  20. 设置TCP状态为UIP_SYN_RCVD;分析TCP的最大段长度;
  21. 向下执行,发送ACK

    tcp_send_synack:

  22. 设置ACK标志
  23. 向下执行

    tcp_send_syn:

  24. 设置SYN标志
  25. 填充TCP选项中最大报文段长度MSS
  26. goto tcp_send;

    found:

  27. 若接收到的是RST数据包,则将本连接状态置为UIP_CLOSED,uip_flags = UIP_ABORT;,调用UIP_APPCALL()通知应用程序处理连接断开请求。然后丢弃此包,直接返回;
  28. 检查接收到的数据包中的数据编号是否为自己等在等待的数据编号,若不是则goto tcp_send_ack;发送自己期望的数据编号的数据,即请求重传。若是则继续向下;
  29. 检查接 收到的数据包中是否包含ACK,

    若是则:

    ①更新发送数据序列的编号,使之可以发送后续数据;

    ②计算RTT时间,重新设置RTT时间;

    ③uip_flags = UIP_ACKDATA;表明接收到ACK

    ④uip_connr->len =0;表明等待ACK的数据长度为0,即可以发送其它数据

    ⑤继续向下;

    若不是:继续向下;

    TCP状态机

    switch(tcpstateflags)

    case UIP_SYN_RCVD:

  30. 检查uip_flags==UIP_ACKDATA即是否接收到对自己发送SYN的ACK确认,

    若是则:

    ①cpstateflags = UIP_ESTABLISHED;

    uip_flags = UIP_CONNECTED;/*连接成功*

    ②检查数据包长度是否包含数据部分,若是则uip_flags |=UIP_NEWDATA;

    ③调用UIP_APPCALL()处理刚建立的连接和新接收到数据;

    ⑤goto appsend;

    若不是则goto drop;丢包返回;

    case UIP_SYN_SENT:

  31. 如果接收到ACK且为SYN+ACK则:

    ①检查TCP扩展选项,如果有扩展选项从中取出MSS信息;

    ②tcpstateflags = UIP_ESTABLISHED;进入ESTABLISHED状态

    ③设置接收编号,uip_flags = UIP_CONNECTED | UIP_NEWDATA;调用UIP_APPCALL()处理刚建立的连接和新接收到数据;

    ④goto appsend;

  32. 没有接收到ACK且为SYN+ACK则:

    ①uip_flags = UIP_ABORT;终止连接调用UIP_APPCALL();

    ②tcpstateflags = UIP_CLOSED;关闭TCP连接

    ③goto reset;

    case UIP_ESTABLISHED:

  33. 接收到远方主机的FIN请求:

    ① uip_flags |= UIP_CLOSE;关闭TCP连接

    ②如果接收到的数据包中还包含有数据则uip_flags |=UIP_NEWDATA;

    ③调用UIP_APPCALL()处理刚关闭的连接和新接收到数据;

    ④发送TCP_FIN+TCP_ACK,关闭连接;

  34. 如果接收到的数据状态为UIP_NEWDATA | UIP_ACKDATA则:

    ①调用UIP_APPCALL();处理接收到的包;

    appsend:

  35. 如果(uip_flags &UIP_ABORT)终止连接则

    ①tcpstateflags = UIP_CLOSED;关闭TCP连接;

    ②发送RST+ACK关闭连接;

  36. 如果(uip_flags &UIP_CLOSE)正常关闭连接则:

    ①tcpstateflags = UIP_FIN_WAIT_1;进入等待关闭状态

    ②发送FIN+ACK告知对方关闭连接;

  37. 如果uip_slen >0有数据要发送则设置发送数据的长度

    apprexmit:

  38. 如果(uip_slen > 0&& uip_connr->len> 0)则发送PSH_ACK数据包;
  39. 如果(uip_flags &UIP_NEWDATA)仅仅是发送ACK,没有数据要发送则发送对接收到数据的ACK;
  40. 以上都不是goto drop;

    case UIP_LAST_ACK:

  41. 如果uip_flags &UIP_ACKDATA接收到对本机发送的FIN的ACK确认则:

    ①tcpstateflags =UIP_CLOSED;将连接置为关闭状态

    ②uip_flags =UIP_CLOSE;调用UIP_APPCALL();通知应用程序连接已经断开;

    case UIP_FIN_WAIT_1:

  42. 此时本机已经关闭连接等待对方关闭连接,如果接收到数据并不处理,仅仅将接收到数据包数目加一;
  43. 如果接收到FIN请求:

    ①如果(uip_flags &UIP_ACKDATA)接收到对本机发送FIN的确认则将连接状态置为tcpstateflags = UIP_TIME_WAIT;

    ②否则的话则将连接状态置为tcpstateflags =UIP_CLOSING;

    ③uip_flags = UIP_CLOSE; 调用UIP_APPCALL();通知应用程序有一方已经关闭连接

    ④goto tcp_send_ack;

  44. 如果(uip_flags & UIP_ACKDATA)仅仅接收到ACK则设置连接状态标志tcpstateflags =UIP_FIN_WAIT_2;进入等待对方关闭阶段
  45. 如果(uip_len > 0)表明接收到数据包则gototcp_send_ack;发送对接收到数据的确认ACK;
  46. gotodrop;

    case UIP_FIN_WAIT_2:

  47. 此时本机已经关闭连接等待对方关闭连接,如果接收到数据并不处理,仅仅将接收到数据包数目加一;
  48. 如果接收到对方发送的FIN请求。则

    ①设置tcpstateflags =UIP_TIME_WAIT;进入超时关闭状态;

    ②uip_flags = UIP_CLOSE; 调用UIP_APPCALL();通知应用程序有一方已经关闭连接

    ③goto tcp_send_ack;

  49. 如果(uip_len > 0)表明接收到数据包则gototcp_send_ack;发送对接收到数据的确认ACK;
  50. gotodrop;

    case UIP_TIME_WAIT:

    (1)goto tcp_send_ack;

    case UIP_CLOSING:

  51. 如果(uip_flags & UIP_ACKDATA)接收到对FIN的ACK,连接进入超时等待状态tcpstateflags= UIP_TIME_WAIT;

    Endcase

    ———————————————————————————————————————

    tcp_send_ack:

  52. 设置ACK标志

    tcp_send_nodata:

  53. 将长度设为帧头长度,不包含数据

    tcp_send_noopts:

  54. 将选项长度设为0

    tcp_send:

  55. 填充TCP帧头确认编号和发送编号,IP地址和端口号;
  56. 如果tcpstateflags & UIP_STOPPED要求暂停发送数据则将接收窗口设为0;禁止对方往自己发送数据;

    tcp_send_noconn:

  57. 设置TCP包生存时间,传送的数据的长度;
  58. 计算TCP校验和

    ip_send_nolen:

  59. 设置IP帧头中的各个选项
  60. 计算IP校验和

    send:

  61. 将发送的数据包计数器加一;
  62. uip_flags = 0; return;

    drop:

    (1)uip_len = 0;

    (2)uip_flags = 0;

    (3)return;

  

爱华网本文地址 » http://www.aihuau.com/a/25101015/260504.html

更多阅读

uip_process运行流程 struts2运行流程

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_process运行流程 struts2运行流程》为网友心动猛男分享!如侵犯到您的合法权益请联系我们删除