关于数据包的伪装,UDP,TCP

不知道会不会有人看我的文章呢? 很多情况下,当我们无论是在百度或者谷歌上搜索数据包的伪装,最多的情况就是伪装自己的ip地址的网络攻击。今天我要讲的是通过修改UDP数据报报头以达到伪装成TCP数据包的过程。

首先你们可能会问为什么要伪装?

当今网络的传输层支持两大基本协议,TCP和UDP。TCP提供了一个可靠的,端对端有序的字节流传输。依靠TCP的网络应用主要包括万维网上的C/SHTTP传输,电子邮件和文件传输。相比TCP而言,UDP是一个更加轻量级的不稳定的协议,使用了更少的花费,因此延迟也更小。但作为交换,他不能保证端点之间可靠的流传输。通过UDP,数据可能会无序到达,重复出现或者没有预兆的丢失。由于这两个协议服务于不同的目的,在两个端点之间转发数据包的路由器对TCP和UDP的数据包的处理是不一样的。ISP所采取的措施是认定路由器对待这两种数据包,TCP的优先级要比UDP的高,因此在转发出现拥塞时,他们会丢弃UDP数据包而让TCP数据包通过,以增加吞吐量。

那么怎么做到呢?

主要是通过RAW socket重新对数据包进行构造得到的。构造socket时通过

int sockfd;sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);

创建一个原始套接字,这与单纯的TCP或者UDP类型的socket的功能是不一样的。我们从计算机网络分层的角度来看的话,TCP或者UDP类型的socket只能够访问传输层以及传输层以上的数据,这是因为IP层将数据包传递给传输层时下层的数据包头已经被丢弃了。而原始套接字却没有这样做。因此它对上下层的数据都可以访问。所以使用 raw套接字你可以实现上至应用层的数据操作,也可以实现下至链路层的数据操作。

因此我们所谓的伪装,其实就是IP和传输层的头部进行重新构造或者改造罢了。对于IP层,我们可以通过IPheader的数据结构将其使用的传输协议从UDP修改为TCP。另外在传输层,因为包大小受MTU的大小限制,针对原来的UDP数据报头,我们可以将其清除,减少有效载荷以构造比较大的TCP的报头。这样就算完成了伪装。在路由器看来便不会认为它与UDP的数据包有任何的关系。但是解析数据包的时候,我们不希望按照TCP的数据包来解析,这是因为TCP和UDP两个协议的服务目的是不一样的,我们只是希望传输的时候能够拥有相同的优先级而不会在拥塞时被优先丢弃掉。基于这个原因,我们需要与接收端约定,在收到该数据包时,应将其看待成UDP的数据包。




你可能感兴趣的:(关于数据包的伪装,UDP,TCP)