环境观察员

环境观察员
环境赐予人类相信真理的力量

李成延为什么需要理解TCP三次握手?

李成延为什么需要理解TCP三次握手?

  源起:作为一名普通程序员想起面试时经常被问到这方面,既是对知识的好奇,又好奇于面试官的心理。

  为什么需要理解TCP三次握手?看很多在解释TCP是什么,balabala。

  我一直不明白的是,为什么我们需要理解他,换句话说,我们理解TCP三次握手四次挥手的现实意义是什么?

  知乎有一个很好的提问步骤,先问是不是,再说为什么。

  在此处即为,我们是不是需要理解TCP三次握手?

  上下文:分别来自一名移动端程序员,一名服务端开发程序员的疑问。

  知乎还有一句话

  脱离计量谈毒性都是耍流氓

  我在这里仿一句

  脱离场景谈功能都是耍流氓

  对应到这个问题

  用不用理解TCP三次握手,完全看你是做什么工作的

  一个做综合布线的,不理解三次握手,无所谓

  一个专注路由交换的,不理解三次握手,一辈子也就那样没什么出息了

  一个做网络安全的你告诉我你不懂三次握手,我会觉得你没入门

  手机上随便答下。

  不太清楚你的疑问点在哪里。如果能理解三次握手的交互过程,至少会有以下3个收获:

  1. 交互双方如何协商传输的mss以及mss对之后传输的影响。

  2. window scale参数的协商,以及由此展开来的TCP流控机制

  3. TCP header中相关option属性的定义及其应用场景。比如sack,tsval等。

  每天有亿万万用户在使用互联网,亿万万用户同时在使用TCP,尽管他们浑然不知这个事实。

  用户需要知道TCP的工作原理吗?

  用户知道更好,不知道也丝毫不影响他们使用互联网!

  但是,这个地球上总要有人懂TCP,否则互联网技术如何继续发展?

  所以,从事互联网行业的技术工程师,很有必要在把技术学的扎实,学的透彻,这样才能提供更专业的服务。

  行业人才技术等级的分布,通常是呈金字塔分布。技术工作者不以爬上金字塔顶为目标,那就是拿破仑嘴里的“不想当元帅的士兵不是好士兵”!

  TCP/IP作为垄断互联网行业三四层的协议家族,至今依然无人能撼动他们的垄断地位。互联网技术从业者不深入理解这些基础协议,又怎么去理解更高层次的安全技术?

  TCP/IP并不是一个完美的协议,但是它却能在那么多的网络协议中脱颖而出,至少表明它是出色的,至少在目前还没有任何协议可以取代它。

  当它成为垄断协议之后,整个业界都在想方设法,通过修修补补把它打扮得更完美。

  DoS攻击

  TCP三次握手,易于遭受伪造源IP报文攻击。伪造的SYN报文,服务器会开辟大块内存用于TCP连接。伪造的海量SYN报文,将服务器骗得一愣一愣的,开辟出的大量内存压根没有用,很快将服务器的内存耗尽。合法TCP连接申请到来时,服务器没有多余的内存空间,这就是拒绝访问攻击(Denial of Service)。

  TCP如何应对这种挑战呢?

  伪造的IP,可以用来发送第一个TCP握手连接,但却无法收到服务器的握手响应,对吗?

  如果服务器收到第一个TCP握手连接,在弄清这个连接源IP是伪造的、还是真实的之前,保持镇定,不分配内存,这样伪造的IP报文就不会对服务器的内存造成伤害。

  服务器如何分辨一个源IP是真实的还是伪造的?

  凡是能够接收到第二个TCP握手报文,并发出第三个握手报文的,应该是真实机器,真实IP。

  否则,为伪造IP。

  只要服务器在第二个握手报文里嵌入一个”Opaque Cookie”,凡是第三个报文里携带这个”Opaque Cookie”的,满足上述条件,李成延判断为真实IP,否则为伪造IP。

  Opaque Cookie

  不透明Cookie,只有服务器才能理解,服务器可以加密,可以避免被伪造。

  Cookie里包含又连接的TCP四元组,时间戳等关键信息,然后加密成为一个字符串。

  这样服务器不需要保存任何对方的状态,自然不需要动态分配内存,服务器完全是无状态的(Stateless)。

  一旦用户的第三个握手报文到来时,通过解密得到关键字段,判断为非伪造Cookie,非伪造源IP,合法的TCP连接。

  服务器立马分配内存,保存TCP连接的所有状态信息。通过这样的手段,最好地保护内存被滥用!

  如果Cookie是伪造的,服务器什么都不做,仅仅丢弃即可,这样也不会对自己有任何伤害!

  不相信连TCP三次握手都不理解的读者,可以看懂以上解释。

  技术是由一个个基础知识点累积在一起,学习基础的知识点是为了更好地理解高级话题。

  可靠传输协议

  并不是所有的可靠传输的协议都需要三次握手,而TCP这个可靠传输协议碰巧使用三次握手连接,让很多读者误以为凡是可靠传输的协议都需要三次握手!

  TCP采用三次握手,应用层数据需要等待1.5RTT才能发出,对于TCP短连接,这个等待时间意味着访问响应的缓慢。

  如果一个可靠传输协议,可以让应用程序无需等待(0 RTT)就可以发出,那么无疑响应速度是最快的。

  三次握手的启迪

  Google开发的QUIC协议,理论上可以满足0RTT的访问效率。

  问题来了,如果伪造IP攻击QUIC服务器,不是非常容易吗?报文里嵌入大块的数据(Bulk Data)发给服务器,服务器压根没有办法分辨源IP是真实IP还是伪造IP!

  同样的方法,QUIC也可以采用“Opaque Cookie”三次握手的方法,可以非常轻松地分辨是否伪造IP。

  看,这里一样会用到三次握手的思路!

  QUIC协议本身又集成了TLS安全加密功能。问题又来了,0RTT固然好,但通信双方如何分享加密的密钥呢?

  看,又用到三次握手的逻辑了,通信双方分享彼此的公钥,然后双方就可以加密传输应用层数据了。

  如果用户连接过服务器,可以嵌入Session ID访问服务器,服务器查询“Session ID”的状态,如果在,获取该Session ID的加密信息,完成解密,这就是所谓的“0RTT”!

  哎呀, 我没认真审题, 答错了... 我觉得这个理解不理解根本没关系, 因为不同专业不能一并而论, 程序员不了解三次握手根本不影响他写程序, 这些东西基本上都搞成API了吧, 拿过来用就是了, 也许就是面试官随便问的吧哈哈哈

  ========================================

  对于通信双方, 双方要知道自己的发送设备与接收设备正常, 也要知道对方的发送设备与接收设备也正常, 而且是双方都知道的情况下, 双方才开始通信.

  例如我与你通信.

  我先发送一条消息给你,

  对我来说,我能了解的情况是:

  我不知道我的发送设备有没有问题, 我不知道我的接收设备有没有问题; 我不知道你的发送设备有没有问题, 我不知道你的接收设备有没有问题.

  你接收信息后, 你能了解的情况是:

  你知道我的发送设备没有问题, 你不知道我的接收设备有没有问题; 你不知道你的发送设备有没有问题, 但你知道你的接收设备没有问题.

  于是你发了一条包含之前我发给你的信息内容的新信息, 然后我接收到你的新信息, 我发现你的新信息包含了我第一条信息的内容, 此刻的我能了解的情况是:

  我知道我的发送设备没有问题(因为我收到了我第一次发的内容), 我知道我的接收设备也没有问题(也是因为我收到了我第一次发的内容); 我知道你的发送设备没有问题(还是因为我收到了我第一次发的内容) , 我知道你的接收设备也没有问题 (还还是因为我收到了我第一次发的内容), 对于我来说, 我都知道所有的情况了, 但你还是有不了解的情况(此刻的你还不知道我的接收设备有没有问题, 你还不知道你的发送设备有没有问题), 这就违反了我一开始提到的"双方必须都明白双方情况才能建立通信"的前提. 所以才有第三次,至少是第三次, 我再把你的信息发回给你, 当你收到信息后, 你能了解的情况是:

  你一开始就知道我的发送设备没有问题, 第三次信息收到后你知道我的接收设备没有问题, 你也知道了你的发送设备也没有问题, 还有你早知道你的接收设备没有问题.

  至此, 你我都知道自己与对方的发送接收设备都没问题, ok开始通信...

  应该看得懂吧哈哈哈

  最近面试了很多QA测试工程师,作为面试官的时候也会经常问道TCP三次握手,当然不会直接让面试者背书把通篇RFC讲出来,更多的是希望从理解出发,面试了很多人,每个人对TCP/IP协议理解不同,回答出的效果也不同,无论是程序员还是测试人员,TCP的三次握手是最基本的常识问题,之所以被问道的次数很多,我认为有以下几个原因:

  适用性强:

  只要接触网络的人多多少少都会接触到TCP三次握手,从我的经验来看,刚毕业的大学生和工作很久的老员工都能回答出TCP三次握手的过程,类似于相声这个行业一样,是个人都能说话,关键是细节掌握的程度不一样,作为面试官通过三次握手细节就能了解到面试者对于TCP/IP协议掌握的程度,也就能判断出面试者的基本能力。

  扩展性强:

  接上一个理由,通过TCP三次握手描述后,面试官会根据你的回答效果和内容,扩展性的问你更多问题来考量你对协议细节的理解,也能通过这些扩展问题,知道你的工作习惯和思路,比如说我经常在问完三次握手后,还问一些其他问题:

  三次握手为什么能保证TCP连接的可靠性?为什么TCP建连需要三次握手,而断连需要四次挥手?三次握手中,TCP报文头会发生什么变化?

  有些人无法回答出这些扩展问题时,往往会表现出不同的反馈效果,有的人会老实坦白自己没有理解,有些人会讲讲自己的想法和思路,有些人则会记录一下这些问题,希望能解释清楚并且反馈,无论是怎样的回答和处理,只要面试官赞同你的想法,一定会对面试成绩有所帮助。

  涵盖行业广:

  甭管您是做路由交换、安全防火墙、WEB开发、负载均衡,形式多样的网络产品都能和TCP扯上点关系,网络就这么大,流量就这么多,OSI七层模型中纵观全场,传输层就这俩协议TCP和UDP,TCP作为开场老大哥,不问问你连接怎么建立起来的,接下来还怎么聊?

环境观察员 版权所有,未经允许不得转载:环境观察员 » 李成延为什么需要理解TCP三次握手?
分享到: 更多 (0)