三次握手
1 客户端首先发送一个syn包,这个包的作用是向服务端询问服务端是否准备好。服务端返回一个ack的包同时将服务端的syn包发在这一次握手的过程中发了过来,因为数据很小,也不需要准备什么资源,所以两个作用的包一次发过来。
2客户端收到服务端返回的ack包,得知服务端已近准备好了,此时客户端就转变为ESTABLISHED的状态。同时发出一个ack的包,服务端收到之后也得知客户端也准备好了,此时也转变为ESTABLISHED的状态。
3至此三次握手完成,连接建立,注意在此过程中不需要应用进程的任何参与。
四次挥手
1 想关闭的一端首先发送一个fin包,对端接收到,此时对端马上回复一个ack的包,表示以及知道了。在准备好关闭之后,此时再次发送一个fin包告诉对端,我准备好了,你可以关闭了。此时对端回复一个ack的包,告诉另外一端,收到了,你也可以关闭了。
为什么主动发起的关闭方需要time-wait 2MSL呢,是由于网络是不可靠的,最后发出的ack的包可能没有被对端收到。此时考虑一种比较极端的情况就是在ack的包发送了一个MSL之后对端并没有收到,此时对端重发发送一次fin包,在一个MSL的时间内,还是可以被收到了。
2 一般在企业内部,数据中心这样的地方,网络比较可靠,而且很快,可以调整这个时间长度,避免端口一直被占用,资源得不到释放,也可以直接设置,端口可以重用