我正在使用Windows 7 x86在C中编写一个脱机数据包解码程序.
我想知道如何知道数据包协议,如果是UDP或者TCP?
假设我们有一个数据包
struct Foo
{
short size; // 2
short type; // 2
BYTE data; // 1
//1 byte padding not 3?
};
Run Code Online (Sandbox Code Playgroud)
编译后,它的长度为6个字节,在结构的末尾添加了1个字节的填充.是不是编译器应该添加3个字节填充,以便结构大小是8个字节长?因为32位cpu喜欢以4字节块的形式访问数据
顺便说一下#pragma pack(1)它的长度是5个字节,正如预期的那样.
我正在使用 python 的 scapy 库做一个小网络项目。我的项目涉及嗅探数据包,并在第 3 层和第 4 层之间填充一个新层。
使用本指南,http://www.secdev.org/projects/scapy/doc/build_dissect.html
我能够创建一个新的数据包层。我可以通过执行以下操作轻松地将图层添加到现有数据包的顶部,
packet = newlayer()/packet
Run Code Online (Sandbox Code Playgroud)
而 newlayer() 层将被放置在 IP 层之下。但是,我想将这个新层夹在第 3 层和第 4 层之间(而不是就在 IP 之下)。但我似乎无法找到一种简单的方法来实现这一点。
我知道我可以创建一个新数据包并执行类似的操作,
packet = Ether()/IP()/newlayer()/TCP()
Run Code Online (Sandbox Code Playgroud)
但是,因为我想将该层插入到我已经嗅探过的数据包中,所以我想简单地修改原始数据包,而不是从头开始创建一个新数据包。
任何帮助,将不胜感激!
我目前正在开发一个程序,该程序采用 .pcap 文件并使用 scapy 包按 ip 分离出所有数据包。我想解压缩使用 gzip 包压缩的有效负载。我可以判断有效负载是否经过 gzip 压缩,因为它包含
\n\nContent-Encoding: gzip\nRun Code Online (Sandbox Code Playgroud)\n\n我正在尝试使用
\n\nfileStream = StringIO.StringIO(payload)\ngzipper = gzip.GzipFile(fileobj=fileStream)\ndata = gzipper.read()\nRun Code Online (Sandbox Code Playgroud)\n\n解压缩有效负载,其中
\n\npayload = str(pkt[TCP].payload)\nRun Code Online (Sandbox Code Playgroud)\n\n当我尝试这样做时,我收到错误
\n\nIOError: Not a gzipped file\nRun Code Online (Sandbox Code Playgroud)\n\n当我打印第一个有效负载时,我得到
\n\nHTTP/1.1 200 OK\nCache-Control: private, max-age=0\nContent-Type: text/html; charset=utf-8\nP3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND"\nVary: Accept-Encoding\nContent-Encoding: gzip\nDate: Sat, 30 Mar 2013 19:23:33 GMT\nContent-Length: 15534\nConnection: keep-alive\nSet-Cookie: _FS=NU=1; domain=.bing.com; path=/\nSet-Cookie: _SS=SID=F2652FD33DC443498CE043186458C3FC&C=20.0; domain=.bing.com; path=/\nSet-Cookie: MUID=2961778241736E4F314E732240626EBE; expires=Mon, 30-Mar-2015 19:23:33 …Run Code Online (Sandbox Code Playgroud) 在一家视频会议公司实习时,有很多关于丢包的讨论。维基百科声明如下:
丢包通常是由网络拥塞引起的。
我知道因为视频需要通过网络发送如此大量的数据,所以数据包必然会丢失。
我不明白的是为什么在其他情况下(例如 HTTP 请求和 AJAX 调用)没有出现丢包的情况。如果丢包真的是网络拥塞造成的,为什么我自己的HTTP请求从来没有遇到过?
HTTP 连接是否不会丢失数据包,或者我发送的请求太小而不会受到影响。如果 HTTP 对丢包免疫,为什么会这样?
我刚刚读到“端口和套接字有什么区别?” 似乎套接字是用来创建连接的东西。那么一个数据包怎么样?连接之间是否正在发送某些内容?那么进度是“ip->端口->套接字->发送数据包”?
我们可以以连续模式从 iperf 生成器发送数据包吗?目前,我正在使用命令以突发模式发送数据包
iperf -c 10.0.0.2 -u -b 1m -t 1
Run Code Online (Sandbox Code Playgroud)
其中 u 是 UDP 数据包,1m 是带宽 (1 Mbps),t 是 1 秒的时间。
但我想以连续模式发送。
我不是专业的网络工程师,所以我希望我的问题不会显得含糊或na\xc3\xafve。
\n\nHTTP/2.0 中的多路复用似乎利用单个 TCP 连接来同时处理多个/不同的请求,这样我们就可以避免队头阻塞问题。我想知道在数据重组的意义上它是如何与底层 TCP 连接一起工作/重叠的意义上它是如何与底层 TCP 连接一起工作/重叠的。
\n\nTCP 还确保接收方接收到的数据 (D) 被重建,即使构成 D 的数据包乱序(或丢失)接收,以便在接收方重新构建 D,然后将其交给应用程序。
\n\n我的问题是:HTTP/2.0 中的帧概念如何适应 TCP 数据包重组以在接收端组成完整的消息?哪一个先发生?或者,帧和数据包之间存在什么样的映射(一对一、一对多等)?简而言之,他们如何协同工作?
\n您能否向 UDP 接收方发送数据,而接收方无法看到您的 IP 地址或位置?
在linux中是否有任何方式以编程方式创建可以侦听的虚拟网络适配器,以便每当尝试通过适配器发送数据时,都会调用一个方法?
我试图将所有数据包转发到单个IP地址,然后将其原始位置包含在数据包中.
这样的事情:
void sendPacket(char to[], char data[])
Run Code Online (Sandbox Code Playgroud)
因此,如果我通过虚拟网络适配器ping google.com,则会像这样调用该方法 sendPacket("GooglesIp","Whatever data a ping sends")