tcp_queue_rcv用于将接收到的skb加入到接收队列receive_queue中,首先会调用tcp_try_coalesce进行分段合并到队列中最后一个skb的尝试,若失败则调用__skb_queue_tail添加该skb到队列尾部; 1staticint__must_check tcp_queue_rcv(structsock *sk,structsk_buff *skb,inthdrlen,2bool*fragstolen)3{4inteaten;56/*...
staticint__must_check tcp_queue_rcv(structsock *sk,structsk_buff *skb,inthdrlen,bool*fragstolen) {inteaten;/*取队尾*/structsk_buff *tail = skb_peek_tail(&sk->sk_receive_queue); __skb_pull(skb, hdrlen);/*尝试进行分段合并*/eaten= (tail &&tcp_try_coalesce(sk, tail, skb, fragst...
如果需要转发,则进入转发流程,调用dev_queue_xmit,进入链路层处理流程。如果不是发送到本机,应该是转发,调用 ip_forward 进行转发 。 传输层 在该层,我们会做一些完整性检查,如果发现问题就丢包。如果是tcp,则调用tcp_v4_do_rcv。 然后sk->sk_state == TCP_ESTABLISHED,调用tcp_rcv_builted,调用 tcp_data_q...
static int __must_check tcp_queue_rcv(struct sock *sk, struct sk_buff *skb, int hdrlen, bool *fragstolen) { int eaten; struct sk_buff *tail = skb_peek_tail(&sk->sk_receive_queue); __skb_pull(skb, hdrlen); eaten = (tail && tcp_try_coalesce(sk, tail, skb, fragstolen)) ?
* tcp_data_queue when everything is OK. */ 在tcp_rcv_established函数中,关于快速路径检查与执行部分如下: voidtcp_rcv_established(struct sock *sk, struct sk_buff *skb, conststruct tcphdr *th) { unsignedintlen = skb->len; structtcp_sock*tp=tcp_sk(sk); ...
最后调用下一层接口,包括tcp_v4_rcv(TCP)、udp_rcv(UDP)、icmp_rcv(ICMP)、igmp_rcv(IGMP)。如果需要转发,则进入转发流程,调用dev_queue_xmit,进入链路层处理流程。如果不是发送到本机,应该是转发,调用 ip_forward 进行转发 。 传输层 在该层,我们会做一些完整性检查,如果发现问题就丢包。如果是tcp,则调用...
rcv_queue:接收消息的队列 nrcv_que:接收队列中消息数量; snd_queue:发送消息的队列; nsnd_que:发送队列中消息数量; nodelay:是否启动无延迟模式。无延迟模式rtomin将设置为0,拥塞控制不启动; updated:是否调用过update函数的标识; ts_probe:下次探查窗口的时间戳; ...
在上面的 tcp_data_queue 函数里,如果收到的报文的序列号是我们预期的,也就是有序的话: 会判断该报文有没有 FIN 标志,如果有的话就会调用 tcp_fin 函数,这个函数负责将 FIN_WAIT_2 状态转换为 TIME_WAIT。 接着还会看乱序队列有没有数据,如果有的话会调用 tcp_ofo_queue 函数,这个函数负责检查乱序队列中...
(tcp_rcv_state_process是接收数据包时处理状态转移的函数,位于net/ipv4/tcp_input.c) case TCP_FIN_WAIT1: case TCP_FIN_WAIT2: /* RFC 793 says to queue data in these states, * RFC 1122 says we MUST send a reset. * BSD 4.4 also does reset. */ if (sk->sk_shutdown & RCV_SHUTDOWN...
rcv_queue:接收消息的队列 nrcv_que:接收队列中消息数量; snd_queue:发送消息的队列; nsnd_que:发送队列中消息数量; nodelay:是否启动无延迟模式。无延迟模式rtomin将设置为0,拥塞控制不启动; updated:是否调用过update函数的标识; ts_probe:下次探查窗口的时间戳; ...