前言
看到这个标题你可能会说,TCP 连接的建立与断开,这个我熟,不就是三次握手与四次挥手吗?且慢,脑海中可以先尝试回答这几个问题:
- 四次挥手是谁发起的?
- 如果断电/断网了连接会断开吗?
- 什么情况下没有四次挥手连接也会断开?
这不是面试,而是遇到了实际问题,至于是什么问题,容我先卖个关子,本文也不会解答,后面会有一篇专门的文章来说遇到的问题是啥,所以在讲实际问题之前,先弄懂理论。
正常断开
我们由浅入深,先了解正常情况下 TCP 连接是如何断开的,下图为 TCP 三次握手与四次挥手的经典图(来自《TCP/IP详解卷1》)
在我们的电脑上,可以使用 python 的 SimpleHTTPServer 来快速起一个 http 服务(http 也是基于 TCP 协议),比如这样:
python -m SimpleHTTPServer 20880
再通过 nc 或 telnet 这两个命令来创建 TCP 连接,比如我测试使用 nc 来创建连接
nc -v ip port
Connection to ip port [tcp/*] succeeded! 表示连接成功
我们如何观察这个连接呢?可以通过 netstat 或 lsof 来查看这条"连接",这里我使用 lsof (mac 与 Linux 系统的 netstat 命令不太一样,使用起来有点别扭 )
lsof -i:20880
无论是客户端还是服务端都会占用一个端口,不过服务端端口是固定的,客户端端口是随机的。