TCP 是面向连接的传输协议,因此通信双方必须先建立连接,才能传输数据。
上一小节,我们已经初步学习了 TCP 三次握手建立连接的主要步骤,但有不少细节还来不及展开。现在我们再接再厉,先通过一个实验来观察三次握手的过程,进而深入研究其中的细节。
观察三次握手过程
如下图,局域网中有一台服务器,IP 地址是 10.0.0.2
,其他主机可以通过 SSH 协议来登录服务器:
SSH 是 secure shell 的缩写,这是一种加密的应用层协议,常用于 远程登录 。
SSH 服务通过 TCP 协议来通信,默认端口为 22 。其他主机想要登录服务器,需要先建立到服务器 22 端口的 TCP 连接。接下来,我们就从 10.0.0.3
上来连接服务器 10.0.0.2
的 22 端口,观察 TCP 连接的建立过程。
执行下面这个命令,即可启动我们的实验环境,进入客户机 10.0.0.3
:
docker run --name switch-lab --rm -it --privileged --cap-add=NET_ADMIN --cap-add=SYS_ADMIN -v /data -v /tmp:/tmp-data -h switch fasionchan/netbox:0.7 bash /script/tcp-lab.sh
为了方便操作,我在客户机中准备了两个窗口,环境启动后就可以看到。
我们先在客户机上执行 tcpdump 命令,嗅探 eth0 网卡上的网络流量,以便观察 TCP 的通信过程,:
root@client [ ~ ] ➜ tcpdump -ni eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
准备完毕后,我们切到另一个窗口来连接服务器。
如何在不同窗口间进行切换呢? 下面一起来复习 tmux 窗口切换操作:
按下 tmux 功能键
Ctrl-B
;再按下
Q
,这时每个窗口会出现一个数字;按下窗口上的数字,即可切到对应的窗口;
我们执行 telnet 命令,连接到服务器 10.0.0.2
的 22 端口:
root@client [ ~ ] ➜ telnet 10.0.0.2 22
Trying 10.0.0.2...
Connected to 10.0.0.2.
Escape character is '^]'.
SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.3
SSH 远程登录本来应该执行 ssh