if (unlikely(tp->repair)) { err = -EPERM; if (!(flags & MSG_PEEK)) goto out; if (tp->repair_queue == TCP_SEND_QUEUE) goto recv_sndq; err = -EINVAL; if (tp->repair_queue == TCP_NO_QUEUE) goto out; ... last = skb_peek_tail(&sk->sk_receive_queue); skb_queue_walk(...
(flags & MSG_PEEK)) // 如果没有设置MSG_PEEK标志 goto out; // 直接处理错误 if (tp->repair_queue == TCP_SEND_QUEUE) // 如果是发送队列 goto recv_sndq; // 跳转到处理发送队列的代码段 err = -EINVAL; // 设置错误为"无效参数" if (tp->repair_queue == TCP_NO_QUEUE) // 如果没有...
tcp_passive_fastopen(sk)) { err = sk_stream_wait_connect(sk, &timeo); if (err != 0) goto do_error; } // tcp repair选项开启后的处理 if (unlikely(tp->repair)) { if (tp->repair_queue == TCP_RECV_QUEUE) { copied = tcp_send_rcvq(sk, msg, size); goto out_nopush; } err ...
max_segs=tcp_tso_segs(sk, mss_now);while((skb =tcp_send_head(sk))) { unsignedintlimit;if(unlikely(tp->repair) && tp->repair_queue ==TCP_SEND_QUEUE) {/*"skb_mstamp_ns" is used as a start point for the retransmit timer*/skb->skb_mstamp_ns = tp->tcp_wstamp_ns = tp->tcp...
1 Backlog Queue (sk->backlog) 2 Prequeue Queue (tp->ucopy.prequeue) 3 Receive Queue (sk->receive_queue) 然后来看3个队列的区别。 首先sk_backlog队列是当当前的sock在进程上下文中被使用时,如果这个时候有数据到来,则将数据拷贝到sk_backlog. ...
if (tp->repair_queue == TCP_NO_QUEUE) goto out; ... last = skb_peek_tail(&sk->sk_receive_queue); skb_queue_walk(&sk->sk_receive_queue, skb) { last = skb; ... if (!(flags & MSG_TRUNC)) { err = skb_copy_datagram_msg(skb, offset, msg, used); if (err)...
*/ if (flags & MSG_OOB) goto recv_urg; if (unlikely(tp->repair)) { err = -EPERM; if (!(flags & MSG_PEEK)) goto out; if (tp->repair_queue == TCP_SEND_QUEUE) goto recv_sndq; err = -EINVAL; if (tp->repair_queue == TCP_NO_QUEUE) goto out; /* 'common' recv queue ...
tcp_data_queue(sk, skb); //如果进入了这个函数,乱序会被纠正,fin的处理也在该函数中 queued = 1; break; 如果运行到了这里,基本可以确定fin会被正常处理,所以我们将这个位置作为我们检查的终点。也就是说,乱序的fin-20622应当是没有成功到达此处的。我们从这个位置开始,向前查找,找到了一个非常可疑的位置,...
void tcp_shutdown(struct sock *sk, int how){ /* We need to grab some memory, and put together a FIN, * and then put it into the queue to be sent. * Tim MacKenzie(tym@dibbler.cs.monash.edu.au) 4 Dec '92. */ if (!(how & SEND_SHUTDOWN)) return; ...
可以参考:Bufferbloat: Dark Buffers in the Internet - ACM Queue PRR 在CUBIC 之上又有个优化,叫做 Proportional Rate Reduction (PRR),用以让 CUBIC 这种算法在遇到丢包时候能更快的恢复到当前 CWND 正常值,而不过分的降低到过低的水平。 参考: draft-mathis-tcpm-proportional-rate-reduction-01 - Proportional...