答网友问——lwip的tcp接收窗口问题
(2012-12-02 17:03:37)
标签:
lwiptcp接收窗口为0rawapi |
分类: LwIP常见问题 |
前两天网友来信,又是同样的一个问题,这也是好多基于raw api做开发的朋友最容易忽略的一个问题,来信原文摘录(陈兄,侵犯您版权啦。。。):
五木您好!
很荣幸在网上看到您发表的一些关于lwip的文章,写的非常好。
我现在有个小问题想请教您一下,就是服务器发命令给我,然后我回复服务器,在回复的TCP首部中,窗口一直在减少,最初是2920个字节,最后减成0了,然后服务器就不跟我通讯了。后来我把下面红色语句部分改成pcb->rcv_ann_wnd
= pcb->rcv_wnd,使得rcv_ann_wnd是一个定值,但这样rcv_ann_right_edge 会在不停地变大,这样要不要紧呀,麻烦您指点我一下,非常感谢。
u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
{
u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
{
u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
if (TCP_SEQ_GEQ(new_right_edge,
pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2),
pcb->mss))) {
pcb->rcv_ann_wnd = pcb->rcv_wnd;
return new_right_edge - pcb->rcv_ann_right_edge;
} else {
if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
pcb->rcv_ann_wnd = 0;
} else {
pcb->rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
}
return 0;
}
}
pcb->rcv_ann_wnd = pcb->rcv_wnd;
return new_right_edge - pcb->rcv_ann_right_edge;
} else {
if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
pcb->rcv_ann_wnd = 0;
} else {
pcb->rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
}
return 0;
}
}
答: 你自己客户端的窗口为什么变成0了?你是使用raw
API编程的吧,这里你需要自己调用tcp_recved函数更新本地接收窗口,不然协议栈一直以为接收的数据未被应用层接收,那当然只能向服务器通告0窗口了,服务器也没法往客户端发数据了。一般情况下,内核不会有问题,所以不建议去修改内核的代码。