static int tcp_v4_checksum_init(struct sk_buff *skb) { /* 如果TCP报头、TCP数据的反码累加已经由硬件完成 */ if (skb->ip_summed == CHECKSUM_HW) { /* 现在只需要再累加上伪首部,取反获取最终的校验和。 * 校验和为0时,表示TCP数据报正确。 */ if (! tcp_v4_check(skb->h.th, skb->len...
if (tcp_v4_check(skb->h.th,skb->len,skb->nh.iph->saddr, 附加伪头标进行校验 skb->nh.iph->daddr,skb->csum)) { NETDEBUG(printk(KERN_DEBUG "hw tcp v4 csum failed\n")); return -1; } skb->ip_summed = CHECKSUM_UNNECESSARY; } else { if (skb->len <= 76) { 如果TCP包全长...
if(!skb_csum_unnecessary(skb)&&tcp_v4_checksum_init(skb)) gotobad_packet; /* 将sequence,ack等保存到socket的TCP控制块中 */ th=tcp_hdr(skb); iph=ip_hdr(skb); TCP_SKB_CB(skb)->seq=ntohl(th->seq); TCP_SKB_CB(skb)->end_seq=(TCP_SKB_CB(skb)->seq+th->syn+th->fin+ skb->l...
tcp_v4_rcv函数为TCP的总入口,数据包从IP层传递上来,进入该函数;其协议操作函数结构如下所示,其中handler即为IP层向TCP传递数据包的回调函数,设置为tcp_v4_rcv; 1staticstructnet_protocol tcp_protocol ={2.early_demux =tcp_v4_early_demux,3.early_demux_handler =tcp_v4_early_demux,4.handler =tcp_v4_...
tcp_v4_send_reset(sk, skb); ...caseTCP_TW_SUCCESS:; } 由于是TCP,所以要先检查数据包的checksum。 Look Up:根据相关的信息检索socket buffer。 Process:根据TCP状态判断要进行什么操作,然后跳转到相应的代码段。 Put and Return:当这个数据包合法时,将其送入socket队列。 No TCP Socket:...
发送FIN第四次握手:接收FIN的ACK非核心代码分析BSD Socket层cmsgflag数据报类型Sock CheckSumSK StreamcskstreamwaitconnectcpskbmaypullInetcinetstreamconnectcinethashconnect inethashconnectcinetcskreqskqueueaddcinettwskputTCP相关参数TCP 标志宏函数宏TCP CheckSumctcpchecksumcompletectcpv4checksuminitTCP InitializeTCP ...
(tcp_checksum_complete(skb)) goto csum_err; if (sk->sk_state == TCP_LISTEN) { /* 检查SYNCOOKIE,即通过报文的时间戳判断其里面是否包含COOKIE信息 */ struct sock *nsk = tcp_v4_cookie_check(sk, skb); if (!nsk) goto discard; if (nsk != sk) { /* 说明这是一个包含SYNCOOKIE的报文,...
ip层的入口在ip_rcv函数,该函数首先会做包括 package checksum 在内的各种检查,如果需要的话会做 IP defragment(将多个分片合并),然后 packet 调用已经注册的 Pre-routing netfilter hook ,完成后最终到达ip_rcv_finish函数。 int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *...
如果希望 UDP 报文 checksum 及时有错也要发送给应用程序,可以在通过 socket 参数禁用 UDP checksum 检查: int disable = 1; setsockopt(sock_fd, SOL_SOCKET, SO_NO_CHECK, (void*)&disable, sizeof(disable) 防火墙 如果系统防火墙丢包,表现的行为一般是所有的 报文都无法正常接收,当然不排除防火墙只 drop 一...
通过bt可以查看到进入tcp_v4_connect时的堆栈,因此我们已经可以逐步调试TCP/IP的源码了。 2.8 环境配置总结 通过前述一系列的操作我们就可以像调试普通程序一样调试 Linux 内核了。Linux 的内核入口函数是位于 init/main.c 中的 start_kernel,相当于普通 C 程序的 main 函数,负责完成各种内核模块的初始化。 接下...