Network programming 如何将数据划分为数据包?

Network programming 如何将数据划分为数据包?,network-programming,packet,packet-capture,Network Programming,Packet,Packet Capture,嗨,对不起,如果这是一个愚蠢的问题(我刚开始学习网络编程),但我一直在谷歌搜索文件/数据是如何划分为数据包的。我在任何地方都读到过这样的消息,文件被分解成包,在它们通过OSI模型时应用了页眉/页脚,并通过网络发送,接收者基本上做了相反的操作并删除了页眉 我的问题是,文件/数据到底是如何分解成数据包的,它们是如何在另一端重新组装的 进行重组的任何东西如何知道最后一个数据包何时到达等 是否可以重新组装从另一台机器捕获的数据包?如果是这样,怎么办 (如果这意味着什么的话,我最感兴趣的是TCP类型数据包

嗨,对不起,如果这是一个愚蠢的问题(我刚开始学习网络编程),但我一直在谷歌搜索文件/数据是如何划分为数据包的。我在任何地方都读到过这样的消息,文件被分解成包,在它们通过OSI模型时应用了页眉/页脚,并通过网络发送,接收者基本上做了相反的操作并删除了页眉

我的问题是,文件/数据到底是如何分解成数据包的,它们是如何在另一端重新组装的

进行重组的任何东西如何知道最后一个数据包何时到达等

是否可以重新组装从另一台机器捕获的数据包?如果是这样,怎么办

(如果这意味着什么的话,我最感兴趣的是TCP类型数据包的工作原理)


我还通过WireShark从我的计算机上的应用程序中捕获了一些数据包,它们被标记为TCP协议,我想做的是将它们重新组装回原始数据中,但是你怎么知道哪些数据包属于哪一组数据呢

非常感谢对资源的任何指点,谢谢

我的问题是,文件/数据到底是如何分解成数据包的,它们是如何在另一端重新组装的

它们基本上是被切碎的。每个internet数据包(带有头信息添加)只能保存几百字节的实际数据

进行重组的任何东西如何知道最后一个数据包何时到达等

对于传输,数据包被编号,因此接收过程知道如何将它们放在一起。如果它丢失了一个数据包,它可以请求重新发送

是否可以重新组装从另一台机器捕获的数据包?如果是这样,怎么办

我不明白这个问题。除非你是中间人,否则你怎么会得到这些包裹

这些答案适用于TCP数据包

我的问题是文件/数据到底是如何分解成数据包的

通过网络发送的内容不一定是文件。在文件的情况下,有几种不同的协议可以发送文件,问题的答案取决于协议

对于FTP和HTTP,文件的全部内容可能是作为单个数据流通过TCP发送的(对于HTTP,前面是头,对于FTP,前面是原始的,通过连接)

对于TCP,客户机和服务器根据服务器和客户机之间各种网络上的最大数据包大小等因素协商“最大段大小”,文件数据按顺序发送,其大小受最大数据包大小以及IP和TCP头大小的限制

对于SMB、NFS和AFP等远程文件访问协议,通过网络传输的是“文件读取”和“文件写入”请求;“文件读取”请求的回复包括一些回复头,如果读取成功,则读取请求请求的文件数据块,以及“文件写入”请求包括一些请求头和正在写入的文件数据块。这些文件不能保证是一个完整的文件,但如果读取或写入文件的程序是按顺序读取或写入整个文件,则整个文件的数据将可用。数据包大小将取决于读应答/写请求头的大小以及所使用的读或写大小;根据TCP“最大段大小”以及IP和TCP报头的大小,这些数据包可能被分成多个TCP段

我的问题是文件/数据到底是如何分解成数据包的

对于FTP,当传输数据的TCP连接端关闭时,数据接收方知道不再有数据

对于HTTP,当传输数据的TCP连接端关闭时,或者如果连接是“持久的”(即,对于更多请求和回复保持打开),当“内容大小:”标头指定的数据量在数据之前发送时,数据接收方知道不再有数据,已被传输(或其他类似机制,例如的“最后一块”指示)

对于文件访问协议,没有真正的“我们在数据末尾”指示;对于SMB、AFP和NFSv4,最接近的近似值是“文件关闭”操作

是否可以重新组装从另一台机器捕获的数据包?如果是这样,怎么办


这取决于协议,但是,对于HTTP和SMB,如果捕获已读入Wireshark(并且所有文件数据都在捕获中!),您可以使用“导出对象”菜单,对于某些协议,您也可以使用。

首先确定要传输的大小

然后为每个传输放置页眉、数据和页脚

请参阅缓冲区长度和数据数组应可被数据包数整除,而不提供分数

这里的报头应该包含帧号、时间戳、数据包号

有效载荷数据

页脚---你的公司信息


发送前准备好数据片段

对于最后一个问题,我的意思是,如果我使用libpcap之类的工具捕获数据包,是否可以将它们重新组装到原始文件中?是否所有TCP数据包都有一个统一的过程来执行此操作?是的,这是可能的。我也有一些数据包是通过WireShark从我的计算机上的应用程序中捕获的,它们被标记为TCP协议,我想做的是将它们重新组装回原始数据中,但是你怎么知道哪些数据包属于哪一组数据呢?(编辑上述问题)“我还通过WireShark从计算机上的应用程序捕获了一些数据包,它们被标记为TCP协议”,这意味着WireShark不理解该协议。如果不了解协议,你就无法说出其中的任何一个