参考博客
https://www.cnblogs.com/zhuzhenwei918/p/7465467.html
http://www.mamicode.com/info-detail-1792965.html
https://www.cnblogs.com/engeng/articles/5959335.html
TCP通信包括了三个部分:TCP建立连接,传输数据,断开TCP连接,如下图:
三次握手
第一次握手:将Client标志位SYN设置为1,随机产生一个值seq = x;
第二次握手:Server在收到Client传来的SYN时,必须进行确认(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时Server进入SYN-RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),发送完成后Client和Server进入ESTABLISHED状态.这就完成了三次握手,开始通信。
数据传输
超时重传、快速重传、流量控制、拥塞控制等等。(这一切都是为了提供可靠的字节流服务)
四次挥手
第一次挥手:Client发送FIN数据包(假设为seq=x+2)来关闭Client到Server的连接,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个FIN包用来断开Server到Client的连接:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送
第四次挥手:Client收到Server发来的FIN包后,回复一个ACK,确认序号为收到序号+1,至此连接全部断开。
为什么是三次握手,四次挥手
TCP是全双工 的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息。(半双工:A可以给B发,B也可以给A发,但是A在给B发的时候,B不能给A发,即不同时)(单工:只能A给B发,B不能给A发)
握手
如果握手两次,那么Server无法确定server的信息client是否能收到,所以如果server发出的信号,可能后面的client都收不到,会出现问题。
如果握手四次,那就造成了浪费,因为三次结束之后已经可以建立连接。
挥手
由于TCP是全双工的,所以每个方向都需要单独关闭连接。
当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN为止。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。