网上有很多文章讲TCP为什么建立连接时需要三次握手,关闭连接时需要四次握手,讲了很多原理,反而让很多人难以理解。
其实只有一句话:TCP连接是两个端点之间的事,由于TCP连接是可靠连接,所以不管是建立连接还是关闭连接,需要两个端点都要发送请求和收到确认
其次要理解TCP的通道是全双工的,是可以读和写数据的,理解这个之后就明白了为什么关闭连接时需要四次握手。
首先讲三次握手,建立连接时不涉及到读写通道,只是两个端点的请求和确认。要记住是两个端点之间的,两个端点是平等的关系。
从客户端的角度来说,它只需要发送一个请求syn,然后收到ack就能知道连接是可以建立的
从服务器端的角度,它也只需要发送一个请求syn,然后收到ack就能知道连接是可以建立的
所以建立连接时最少只需要三次握手即可,即服务器端收到客户端syn,之后向客户端发送ack的同时携带上自己的syn,这样就只需要三次握手就能使双方都发生syn和都收到ack.
当然你自己设计的时候也可以使用4次或者更多的握手,但是最少3次即可
关闭连接时也还是两个端点都要发送请求和收到确认。但是关闭连接时涉及到两个端点的读写通道的事。
从客户端的角度来说,它发送一个关闭请求FIn,然后收到ack就知道可以关闭连接的
从服务器的角度来说,它发送一个关闭请求Fin,然后收到ack就知道可以关闭连接的
但是由于是读和写通道,所以服务器端在收到客户端的关闭Fin时,可能还在往客户端发送消息,所以只能先发送ack确认客户端客户关闭写通道,这时候服务端不能使用通过一消息发送它的关闭Fin,只能过会等它自己写完了,才能重新发送一个关闭请求的Fin。
所以比建立连接时多了一次握手,关闭连接时最少需要4次握手。理解了为什么需要4次握手之后,就不难理解TCP半关闭的概念。
原文地址:http://blog.csdn.net/iter_zc/article/details/39339723