分层的网络模型是一个理想的模型,但现实从来就没有理想过。
在理想模型中,IP地址和传输层TCP/UDP都是端到端的,中间路由器根据目标IP地址逐跳将数据包送达目的地。
但在现实中,我们会面临:
- 出口NAT。
- 状态防火墙。
- Anycast/ECMP。
- 设备GRO/LRO。
IPv4在面临处理上述问题时会遭遇很多疑难杂症,比方说,
- NAT机制会关联应用层协议,比如FTP,这意味着NAT需要修改协议载荷,这需要IP分片在NAT设备完成重组而不是目的地。
- 状态防火墙需要保存流Session,流Session往往由端到端协议比如TCP元组标识,这需要IP分片在状态防火墙设备完成重组。
- Anycast路由,ECMP路由以及LoadBalance需要严格将数据流(而不是数据包)与路径一一对应,这需要在分层模型之外更多的转发策略。
- GRO/LRO机制旨在通过合并连续的TCP段而减少协议栈处理的报文数量从而解放CPU,合并报文的过程中连同校验码的验证一并被网卡硬件卸载,这意味着合并后的报文是已经校验OK的报文,网卡没有必要为合并后的报文生成一个新的校验码供协议栈校验,这会违背硬件卸载的初衷,这需要中间转发设备关闭GRO/LRO。
上周和宋老师讨论一个问题,受益匪浅,重点说下最后一点。
GRO/LRO并非一种协议标准,也没有规范规定网卡在合并TCP段后是否需要为新的TCP段生成一个校验码并设置到TCP头的checksum字段,但大概率没有网卡会这么做。
TSO本来就是卸载校验码计算的,LRO也是一种卸载机制,即便是网卡硬件来做这些事,能少一事就少一事,既然LRO已经合并了多个TCP段,在合并过程中也校验了这些小段的校验和,那么接下来将这个合并后的大段直接送往TCP层即可了,这才是真正的硬件卸载,如果再耗费硬件计算资源生成一个新的校验和,那么硬件卸载的意义何在呢?
停一下!
上面的论述仅仅是在端系统中有效,因为只有在端系统网卡才能将 “合并的小段的校验码已经验证OK” 这件事告诉TCP层,如果这是在转发的场景,这件事是无法告知后端设备的,因此, 在转发场景中,如果使能了GRO/LRO,那么在合并TCP段之后,网卡有必要重新设置新的的校验和。
但目前看来,几乎没有网卡设备支持这么玩。这是因为:
- 合并多少段合适呢?
- 合并到多大合适呢?
- 如果合并了,岂不是会破坏已经被发现的MTU?
- 在DF置位的情况下,后端设备的分片ICMP报错信息会路由到源端,这会让源端很费解(明明没有发这么大的包啊)…即便源发送再小的包,也会被中间设备GRO/LRO合并…
- 在上面的情况下,ICMP真的能到达吗?
- …
还是为转发设备关闭GRO/LRO吧。
说白了,中间设备可以对你的数据包做任何事,特别是在国内,几乎没有什么中间设备是完全按照教科书上的机制老老实实转发数据包的,甚至包括解密在内的事都在DPI的范畴…
DPDK被大规模应用之后,中间设备便可以更加容易对数据流施加影响了。
任何事情都是有关联的,不要孤立看,不然你就会被经理,早晚会经理了你。
经理往往喜欢就概念论事,说一些X和Y没有关系,A和B不是一个概念之类的话,所以他才被经理,但也仅仅是被经理而已。
浙江温州皮鞋湿,下雨进水不会胖。
原文链接: https://blog.csdn.net/dog250/article/details/107441216
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/405894
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!