TCP通信之三次握手四次挥手

TCP是面向连接的,双方发送数据之前,必须先在双方之间建立一条连接。TCP协议不同于UDP协议,UDP协议不保证可靠性,而TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号 并交换 TCP窗口大小信息。看图说话


很清晰的一张图,当然了,这不是我画的,我只是引用过来说明问题了。

三次握手是什么?

1.第一次握手:建立连接。客户端发送连接请求报文段,向服务器发送同步码SYN seq = x,等待服务器的确认;

2.第二次握手:服务器收到客户端同步码SYN,向客户端发送应答码ack = x + 1,并发送服务器同步码SYN seq = y。

3.第三次握手:客户端收到服务器的SYN+ACK,向服务器发送应答码ack = y + 1,这个报文段发送完毕以后,TCP三次握手完成。

完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。

那四次分手呢?

客户端和服务器通过三次握手建立了TCP连接,当数据传送完毕,肯定是要断开TCP连接。那对于TCP的断开连接,这就是“四次分手”。

1.第一次分手:主机1(可以使客户端,也可以是服务器端),向主机2发送结束码FIN假设其值为M,这表示主机1没有数据要发送给主机2了;

2.第二次分手:主机2收到了主机1发送的结束码FIN,向主机1回一个应答码ACK = M + 1,主机2告诉主机1,我也没有数据要发送了,可以进行关闭连接了;

3.第三次分手:主机2向主机1发送结束码FIN,假设其值为N,请求关闭连接 ;

4.第四次分手:主机1收到主机2发送的结束FIN,向主机2发送应答码ACK = N + 1,主机2收到主机1的应答码ACK以后,就关闭连接; 此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

至此,TCP的四次分手完成了。

为什么要三次握手?

既然总结了TCP的三次握手,那为什么非要三次呢?怎么觉得两次就可以完成了。那TCP为什么非要进行三次连接呢?在谢希仁的《计算机网络》中是这样说的:

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

在书中同时举了一个例子,如下:

"已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,

而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一

个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新

的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server

发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,

也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,

server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,

client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。"

这就很明白了,防止了服务器端的一直等待而浪费资源。

为什么要四次分手?

那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工 模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2, 它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文 段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN 报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此 就会中断这次TCP连接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章