mtu1500的时候,其实数据不是1500最大是1460(搜索方便匹配关键词)
1.linux 网卡默认开启了 TSO导致了数据包重组分配发生在网卡上。所以抓到的大数据包都会超过1500
2.关闭之后是根据mss值协商大小后,进行tcp数据组装然后网卡二层封装转发。
我有一个疑问:tcpdump抓包是在网卡进行ip分片前还是后,当然现象是分片前。没有找到相关资料去证明在混杂模式中,抓到的数据包是否为分片。
这个问题:就看网卡是否开启了分片操作了,网卡分片了内核就不管了。
网卡不开,内核就需要分片。 windows 不开 linux默认开了,不是网卡不支持是系统参数开启否。
3建议:
建议关闭TSO,因为开启后他是忽略了mss值协商的过程。对于高性能服务性能有网络影响。
不要看分片网卡帮忙解决了,计算量又能耗费多少。看重的还是过程。
Linux抓包原理:
Linux抓包是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权。当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载相似,就是让系统中所有的已经注册的文件系统来进行尝试挂载,如果哪一个认为自己可以处理,那么就完成挂载。
当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它来对网卡收到的报文进行一次处理,此时该模块就会趁机对报文进行窥探,也就是把这个报文完完整整的复制一份,假装是自己接收到的报文,汇报给抓包模块。
官方原理:
通过 __netif_receive_skb_core 将数据包传入上层。传入前先会将数据包交到 pcap,tcpdump 就是基于 libcap 实现的,libcap 之所以能捕捉到所有的数据包就是在
__netif_receive_skb_core
实现的。具体位置在:http://elixir.free-electrons.com/linux/v4.4/source/net/core/dev.c#L3850