文章目录
- TCP连接建立的过程
- 三次握手
- TCP断开连接的过程
- 四次挥手
- 为什么要四次挥手?
- TCP确保可靠性的机制
TCP连接建立的过程
回顾昨天讲的TCP头部有哪些信息
记住这几个标记位的含义:
SYN synchronous建立联机 在连接建立时用来同步序号
ACK acknowledgement 确认 为1时表明确认号字段有效
PSH push传送 为1时接收方应尽快将这个报文段交给应用层
FIN finish结束 为1时表明发送端数据发送完毕要求释放连接
RST reset重置 为1时表明TCP连接出现故障必须重建连接
URG urgent紧急 为1时表明紧急指针字段有效
Sequence number 顺序号码
Acknowledge number 确认号码
三次握手
所谓三次握手(Three-Way Handshake)即建立TCP连接,是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。
- 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=X,并将该数据包发送给服务端,客户端进入SYN_SENT状态,等待服务端确认。
- 第二次握手:服务端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和ACK都置为1,ACK number=X+1,随机产生一个值seq=Y,并将该数据包发送给客户端以确认连接请求,服务端进入SYN_RCVD状态。
- 第三次握手:客户端收到确认后,检查ACK number是否为X+1,ACK是否为1,如果正确则将标志位ACK置为1,ACK number=Y+1,并将该数据包发送给服务端,服务端检查ack是否为Y+1,ACK是否为1,如果正确则连接建立成功,客户端和服务端进入ESTABLISHED状态,完成三次握手,随后客户端与服务端之间可以开始传输数据了。
TCP断开连接的过程
由于TCP连接时双向的的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,也就是不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭
四次挥手
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1,Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
- 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
为什么要四次挥手?
确保数据能够完整传输。当被动方收到主动方的FIN报文通知时,它仅仅表示主动方没有数据再发送给被动方了。但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,它可能还需要发送一些数据给主动方后,再发送FIN报文给主动方,告诉主动方同意关闭连接,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。
TCP确保可靠性的机制
-
确认
每次数据的流通,都需要各自发一个ACK来进行确认 -
重传
假如A给B发了一个包,B一直没有回复ACK,A就会怀疑B没有收到到,就会重新发送这个包,这就是重传 -
排序
-
流控
流控采用的机制是:滑动窗口TCP头部里面的窗口大小就是,允许一次能传几个包
假如规定的窗口大小为10,就是说A给B传包的时候,一次性可以传10个,而B只用给A发送一次ACK,这就大大提高了传输效率,
假如A给B传10个,B只收到了6个,那么下一次B给A发的ACK number就会是7,因为7-10的包没收到,而且A下一次的传输也就只会传7个了
那么再假如B这次把A给的7个包全部收到了,那么下一次A就不一定会发7个包给B,而是会发7个以上的包(感觉就像有脑子一样,会压榨),总之,这个流控的过程就是动态的,所用的这个机制就叫做滑动窗口