TCP与移动性

又跟朋友聊TCP,这次说到了移动性。

一个TCP连接是绑定五元组的,该连接的生命周期呢,五元组不可改变,如果IP变化了,需要重新建立一个新的连接,这是众所周知的。

如果在TCP连接上直接构建应用,一旦IP地址发生了变化,该应用必须自己处理连接的重建。若希望应用无感于IP地址的改变,常见的方法是增加一个会话层。很早以前我做Open-V-P-N的时候,就是采用了这个方法,在协议头里增加了一个全局唯一的SID,用于识别连接。现在QUIC协议也是这样处理的。

还有别的方案吗?

还有一种扁平的方案,将IP地址的变化直接纳入TCP连接管理中,在TCP内部处理IP地址的变化,这样TCP就天然支持移动性了。

按照对端到端的理解,“端”是一个物理节点,而IP地址只表示一个位置,它不能作为“端”的唯一标识,“端”可以被配置不同的IP地址,比如手机,接入WI-FI和接入5G时IP地址显然不同。LISP就是将标识属性从位置中分离了出来。

这并不是说TCP/IP设计的不好,TCP/IP从来不是被设计的,而是进化出来的,TCP/IP的端到端原则保持一个足够简单的核,这就可以经得起迭代了。

在1970年代,根本没有移动IP的需求,等到有需求的时候再支持它就好了。现在移动互联网时代,需求来了。

增加一个会话层理论上是不错的选择,但这是设计出来的,凡设计出来的东西都很难无缝切入现实。假设需要为一个TCP应用支持移动性。为了增加那个会话层,必须修改应用,这并不现实,没人想改既有的代码。

增加一个层属于过度设计了。用IP地址标识一个“端”是时代的局限,破除这个局限甚至不需要LISP。既然是TCP的问题,迭代它自己就是了。

目前TCP协议分为两个子协议,连接协议和传输协议,连接协议目前包括三次握手和四次挥手,再加个地址变更就即可。和SYN,FIN等连接标志位一样,增加一个ALTER标志位就好了。在一个TCP ALTER报文中,用通告窗口和紧急指针存放旧IP地址,用option存放也可以。

连接查找逻辑也需要适当修改。现在是用五元组查找socket,为了支持ALTER协议,当收到携带ALTER标志位的报文后,需要用旧IP地址作为源IP来查找socket,然后用新IP地址更新连接五元组。

更新了TCP之后,应用无需任何改变就可以支持移动性。总有人说TCP实现在内核中不好更新,我倒觉得这不是太大的问题。

首先,需要支持移动性的“端”目前基本都是Android或iOS,这种系统更新频度早就到了让人无法忍受的地步,某次更新时多一次内核的更新也不多。其次,对于服务端,目前有很多Live patch方案。

今天又聊到了老话题,TCP对移动性的支持。思考了一番,为了增加一个层而增加一个层可能涉嫌过度设计,如果返璞归真,可能只需要抽掉原始实现的那根鱼腥线就行了,这种方式并非仅仅直接,更重要的是它悄无声息,完全透明。反之,增加一个层,无论如何都要大动干戈,适合尚未上线时的设计,不适合迭代。写点感想。

浙江温州皮鞋湿,下雨进水不会胖。

原文链接: https://blog.csdn.net/dog250/article/details/124676042

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    TCP与移动性

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/405525

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 上午9:15
下一篇 2023年4月26日 上午9:15

相关推荐