TCP三次握手与四次挥手的理解和场景举例

大学时候对于tcp的连接和关闭,都是靠强行记忆下来,发现即不能记得牢,就算记住了,也不是很了解为什么要这么麻烦。

TCP全双工通信

要明白为什么需要这么麻烦,首先要了解tcp它是全双工通信的,意味着数据端的两方,都有权利向对方发送数据。所以在一条tcp连接上,就需要连接或者关闭两次(两个方向),而每次连接syn或者关闭fin,都需要一个ack返回,才能确定这一方向,真正关闭。

三次握手

根据tcp连接图的客户端在左边,服务器在右边的习惯,首先客户端发送syn给服务端,服务端返回一个ack,代表服务端同意了客户端从左到右的连接。服务器在发送给客户端ack的同时,还将服务器请求syn给客户端,即从右到左方向的连接,客户端返回ack,代表从右到左的连接也成功。这样,两个方向上都成传输数据。可能你会想,如果客户端连接成功了服务端,而服务端却失败连接服务端,也就是第三次握手失败,是不是客户端还是能发送数据给服务器?这可能就变成单工通信了,这样客户端虽然能发送数据给服务端,但是服务端无法发送回去,这样的tcp连接是无法终止的,所以这种应该不可能,而且请求一般是客户端发出的,当服务端请求ack,一般客户端是马上响应ack。
举个例子,小明相约小红,打电话的小明说“小红,我今天想喂你吃饭,可以吗?”这时候小红回答说好,这时候,小明心里就已经确定自己能喂小红吃饭了。小红在回答好后,同时也问了小明“小明,我也想喂你吃饭,可以吗?”小明有点震惊,但是马上说好,这样,小红也知道了自己可以喂小明吃饭了。所以tcp通信中,每个请求syn,都必须要有ack,发送方才知道对方同意了自己的请求。

四次挥手

建立了连接是三次握手,但是为什么结束连接,却要4次呢?
其实挥手(即结束连接)和握手(建立连接)的原理是一样的,全双工,所以每个方向都要进行单独的关闭。一个fin(正常返回ack)只是这一方向上没有数据流动了,但是另一个方向同样能传输,虽然这在tcp应用上很少出现,但是理论上还是可能的。
下图,是关于tcp的半关闭例子,看完,你可能更加了解四次的意义。
这里写图片描述
四次挥手,相比三次握手,我们会发现,四次挥手只是将三次握手中,服务端返回给客户端的ack+syn拆出来了。这个跟结束连接的场景要挂钩,因为一方(客户端)要结束连接,另一方(这里暂时定为服务端)可能还在进行着数据操作,要等待着这部分完成后再结束,所以先返回一个ack,结束客户端往服务端传送数据的方向,等服务端处理完(一般会通知到应用层),再发送一个fin,代表服务端也要结束服务端到客户端这个方向的连接,这个有点异步通信的味道。
例如我们平时用的telnet,当客户端完成操作后,发送quit,内部就是发送了一个fin到服务器,服务器收到后返回一个ack,然后向上层应用程序telnet表明结束应用,再发送给客户端fin,客户端收到再返回ack,这样两个方向都结束了连接,telnet程序关闭技术。

猜你喜欢

转载自blog.csdn.net/jerryJavaCoding/article/details/78307324