随笔分类 - linux tcp/ip
摘要:http://www.cnhalo.net/2016/09/13/linux-gro/ GRO(Generic receive offload): 在napi poll里把小包封装成大包再递交给协议栈 LRO: GRO的硬件实现(通过网卡的RSC功能) http://lwn.net/Articles
阅读全文
摘要:/* * Main IP Receive routine. */ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { const
阅读全文
摘要:TCP核心:流量控制 拥塞控制 流量控制:滑动窗口来实现, 防止接收方能够处理过来 拥塞控制:防止过多的包被发送到网络中,避免出现网络负载过大 说一说 拥塞控制: 拥塞控制状态机的状态有五种,分别是Open,Disorder,CWR,Recovery和Loss状态 四个算法为慢启动,拥塞避免,拥塞发
阅读全文
摘要:来自:http://abcdxyzk.github.io/blog/2013/09/06/kernel-net-sack/ RFC文档rfc2883 rfc2018 tcp_ack中对sack的处理 if (TCP_SKB_CB(skb)->sacked)//SACK相关处理 flag |= tcp
阅读全文
摘要:抓包的时候,发现 tcp 三次握手中一般会有几个options 一个是mss 一个是ws 一个sack perm 这次主要是来说一说 sack 这个选项: 1. 只重传超时的数据包,比较实用与后面的数据包都能够正常接收的状况,只重传超时的数据包,但是如果比较坏的情况下,丢失了很多封包呢? 那就需要一
阅读全文
摘要:} /* * 延时ACK"定时器在TCP收到必须被确认但无需马上发出 * 确认的段时设定,TCP在200ms后发送确认响应。如果在 * 这200ms内,有数据要在该连接上发送,延时ACK响应就 * 可随数据一起发送回对端,称为捎带确认。 */ static void tcp_delack_timer
阅读全文
摘要:端口不可达: client >server 结果server回复端口不可达, 由于是icmp报文; 到达client内核协议栈后进入icmp_rcv处理: /* * Deal with incoming ICMP packets. */ int icmp_rcv(struct sk_buff *sk
阅读全文
摘要:/** * struct sock - network layer representation of sockets * @__sk_common: shared layout with inet_timewait_sock * @sk_shutdown: mask of %SEND_SHUTDO
阅读全文
摘要:1、连接建立定时器: tcp 连接建立时, client 会发出syn 然后等待ack,server 收到syn 后会回复ack 同时也会带上新的syn,此时等待客户端回复ack,当时server没有收到ack,server 会超时重发几次synack,最后没有收到ack,导致连接建立将终止。 创建
阅读全文
摘要:1、坚持定时器在接收方通告接收窗口为0,阻止发送端继续发送数据时设定。 由于连接接收端的发送窗口通告不可靠(只有数据才会确认),如果一个确认丢失了,双方就有可能因为等待对方而使连接终止: 接收放等待接收数据(因为它已经向发送方通过了一个非0窗口),而发送方在等待允许它继续发送数据的窗口更新。 为了防
阅读全文
摘要:滑动窗口 TCP发送方的窗口可以划分成四个部分: 1、已经发送并且确认的TCP段; 2、已经发送但是没有确认的TCP段; 3、未发送但是接收方准备接收的TCP段, 4、未发送并且接收方也为准备接受的TCP段。 第3部分是可用窗口,长度为snd_una + snd_wnd - snd_nxt。 第2部
阅读全文
摘要:tcp keepalive定时器 http server 和client端需要防止“僵死”链接过多!也就是建立了tcp链接,但是没有报文交互, 或者client 由于主机突然掉电!但是server 不知道! 所以需要有一种检测机制,检查tcp连接是否活着在也就是有报文交互!! 也就是检测:对方是否d
阅读全文
摘要:上一篇文章写道了udp 使用reuseport 多线程编程!!! 但是有几个问题需要考虑一下: 之前hash使用sip sport dip dport为key, 很正常同一个客户端回hash到同一个socket上。。但是其中一个线程挂了呢????????????对于TCP而言,hash的不一致仅仅影
阅读全文
摘要:目前昨天查一个线上问题:“”dns服务器在我们的设备, 有大量的终端到设备上请求解析域名,但是一直是单线程,dns报文处理不过来”, 然而设备是多核,dns服务器一直不能利用多核资源,所以能不能使用多线程进行处理呢? udp不像tcp那样,udp没有连接的概念,也就是没有通过建立多个连接来提高对dn
阅读全文
摘要:之前聊过tcpdump 抓包原理,tcpdump使用packet 抓包,使用packet_map 完成零拷贝。但是这个零拷贝也有点假,何为假呢?从网卡到内存走的dma,哪能不能直接从dma拷贝到用户空间呢?? 使用dpdk直接从网卡中轮询数据? 如果使用现有的tcpip协议栈,反正内核态需要处理网络
阅读全文
摘要:PACKET套接口创建 内核函数packet_create处理PF_PACKET套接口的创建工作。其参数sock->type决定了采用哪一种工作模式,如果参数type为SOCK_PACKET即第一种模式,type为SOCK_DGRAM或者SOCK_RAW即为第二种模式。 两种模式内核会赋予不同的操作
阅读全文
摘要:linux下抓包原理 linux下的抓包是通过注册一种虚拟的底层网络协议来完成对网络设备消息的处理权。当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它来对网卡收到的报文进行一次处理,此时该
阅读全文
摘要:ACK发送状态的转换图 ACK的发送状态清除 当成功发送ACK时,会删除延迟确认定时器,同时清零ACK的发送状态标志icsk->icsk_ack.pending ACK发送事件主要做了:更新快速确认模式中的ACK额度,删除ACK延迟定时器,清零icsk->icsk_ack.pending。 在快速确
阅读全文
摘要:TCP重传机制 TCP要保证所有的数据包都可以到达,所以,必需要有重传机制。 超时重传机制 一种是不回ack,死等3,当发送方发现收不到3的ack超时后,会重传3。一旦接收方收到3后,会ack 回 4——意味着3和4都收到了。 但是,这种方式会有比较严重的问题,那就是因为要死等3,所以会导致4和5即
阅读全文
摘要:接收到数据报后,会调用tcp_event_data_recv(),不管是在慢速路径的tcp_data_queue中调用还是 在快速路径中处理接收数据后直接调用,注意(如果len <= tcp_header_len 则是没有载荷),不会调用tcp_event_date_recv处理。 tcp_even
阅读全文