- 论坛徽章:
- 0
|
本帖最后由 Huntsmen 于 2013-11-03 00:02 编辑
问题1,关于发送窗口的问题
前提条件:
mss=300,接收方通告了一个窗口为1000,然后发送3个段即900个字节,但是都没有收到确认,剩余发送窗口只剩下100个字节;
场景:
这个时候又有300字节的数据到来,tcp_sendmsg会产生一个新的skb挂在sk_send_head下面,产生skb的时候并没有考虑snd_wnd,而是考虑的mss来决定skb的大小,所以skb->len=300,
skb组好之后就调用tcp_push->tcp_write_xmit->tcp_snd_wnd_test时检查是否在发送窗口之内,
虽然发送窗口还可以发送100个字节,但是tcp_snd_wnd_test检查没有通过,这一包数据不能发送,只有等通告窗口变大之后才能接着发,这样是否不太合理- static bool tcp_snd_wnd_test(const struct tcp_sock *tp,
- const struct sk_buff *skb,
- unsigned int cur_mss)
- {
- u32 end_seq = TCP_SKB_CB(skb)->end_seq;
- if (skb->len > cur_mss)
- end_seq = TCP_SKB_CB(skb)->seq + cur_mss;
- return !after(end_seq, tcp_wnd_end(tp));
- }
复制代码 问题2:对OOB数据的理解是否正确?
对于带外数据OOB,TCP的处理是当做紧急URG数据来处理,
在发送端它的发送也是按照应用层递交的顺序来发送的,比如应用层调用send发送了10包数据之后再调用send发送一个oob数据,tcp的处理是将10包普通数据发送完之后才会发送这1包oob数据,不会将他们的顺序颠倒;
但是在接收方,收到这些数据之后,递交给应用层的顺序是有可能颠倒的;
|
|