面试时为何要问TCP/IP/HTTP这些协议?

Posted 车小胖谈网络

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试时为何要问TCP/IP/HTTP这些协议?相关的知识,希望对你有一定的参考价值。

不问这些协议,问点啥好呢?
 
问点OSPF、BGP吗?那是网络工程师用到的协议。
 
问点Kerberos、CIFS/SMB东西吗?那是Windows系统管理员用到的协议。
 
问点Access Token、SSO、CSRF、SQL Injection?那是Web开发用到的东西。
 
问点彩虹表、Padding Oracle、Crime、Beast?那是信息安全才用到的东西。
 
只有TCP/IP/HTTP才是以上四类人员共同的交集,TCP/IP/HTTP占据互联网流量的绝大多数。互联网人需要像学会看书写字一样,学会这些基础技能。
 
以下是基础面试题:
 
1.如果TCP双方同时发送SYN信号,最终会建立一个TCP连接、还是二个TCP连接?
 
面试者从课本上学习到TCP是三次握手,既然双方同时发SYN信号,那么就会有2个三次消息握手,最终会产生2个TCP连接。
 
先来看一个例子。
Alice 的IP =6.6.6.6 侦听端口号 = 6666
Bob的IP = 8.8.8.8 侦听端口号 = 8888
 
场景一:发起连接方使用侦听端口做为源端口
 
Alice发SYN信号,报文的样子:
 
Source  IP
Destination   IP
Source  Port
Destination  Port
FLAG
6.6.6.6
8.8.8.8
6666
8888
SYN
 
Bob发SYN信号,报文的样子:
 
Source  IP
Destination   IP
Source  Port
Destination  Port
FLAG
8.8.8.8
6.6.6.6
8888
6666
SYN
 
双方的四元组完全吻合,双方在一条轨道上相向而行,所以最终双方会遇到的,并最终建立一个连接。和传统TCP三次握手不一样的地方是,这里需要四次消息交互,双方都需要使用SYN + ACK报文来确认对方。
 

场景二:发起连接方使用随机端口做为源端口
 
Alice发SYN信号,报文的样子:
 
Source  IP
Destination   IP
Source  Port
Destination  Port
FLAG
6.6.6.6
8.8.8.8
1234
8888
SYN
 
 
Bob发SYN信号,报文的样子:
 
Source  IP
Destination   IP
Source  Port
Destination  Port
FLAG
8.8.8.8
6.6.6.6
2345
6666
SYN
 
 
双方的四元组并不一致,双方都需要使用SYN+ACK来回应对方,使用完整的三次消息交互来完成TCP连接,这样将会建立2个TCP连接。
 
问题来了,双方将会使用哪个连接来传输数据呢?使用任何一个,另外一个闲置的TCP连接都是资源的浪费!但是TCP不知道这是资源闲置,但是应用程序却知道TCP帮助自己建立了2个TCP虚拟通道,应用程序需要取舍!
 

应用程序是如何取舍的?
BGP协议跑在TCP179端口,使用场景二建立TCP连接,双方难免会建立2个TCP连接。BGP在其中的一条TCP连接上完成BGP状态机的迁移,connect、active、established。一旦完成Established,BGP认为这条TCP是完好的,立马给TCP发送指令,将另外一条闲置的TCP连接予以释放。
 
2为何TCP主动关闭方需要等待2MSL时间,端口资源才能释放?
主动关闭方最后发送的ACK消息无法确保到达对方,如果立马释放端口资源。 新建的TCP连接的四元组和刚关闭的四元组完全一样的时候,这个时候老的TCP连接的FIN报文恰好赶到,且Sequence Number在新的TCP连接的合法接收窗口内,新的连接很有可能被关闭。
 
理论上一个IP报文在网络上极限的生存时间是255秒(TTL=255),如果主动关闭方等待255秒,滞留在网络上的TCP报文要么到达主动关闭方,要么被网络所抛弃,从网络上消失,永远无法到达主动关闭方。这是从网络角度的思考。
 
被动关闭方如果收不到被动关闭方的ACK,会一直重传FIN,重传的时间周期一般是这样的:
 
0.5、1、2、4、8、16、32、32
 
重传8次还没有受到对方的ACK,被动关闭方会Reset掉当前连接。
 
考虑到最后一次重传消息的发出时间,以及有可能在网络上滞留的时间,两个因素的综合,TCP协议规范决定被动关闭方需要等待240秒,而MSL= 120秒。被动关闭方的等待时间 = 2MSL。
 
TCP这样的规定其实是应对极端情况,两个TCP连接的数据发生冲突!