关于计算机网络的TCP三次握手和四次挥手的问题,面试官想听到怎样的回答?

龚一鸣




描述一下三次握手的过程,回答不出基本上就game over了。

如果没有什么错误,再让对方描述一下握手报文里都有哪些关键字段,能够说出ISN这个关键词,接着问。

ISN代表什么?意义何在?

ISN,发送方的字节数据编号的原点,让对方生成一个合法的接收窗口。

ISN是固定不变的吗?

动态随机。

ISN为何要动态随机?

增加安全性,为了避免被第三方猜测到,从而被第三方伪造的RST报文Reset。

还有吗?

ISN动态随机使得每个tcp session的字节序列号没有重叠,如果出现tcp五元组冲突这种极小概率情况的发生,一个session的数据也不会被误认为是另一个session的。

刚才你提到第三方可以伪造RST报文,需要满足什么条件才能得逞?

需要sequence number 位于对方的合法接收窗口内。而由于ISN是动态随机的,猜出对方合法接收窗口难度加大。

如果ISN = 0,那么猜出的难度就大大降低。

三次握手的第一次可以携带数据吗?为何?

不可以,三次握手还没有完成。

对方难道不可以将数据缓存下来,等握手成功再提交给应用程序?

这样会放大SYN FLOOD攻击。

如果攻击者伪造了成千上万的握手报文,携带了1K+ 字节的数据,而接收方会开辟大量的缓存来容纳这些巨大数据,内存会很容易耗尽,从而拒绝服务。

那第三次可以携带数据吗?为何?

可以。

能够发出第三次握手报文的主机,肯定接收到第二次(服务器)握手报文,对吗?

因为伪造IP的主机是不会接收到第二次报文的。

所以,能够发出第三次握手报文的,应该是合法的用户。

尽管服务器侧的状态还没有“established”,接收到第三次握手的瞬间,状态就会切换为“established”,里面携带的数据按照正常流程走就好。

刚才你提到伪造TCP报文尽管有难度,那么有什么办法,可以让接收方检测出TCP报文是伪造的、或被篡改的? 你觉得TLS可以做到吗?

使用TCP的安全选项,option 29,可以让通信双方TCP报文强制有HMAC,只有双方拥有HMAC KEY,也只有通信双方可以生成并校验对方的HMAC,任何第三方都没有办法伪造、或篡改而不被接收方发现。

TLS位于TCP之上,不对TCP报文头进行完整性保护,只对应用层数据本身做数据完整性保护,所以TLS并不能保护TCP的安全。

RST报文为例,完完全全是一个TCP报文头,没有任何报文体,对吗?没有完整性保护,其实脆弱的很,伪造RST报文是一个有难度,但理论上绝对可行的操作。

看到有人说,只看到过TCP状态位为’FIN +ACK’,但从来没有看过状态位只有 ‘FIN’,你应该怎样给他解释?

RFC793明确规定,除了第一个握手报文SYN除外,其它所有报文必须将ACK= 1。

很好,RFC规定的背后肯定有合理性的一面,能否深究一下原因?

TCP作为一个可靠传输协议,其可靠性就是依赖于收到对方的数据,ACK对方,这样对方就可以释放缓存的数据,因为对方确信数据已经被接收到了。

但TCP报文是在IP网络上传输,丢包是家常便饭,接收方要抓住一切的机会,把消息告诉发送方。最方便的方式就是,任何我方发送的TCP报文,都要捎带着ACK状态位。

ACK状态位单独能承担这个消息传递的任务吗?

不能!需要有 Acknowledge Number配合才行。

如果我方发出的Acknowledge Number == 10001,那意味着序列号10000及之前的字节已经成功接收。

如果对方占据字节序列号10000是应用层数据,那么就是确认应用层数据。

如果对方占据字节序列号10000是’FIN’状态位,那么就是确认接收到对方的’FIN’。

更多文章,可以关注公众号(chexiaopangnetwork) 阅读!


车小胖谈网络




面试官期望的


做为在大厂拿到《认证面试官》的我来说,我更期望能看到面试者的答案是:

  • 三次握手原理,四次挥手原理

  • 过程解读,说不清楚,请在面试官前画图

  • 举例子

  • why,为什么不是四次握手,三次挥手;为什么甚至需要握手? 为什么消息不能与第一个数据包一起发送?

  • 发散思维,安全方面考虑。

  • 比较两点是后面的,或者说抓包软件名称,分析过之类的。

有朋友也才加过谷歌的面试,公司也出过这样的题目:tcp 3 way handshake and setting the FIN bit?当然答案也因人而异。


可参考


  • 三次握手主要用于创建TCP套接字连接。 它的工作原理是:


  1. 客户端节点通过IP网络将SYN数据包发送到同一网络或外部网络上的服务器。 这个数据包的目的是询问/推断服务器是否能打开新的连接。

  2. 目标服务器必须具有可以接受和启动新连接的开放端口。 当服务器从客户端节点收到SYN数据包时,它会响应并返回一个确认收据 - ACK数据包或SYN / ACK数据包。

  3. 客户端节点从服务器接收SYN / ACK并用ACK数据包进行响应。

  4. 完成此过程后,将创建连接并且主机和服务器可以进行通信。
    最好还画一个图:(English better!,发散到why,security better)



欢迎关注,以互联网的独特视角,解锁更多,共同进步!

小鸟攻城狮


用简单的例子比喻三次握手:甲乙两人对话,

甲:我说的话能听见吗?(第一次握手)

乙:你说的话我能听见,我说的话你能听见吗?(第二次握手)

甲:你说的话我也能听见。(第三次握手)

三次握手成功后即开始数据接收和发送。



再用个简单的例子说一下四次挥手:

甲:我们分手吧!

乙:亚美得!

甲:坚决分手!

乙:好吧!祝你幸福!



这就是四次挥手,然而在抓包的时候发现,三次握手每次都是有的,而四次挥手有的时候只有三次,当乙方数据传输完毕,甲发出fin信号的时候,乙就会断开连接,甲再发个ack确认号即可完成四次挥手


分享到:


相關文章: