winpcap是对链路层的封装,而链路层是不对IP分片进行排序。
TCP传播方式应该是,应用层将数据从应用进程的缓冲区写入套接字发送缓冲区(可用SO_SENBUF设置),TCP分片时从套接字发送缓冲区取得MSS-TCP头数量 [ MSS <=MTU-IP头数量,一般由对方通告,(对方通告可以得到路径MTU,以免在通过路由等网络设备或到达对方主机时再分片)如果对方没有通告则设置为536 ] 大小的数据加上TCP头,传给IP层,IP层加上IP头,再将数据(IP头+TCP头+用户数据)分为小与MTU的包发给链路层的输出队列。因为TCP层转数据到IP层时,只传等于MSS大小的TCP分节,再加上IP头也不会超过MTU,所以就不存在IP层的分片。IP层的分片主要用于UDP数据及ICMP包,而不是用于TCP的。
注意:
无连接的数据报传输过程中,作为服务器的一方必须先启动
通信的一方可以不用bind()绑定地址和端口,由系统分配
不绑定IP地址和端口号的一方必须首先向绑定地址的一方发送数据
无连接客户端一般不调用connect(),在数据发送前客户与服务器各自通过socket()和bind()建立了半相关,发送数据时除指定本地套接口的地址外,还需要指定接收方套接口地址,从而在数据收发过程中动态建立全连接
RAW Socket原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket
1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包
2.socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧
3.socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))过时了,不要用。
理解一下SOCK_RAW的原理, 比如网卡收到了一个 14+20+8+100+4 的udp的以太网数据帧.
首先,网卡对该数据帧进行硬过滤(根据网卡的模式不同会有不同的动作,如果设置了promisc混杂模式的话,则不做任何过滤直接交给下一层输入例程,否则非本机mac或者广播mac会被直接丢弃).按照上面的例子,如果成功的话,会进入ip输入例程.但是在进入ip输入例程之前,系统会检查系统中是否有通过socket(AF_PACKET, SOCK_RAW, ..)创建的套接字.如果有的话并且协议相符,在这个例子中就是需要ETH_P_IP或者ETH_P_ALL类型.系统就给每个这样的socket接收缓冲区发送一个数据帧拷贝.然后进入下一步.
其次,进入了ip输入例程(ip层会对该数据包进行软过滤,就是检查校验或者丢弃非本机ip或者广播ip的数据包等,具体要参考源代码),例子中就是如果成功的话会进入udp输入例程.但是在交给udp输入例程之前,系统会检查系统中是否有通过socket(AF_INET, SOCK_RAW, ..)创建的套接字.如果有的话并且协议相符,在这个例子中就是需要IPPROTO_UDP类型.系统就给每个这样的socket接收缓冲区发送一个数据帧拷贝.然后进入下一步.
最后,进入udp输入例程 ...
ps:如果校验和出错的话,内核会直接丢弃该数据包的.而不会拷贝给sock_raw的套接字,因为校验和都出错了,数据肯定有问题的包括所有信息都没有意义了.
进一步分析他们的能力.
1. socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
能:该套接字可以接收协议类型为(tcp udp icmp等)发往本机的ip数据包,从上面看的就是20+8+100.
不能:不能收到非发往本地ip的数据包(ip软过滤会丢弃这些不是发往本机ip的数据包).
不能:不能收到从本机发送出去的数据包.
发送的话需要自己组织tcp udp icmp等头部.可以setsockopt来自己包装ip头部
这种套接字用来写个ping程序比较适合
2. socket(PF_PACKET, SOCK_RAW, htons(x));
这个套接字比较强大,创建这种套接字可以监听网卡上的所有数据帧.从上面看就是20+20+8+100.最后一个以太网crc从来都不算进来的,因为内核已经判断过了,对程序来说没有任何意义了.
能: 接收发往本地mac的数据帧
能: 接收从本机发送出去的数据帧(第3个参数需要设置为ETH_P_ALL)
能: 接收非发往本地mac的数据帧(网卡需要设置为promisc混杂模式)
协议类型一共有四个
ETH_P_IP 0x800 只接收发往本机mac的ip类型的数据帧
ETH_P_ARP 0x806 只接受发往本机mac的arp类型的数据帧
ETH_P_ARP 0x8035 只接受发往本机mac的rarp类型的数据帧
ETH_P_ALL 0x3 接收发往本机mac的所有类型ip arp rarp的数据帧, 接收从本机发出的所有类型的数据帧.(混杂模式打开的情况下,会接收到非发往本地mac的数据帧)
发送的时候需要自己组织整个以太网数据帧.所有相关的地址使用struct sockaddr_ll 而不是struct sockaddr_in(因为协议簇是PF_PACKET不是AF_INET了),比如发送给某个机器,对方的地址需要使用struct sockaddr_ll.
分享到:
相关推荐
网络编程,原始套接字编程实验...基于原始套接字的分片ICMP ECHO请求发送功能;基于原始套接字的ICMP ECHO响应接收功能;重叠分片的发送功能; 可以用来测试windows系统和Linux系统的重叠分片重组策略。 编程语言:C++
tcp/ip协议中ip分片重组以及tcp分段重组具体实现原理
IP分片与重组的分析与整理IP分片与重组的分析与整理IP分片与重组的分析与整理
然而,当网关为一个非末尾的数据包片再次分片时,它会把生成的所有子分片中的MF比特全部设置为1, 因为所有这些子分片都不可能是整个数据包的末尾的数据包片。 对于分片,需要拷贝IP首部和选项,以及数据。而选项的...
亲自写的,很有用,希望能对大家有帮助,里面主要介绍了IP分片重组的概念、方法以及在Linux下进行操作所需要的代码
本程序包括checkSum(校验和函数)/fragment(分片函数)/Reassembly(重组函数)模拟IP协议分片和重组
IP分片及重组。详细介绍关于IP分组在FPGA中的实现
基于fpga的ip分片重组的实现,文中详细介绍了相关内容
FileCut.csproj Form1.Designer.cs
基于FPGA的IP分片重组的实现.pdf
将经过分片的IP包重组成原来的数据包,并以16进制输出内容(考虑到长度限制,可以只输出数据包交界部分的内容,以验证重组的正确性)
分片与重组是IP机制之一。IP数据报可以在网关处被分片,各分片分别送达。目的主机的IP层将接收到的 所有分片重装成一个完整的数据报。介绍了IP分片重组的原理,在此基础上介绍了RFC8l5算法的实现,并对重组算 法做了...
DPDK抓包,libnids包还原(分片,重组,协议分析)
This document provides software architecture information, development environment information and optimization guidelines.For programming examples and for instructions on compiling and running each ...
当网络上传输的文件过大时,这时就需要分片传输,达到快捷顺畅的结果。
ip分片重组,对抓取到的分片包重组,分片个数不超过4个
就ip分片攻击在IPv6中的表现形式,IPv6的分片重组机制以及如何防范IPv6分片攻击展开详细介绍
8 数据报分片与重组 .pptx
8 数据报分片与重组 .pdf
IPv4与IPv6业务-IP虚拟分片重组技术介绍.pdf