TCP的三次握手、四次挥手

在传输层的协议中,TCP现对于UDP来说更能保证其数据传输的准确性,其中一个重要的原因就是三次握手和四次挥手机制,接下来我们一起看下这其中的过程。

三次握手

客户端发起第一次握手(syn,seq ) 服务器返回第二次握手(ask,syn,seq) 客户端发出确认消息第三次握手(ack,seq)

其中两侧是linux中服务器和客户端创建流程所调用的API函数,此次暂不展开。 首先如下图所示,是TCP协议头格式: 在三次握手中,我们主要是用sequence number(序列号)和SYN。 第一次握手: 客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。

第二次握手: 服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。 第三次握手: 客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1

以上是对于TCP连接时三次握手的介绍,而这三次握手是发生在哪个编程接口中呢?我们先了解下C/S中服务器和客户端的搭建流程。 服务器: 客户端: 由以上流程可以分析出: 三次连接是由客户端发起的,第一次握手应发生在connect()中;listen()函数是一个被动监听的,只是让套接字进入监听状态,而真正的接收客户端连接的是accept()函数,因此两次握手发生在accept()函数中,建立连接成功后,accept()函数会返回一个新的套接字用于客户端与服务器之间的通信。

四次挥手

上图是四次挥手的示意图:

首先在每个进程调用close()接口进行连接断开时,该端会发送一个FIN表示数据发送完毕(主动关闭)。 而收到这个FIN的一端(被动关闭),会回应一个ACK表示收到信息,但不会立即断开连接 在等待一段时间后,被动关闭的一端会调用close()也关闭自己的套接字,同时向主动关闭的一方发送一个FIN 接收到这个FIN的一方(主动关闭),会回应一个ACK,同时等待一段时间后关闭连接
经验分享 程序员 微信小程序 职场和发展