什么是握手——TCP 建立连接的过程就叫做握手
关于TCP的连接建立
TCP 建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP 报文段,称之为三报文握手,采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。
TCP的连接建立要解决以下三个问题:
1、使TCP双方能够确知对方的存在 。
2、使TCP双方能够协商一些参数( 最大窗口值是否使用窗口扩大选项和时间戳选项,以及服务质量等)。
3、使TCP双方能够对运输实体资源(例如缓存大小连接表中的项目等)进行分配。
三次握手
三次握手是 TCP 连接的建立过程。在握手之前,主动打开连接的客户端结束 CLOSE 阶段,被动打开的服务器也结束 CLOSE 阶段,并进入 LISTEN 阶段。随后进入三次握手阶段:
① 首先客户端向服务器发送一个 SYN 包,并等待服务器确认,其中:
标志位为 SYN,表示请求建立连接;
序号为 Seq = x(x 一般取随机数);
随后客户端进入 SYN-SENT 阶段。
标志位为 SYN 和 ACK,表示确认客户端的报文 Seq 序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
序号为 Seq = y;
确认号为 Ack = x + 1,表示收到客户端的序号 Seq 并将其值加 1 作为自己确认号 Ack 的值,随后服务器端进入 SYN-RECV 阶段。
标志位为 ACK,表示确认收到服务器端同意连接的信号;
序号为 Seq = x + 1,表示收到服务器端的确认号 Ack,并将其值作为自己的序号值;
确认号为 Ack= y + 1,表示收到服务器端序号 seq,并将其值加 1 作为自己的确认号 Ack 的值。
随后客户端进入 ESTABLISHED。
② 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一 段TCP 报文,其中:
③ 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的, 从而结束 SYN-SENT 阶段。并返回最后一段报文。其中:当服务器端收到来自客户端确认收 到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束 SYN-RECV 阶段,进入 ESTABLISHED 阶段,从而完成三次握手
简单来说TCP的三次握手就是——1.向对方发送连接的请求. 2.对方回应. 3.发送数据.(总共发送三个数据包)
TCP的四次挥手就相对简单
第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态;
第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。
第三次挥手:Server将FIN置1,发送一个序列号给Client;进入LAST_ACK状态;
第四次挥手:Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。
简单来说TCP的四次挥手——1.向对方发送一个FIN置为1的数据包表示想断开连接. 2.对方回复ACK置为1的数据包表示已收到. 3.对方再发送一个FIN置为1的数据包. 4.再向对方发送一个ACK置为1的数据包.
用现实例子来说就是:
客户与服务器交谈结束之后,客户要结束此次会话,就会对服务器说:我要关闭连接了(第一 次挥手)
服务器收到客户的消息后说:好的,你要关闭连接了。(第二次挥手)
然后服务器确定了没有话要和客户说了,服务器就会对客户说,我要关闭连接了。(第三次挥 手)
客户收到服务器要结束连接的消息后说:已收到你要关闭连接的消息。(第四次挥手),才关闭。