01 介绍
在我的上篇文章提及TCP通信:TCP通信及基于OpenSSL实现TLS
为了更好的学习和理解TCP协议的连接和断开连接的过程,我们来引入一个非常适合用来学习网络协议的抓包工具Wireshark。这个抓包工具可以详细看到每一层网络报文的详细信息。
客户端ip为10.0.65.1,服务端ip为10.0.65.0,端口为23
02 TCP协议的三次握手过程
Wireshark抓包为灰色: TCP连接建立和断开数据包,表示TCP连接的建立和断开过程。
No.5:客户端向服务器发送一个SYN段(表示发起连接请求)
No.6:服务端返回一个ACK(对客户端连接请求的应答)+SYN(表示服务端发起连接请求)
No.7:客户端给服务端返回一个ACK(对服务端连接请求的应答)
到此,TCP三次握手就结束了。客户端与服务端之间已经成功建立起连接。
这里未对Seq和Ack进行说明,可参见下文解释。
03 TCP协议的数据传输过程
TELNET协议是基于文本的,通常使用TCP作为传输层协议,其端口号为23。No.8:客户端向服务器发送消息。
客户端向服务端发送了一个字符串“hello”,初始序列号是1,TCP段长度为5,则下一个序列号(next sequence number)将是6。TCP协议中的序列号表示数据流中下一个数据字节的序号,因此在这种情况下,下一个序列号将是当前序列号加上TCP段长度。
No.9:服务端作了一个应答,序列号是1,Ack是6,在TCP连接中,接收方发送的ACK(确认号)通常是对发送方下一个期望接收的序列号(即发送方的下一个序列号)进行确认,这个逻辑确保了数据包的顺序和完整性,表示接受到了客户端的信息。
N0.10:服务端向客户端发送消息。
服务端向客户端发送了一个字符串,初始序列号是1,TCP段长度为29,则下一个序列号(next sequence number)将是30。
到此,TCP数据传输就结束了,吗?客户端对服务端的应答呢?在04挥手过程会提及。
要注意的是:客户端和服务端各自维护着自己的序列号和确认号。
04 TCP协议的四次挥手过程
当最后一次数据传输,发送方发送一个带有FIN标志的数据包给接收方,表示数据传输结束,然后等待接收方的确认。接收方收到该数据包后,会发送一个带有ACK标志和FIN标志的数据包给发送方,表示接收方已经接收到了数据,并且也要开始关闭连接。最后,发送方收到接收方的确认后,会发送一个带有ACK标志的数据包给接收方,表示发送方也已经关闭连接。这样,整个连接就完成了关闭过程。
No.11:当数据传输首先结束的端(服务端),会率先发起结束断开连接的请求,序列号Seq是30,next sequence number是31。
No.12:客户端对上一个断开连接请求的报文进行确认。并同时,停止接受数据,序列号Seq是6,Ack是31。
No.13:客户端也结束数据发送了,所以也会发起一个断开连接的请求,这里序列号和Ack保持不变,但是这里的next sequence number是7,即比之前多一位。
No.14:是服务端对客户端断开连接请求的进行确认,序列号是31,Ack是7。
至此,服务器和客户端都停止发送和接受数据了!四次挥手就完成了。
05 拓展
最后两行是我通过SSH访问远程服务器抓包的信息,这里也提及一下,通过putty访问,Putty是一个用于远程登录和管理计算机系统的免费开源软件。它支持多种网络协议,包括SSH、Telnet、Rlogin等,可以在Windows平台上使用。
SSH: SSH(Secure Shell)和TELNET都是基于TCP的协议,用于远程访问计算机系统。SSH是一种安全的远程登录协议,它通过使用加密技术来保护传输的数据。SSH协议可以为用户提供身份验证、加密通信和数据完整性验证等安全功能,因此在安全性上优于TELNET。SSH通常使用TCP端口22。
No.15 | No.16:当我通过本机访问SSH远程服务器时,ip10.0.65.0也自然作为服务端,但是端口跟先前23不同,这里22是SSH协议的端口,这里的序列号为1,是因为当我连接上远程服务器的时候,就会进行一次SSH握手,既然SSH是基于TCP,也会有个握手过程,与02一致。