从三次握手到四次挥手

TCP协议经常被问到的就是为什么要进行三次握手和为什么要四次挥手。

我思考后觉得以下例子能让人轻松理解。

 

三次握手

王总:小丽啊,今天出去吃饭怎么样?

小丽:好的,王总。我们出发吧?

王总:好的,我们走。

在进行三句对话以后,TCP连接就建立好了。

我们可以把第一句当作是王总发出的SYN报文,表示请求连接,小丽回答王总的话可以视为SYN+ACK报文,即用ACK报文对王总发出的SYN报文表达了确认,又向王总了发出了新的SYN报文,再王总发出ACK报文确认后,连接建立,王总和小丽也出去潇洒了。

 

四次挥手

王总:小丽啊,吃完了么,公司有点事情我要先回去了。

小丽:我快了,我抓紧。

小丽:吃完了,王总我们走吧

王总:好的,我们走。

在进行四句对话以后,TCP连接就断开了。

我们可以把第一句当作是王总发出的FIN报文,表示自己已经传输结束,小丽回答王总的第一句话可以视为ACK报文,表示我知道了,但是我还没确定收到所有的,还需要等待一会儿。小丽回答的第二句话可以视为FIN报文,表示自己已经收集完毕,可以断开连接了。王总回答的第二句可以视为ACK报文,表示已经收到,会断开连接。这里需要额外注意的是并不是服务器接收到了ACK报文就立刻断开连接的。为了防止最后一个ACK报文的丢失,客户端会等待一段时间,如果这段时间内都没有接收到服务器发送的报文,那么说明连接正常关闭,这时才真正结束连接。

tcp

三次握手的漏洞

1.SYN Flood攻击

假如有很多人冒充王总,李总等给小丽发消息说要出去吃饭,却在小丽回复王总,李总后王总,李总觉得自己并没有邀请小丽,就没有回复小丽,但是小丽一直在等待王总的消息。并且小丽的处理能力是有限的,如果达到上限,其他人发出的消息就会被拒绝。

解决方法:

收到SYN后并不立即分配TCB(传输控制模块),而是采取某种方法确保收到真正的ACK报文后才分配TCB。可采取的方法有发送额外的ACK报文,并记录对应信息,检验收到正确的ACK报文后才建立TCB。

 

2.IP欺骗DOS攻击

在王总和小丽出去潇洒时又有人冒充王总发送RST报文,想要终止王总和小丽的两人世界,那么当小丽接收到该报文后会想,哎呀,现在的王总有点问题,我应该重新开始约会。于是王总还在开心中突然发现小丽走了,好气啊,只能重新开始连接,重新向小丽提出邀请。

解决方法:

可以进行口令加密,仅当口令正确时才会接收报文。也可以采用鲁棒的交互协议,加上入口包过滤器来保护网络。