在传输层的协议中,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,同时等待一段时间后关闭连接
学习笔记持续更新,公众号记录: