1. LWIP之DNS模块走读
应用层调用gethostbyname,对应调用lwip_gethostbyname,然后调用netconn_gethostbyname,之后就等待netconn_gethostbyname。那么netconn_gethostbyname做了什么事呢?
netconn_gethostbyname首先先申请了一个消息邮箱,然后通过tcpip_callback将该消息发送到tcpip_thread,之后等待获取完成的信号量。tcpip_thread线程收到该消息后,会调用一次lwip_netconn_do_gethostbyname,如果存在dns缓存,则lwip_netconn_do_gethostbyname会发送获取完成的信号量。否则就在dns_recv中调用dns_correct_response中lwip_netconn_do_dns_found,此时不管有没有获取到,都将netconn_gethostbyname都将会返回。dns_call_found就是通知有没有发现的意思
注:Linux下的TCP延迟确认机制–TCP_QUICKACK,在lwip,tcp_in.c中将tcp_ack改为tcp_ack_now就是取消延迟确认
注:只要服务器listen了,客户端connect就可以返回成功,accept只是返回句柄给服务器使用
2.LWIP之TCP接收窗口设置
当TCP_WND<=0xFFFF时,那么不需要使用窗口扩大因子,实际窗口就是TCP_WND。
当TCP_WND>0xFFFF时,那么需要使用窗口扩大因子, #define LWIP_WND_SCALE 1, #define TCP_RCV_SCALE 8,
需要注意的是,当使用这种方式时,窗口需要计算准确才能得到预期的值,实际值为:
((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF) * 2 ^(TCP_RCV_SCALE) ,假设计算结果
要与我们的预期值相等,那么等到等式:
((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF) * 2 ^(TCP_RCV_SCALE) = TCP_WND
简化得到:
((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF) = ((TCP_WND >> TCP_RCV_SCALE),
由此可知:
TCP_WND >> TCP_RCV_SCALE 的结果必须小于等于0xFFFF,如果大于0xFFFF,那么
将会出现预期值与实际值不符合的情况。