int tcp_v4_rcv(struct sk_buff *skb) { // 根据ip、端口等信息 获取sock。 sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest); if (!sk) goto no_tcp_socket; no_tcp_socket: // 检查数据包有没有出错 if (skb->len < (th->doff << 2) || tcp_checksum_complete(...
if (icsk->icsk_af_ops->conn_request(sk, skb) < 0) return 1; kfree_skb(skb); return 0; } goto discard; case TCP_SYN_SENT: ... return 0; } int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) { ... __u32 isn = TCP_SKB_CB(skb)->when; //重传时间戳 stru...
为了可以正确统计这些数据,内核给每个 tcp 包(tcp_skb_cb)添加了sacked字段标记该数据包当前的状态。 __u8 sacked; /* State flags for SACK. */ #define TCPCB_SACKED_ACKED 0x01 /* SKB ACK'd by a SACK block */ #define TCPCB_SACKED_RETRANS 0x02 /* SKB retransmitted */ #define TCPCB_LOST...
tp->rx_opt.saw_tstamp =0;//处理SYN_SENT状态下接收到的TCP段queued = tcp_rcv_synsent_state_process(sk, skb, th);if(queued >=0)returnqueued;//处理完第二次握手后,还需要处理带外数据tcp_urg(sk, skb, th); __kfree_skb(skb);//检测是否有数据需要发送tcp_data_snd_check(sk);return0; ...
tcp_v4_send_reset(NULL, skb); } } 内核在收到数据后会从物理层、数据链路层、网络层、传输层、应用层,一层一层往上传递。到传输层的时候,根据当前数据包的协议是TCP还是UDP走不一样的函数方法。可以简单认为,TCP数据包都会走到tcp_v4_rcv。这个方法会从全局哈希表里获取sock,如果此时服务端没有listen过 ...
after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt)) { //经过分析,不符合该条件 NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA); tcp_reset(sk); return 1; } } fallthrough; case TCP_ESTABLISHED: tcp_data_queue(sk, skb); //如果进入了这个函数,乱序会被纠正,fin的处理...
!after(TCP_SKB_CB(skb)->ack_seq, tp->snd_nxt)) { int tcp_header_len = tp->tcp_header_len; /* Check timestamp */ //时间戳选项之外如果还有别的选项就送给Slow Path处理 if (tcp_header_len == sizeof(struct tcphdr) + TCPOLEN_TSTAMP_ALIGNED) { ...
tcp_mark_skb_lost函数,如果此报文被重传过,既然已经丢失,清除其重传状态位TCPCB_SACKED_RETRANS,并且将tp_sk重传计数retrans_out减去报文数量。 重传报文再度丢失的情况下,sacked状态位为:(TCPCB_LOST | TCPCB_EVER_RETRANS),没有标志位TCPCB_SACKED_RETRANS。
简要来看就是sack会使用tcp_skb_cb,tcp_skb_cb最大数量是17,导致tcp_skb_cb合并时tcp_gso_segs字段溢出,触发kernel panic[跪了],话说为什么16要加一。。。【转发】@InfoQ:#小Q分享# 近日,Linux 内核发现三...
struct tcp_skb_cb { __u32 seq; /* Starting sequence number */ } 1. 2. 3. 如果在这个范围内疯狂猜测seq数值,并构造对应的包,发到目的机器,虽然概率低,但是总是能被试出来,从而实现RST攻击。这种乱棍打死老师傅的方式,就是所谓的合法窗口盲打(blind in-window attacks)。