前言
关于TCP连接的三次握手和断开的四次挥手,现在已经是三刷了。之前在学习过程中不是非常理解,只是知道了这个过程,但是由于往往解释有些官方或抽象,记不住也不理解。现在在理解后准备将自己的理解发表一下,希望能帮到有相同境遇的人。
TCP的连接
偏官方的描述
- 客户端(Client)向服务端(Server)发送一个SYN报文,序号(
)为随机数 - 服务端收到后,向客户端发送SYN+ACK的应答报文,
,同时发送一个随机序号 - 客户端收到后再向服务端发送Ack报文,
通俗的描述
客户端首先尝试向服务端申请连接,并给出自己的标识x
服务端收到后,要让客户端知道自己能够正常收到它的信息,所以要回复他,回复内容有:
①. 客户端的标识x+1,这样能让客户端看到了就能确定服务端是真的收到自己的连接请求了,而不是收到别人的请求回给自己
②. 自己的标识y,那都让客户端知道它能否正常发送接收信息了,自己也要知道,自己这边和客户端的发送接收信息是否有问题
客户端收到后,知道自己这边没有问题了,给对方发送y+1,让服务端也省心,告诉它它也没有问题
于是,两方都没有问题,且确定了连接的双方都是正确的对方,那就可以建立连接了。
一些解释
客户端:比如我们现在用的电脑
服务端:你所访问的网站那头存储信息、处理信息的服务器
握手次数能不能少:不能少,第一次是申请请求,同时为验证提供材料;第二次是给客户端验证自己连接没问题;第三次是给服务端验证自己连接没问题。
TCP的断开
断开不一定是由客户端主动的,这里只以客户端主动举例。
偏官方的描述
- 客户端向服务端发送FIN报文
- 服务端向客户端发送ACK报文,并进入CLOSED_WAIT状态
- 服务端向客户端发送FIN报文
- 客户端向服务端发送ACK报文,并进入TIME_WAIT状态
通俗的描述
- 客户端告诉服务端,自己想要断开连接了
- 服务端告诉客户端自己知道了,让它别叫了,同时把自己还没干完的事先干完,把本来连接时期需要发送给客户端的内容先发过去
- 服务端干完事后,告诉客户端自己现在可以断开连接了
- 客户端收到后告诉服务端知道了,此时还可以接受2中服务端发送的其他内容
一些解释
TIME_WAIT的作用:
和连接一样,防止下次又碰到存在相同四元组的连接时,可能会接收到之前的报文。所以需要一些时间接收连接过程中还未收到的信息。
等待足够的时间以确保最后的ACK能让被动关闭方接收,从而帮助其正常关闭。
TIME_WAIT等待的时间为2MSL(报文最大生存时间),相当于是给予一次报文丢失的容错,给它一个来回的等待时间。
CLOSED_WAIT:被动关闭方调用close的时间