参考文章:http://357742954.blog.51cto.com/368705/1317226
TCP(Transmission Control Protocol) 传输控制协议,是一个面向连接的协议。
在运用此协议进行数据传输前都会进行连接的建立工作(三次握手)
当数据传输完毕,连接的双方都会通知对方要释放此连接(四次挥手)
TCP标志位
tcp标志位有6种标识
1.SYN(synchronous )建立联机
2.ACK(acknowledgement)确认
3.PSH(push)传送
4.FIN(finsh)结束
5.RST(reset)重置
6.URG(urgent)紧急
图解TCP与UDP的三次握手与四次挥手过程
三次握手过程:
第一次握手:host1发送一个TCP标志位 SYN=1、ACK=0的数据包给host2,并随机会产生一个Sequence number=1110,当host2接受到这个数据后,host2由SYN=1可知客户端是想要建立连接
第二次握手:host2要对客户端的联机请求进行确认,向host1发送应答号ACK=1、SYN=1、确认号Acknowledge number =1111,此值是host1的序列号+1,还会产生一个随机的序列号Sequence number = 22222,这样就告诉host1可以进行连接;
第三次握手:host1收到数据后检查Acknowledge number 是否是1110 + 1的值,以及ACK的值是否为1,若为1,host1会发送ACK = 1、确认号码Acknowledge number = 22222,告诉host2,你的请求连接被确认,连接可以建立
四次挥手过程:
第一次挥手:当传输的数据到达尾部时,host1向host2发送FIN = 1标志位;可理解成,host1向host2说,我这边数据传送完成了,我准备断开连接了
第二次挥手,因TCP的连接是全双工的双向连接,关闭也是要从两边关闭;当host2收到host1发来的FIN=1的标志位后,host2不会立刻向host1发送FIND=1的请求关闭信息,而是先向host1发送一个ACK=1的应答信息,表示:你请求关闭的请求我已经收到,但我可能还有数据没有完成传送,你再等下,等我数据传输完成了我就告诉你
第三次挥手:host2数据传输完成,向host1发送FIN=1,host1收到请求关闭 连接的请求后,host1就明白host2的数据已经传输完成,现在可以断开连接了
第四次挥手:host1收到FIN = 1后,host1还是怕由于网络不稳定的原因,怕host2不知道他要断开连接,于是向host2发送ACK = 1确认信息进行确认,把自己(host1)设置成TIME_WAIT的状态并启动2MSL定时器,如果host2没有收到ACK,host2端重传定时器触发,会重发FIN = 1,要求host1重新发送ACK,当host2收到ACK后,host2就断开连接;;当host1等待2MSL(2倍报文最大生存时间)后,仍然没有收到host2的重传请求,他就知道 host2已经收到了ACK,所以 host1此时才关闭连接,否则会重复上述过程,如果被动一方始终没能收到ACK,最终会超过最大重传次数,连接被关闭 这一点设计地很巧妙
深入理解TCP连接的释放:
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意外着这一方向上没有数据流动,一个TCP连接在收到一个FIN仍然能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道
简单来说是 “先关读,后关写”,一共需要四个阶段。以客户机发送关闭连接为例
1.服务器读通道关闭
2.客户机写通道关闭
3.客户机读通道关闭
4.服务器写通道关闭