【请教】关于网络对大量小数据包的处理
最近面试遇到一个问题 "网络中如果对于大量的载荷非常小的数据包如何处理"对于有看到过这个问题,应该为了减小网络负担,把这些发送向同一个目标的小数据组合成一个较大的数据包,然后在发送。
然后问题继续,如何在目的地址区分这些数据?
对于这个不是很明白,就说了一下我自己的观点,可能是在传输层进行的组装,即每个小数据包的传输层头部仍然保留,这样会导致根据传输层包头中的段口号可以判断出这些数据属于哪一个进程,但是按照我这么说数据包的格式就成了
|--ethernet header--|--IP header--|--TCP header1--|TCP header2--|--UDP header1--|...
我不确定是否真的存在这样的数据包,电话面试之后,google,查到了关于UDP 协议中cork部分的内容,其中通过函数ip_append_data 进行处理,希望各位能帮忙解释,多谢。 :)) 有些是大量 http头,呵呵
这个问题,我了解过相关东西
如果单机能做完成,单机dna
如果单机不能做,可以试试桥转发,做负载均衡,到其他机器上 回复 2# kkddkkdd11
十分感谢回复,不过我不太明白您的意思,单机dna是值什么?
您提到的 桥转发 等内容可能属于 网络优化,我想请教的不是网络负载均衡部分的内容,是TCP/IP本身的机制。不知道您有没有研究过?
本帖最后由 独孤九贱 于 2014-04-10 23:49 编辑
小包处理和tcp/ip本身好像关系不大。
同样100吨的货,10吨一次,只需要拉10次,1公斤一次,估计要累死司机,就是这个理了。
应该为了减小网络负担,把这些发送向同一个目标的小数据组合成一个较大的数据包,然后在发送。
——
这个思路类似于GRO/GSO…… GSO和GRO,组包发送。对于小于mtu的包,tcp本身就会组包的。 回复 4# 独孤九贱
我查到TCP/IP 中的 TCP_CORK 选项,就是把小数据包组合成一个大的数据包。
我想要请教的是,在接受端接受到这个大的数据包之后,怎么区分每个小的数据包?
假设系统把不同 进程 对应的 小数据包组合成一个大的数据包发送(如果可以这么做的话),或者把同一个进程不同时刻需要发送的小数据组合成大数据包发送,那么接受方如何区分这些本来不相关的数据?
回复 5# humjb_1983
我查到TCP/IP 中的 TCP_CORK 选项,就是把小数据包组合成一个大的数据包。
我想要请教的是,在接受端接受到这个大的数据包之后,怎么区分每个小的数据包?
假设系统把不同 进程 对应的 小数据包组合成一个大的数据包发送(如果可以这么做的话),或者把同一个进程不同时刻需要发送的小数据组合成大数据包发送,那么接受方如何区分这些本来不相关的数据? TCP是基于“流”的传输协议,不区分大包小包,只要保证数据流完整到达对端即可。 tcp是基于流的,也就是说不同的流不会整合在一起,
对于一条流,将小报文合成一个大报文发出去,对应用层数据进行合并,修改tcp头部再发出,MAC+ip+tcp+数据。
这样就不会在目的端出现你说的那种情况,
回复 9# wan3610425
多谢回复,你解释的就是不同 流 就是指的 不同进程吗?所以就不会出现把不同进程需要的数据整合在一个数据包的情况,我可以理解,不知道有没有具体的出处?我想详细的看一看;
另外,即使是同一个进程需要的数据,即属于同一个 流,那么接受的进程 如何区分不同的数据呢?
或者我根本对你解释的 “流”理解错了。