1、概述
TCP是面向链接的协议,运输连接是用来传送TCP报文的。运输连接有三个阶段,即连接建立,数据传送,连接释放。TCP连接的简历采用客户服务器方式,主动发起连接建立的应用进程叫做客户,被动等待连接建立的应用进程叫做服务器。
2、连接建立
TCP连接建立的过程是三次握手,形象点就是:
- A(SYN、seq):我要跟你连接,怎样?密钥(x)
- B(SYN、ACK、seq、ack):可以呀,我已经准备好了。密钥(y,x+1)
- A(ACK、seq、ack):既然可以,开始链接吧!密钥(y+1)
那么两次握手行不行?
假如出现B收到了“A已失效的连接请求报文段”,那么B以为A又发起了连接请求,于是就发送了确认同意请求,然而A并没有发起请求,于是忽略B的确认报文,这时
- 如果是两次握手建立连接,B就会一直等下去,许多资源就白白浪费了
- 如果是三次握手建立连接,B由于没有收到A的确认,因此知道A并没有发起连接请求,于是就放弃等待。
3、连接释放
TCP连接释放过程是四次握手,形象点就是:
- A(FIN):我要关闭连接了。密钥(u)
- B(ACK):好的,我告诉应用程序。密钥(u+1)
- B(FIN、ACK):应用程序已经准备好关闭连接了。密钥(w)
- A(ACK):既然都准备好了,那我就关闭连接啦。密钥(w+1)
为什么A在TIME-WAIT章台必须等待2MSL的时间呢?
- 为了保证A发送的最后一个ACK报文段能够到达B。假如该报文段丢失,那么B收不到A的ACK报文段就会重发FIN+ACK报文段。此时A收到B的FIN+ACK报文段,会再一次发出ACK确认,并且重启2MSL计时器。直到双方都正常进入CLOSED状态。
- 防止“已失效的连接请求报文段”出现在本链接中,A发送完最后一个ACK报文段后,再经过2MSL时间,本次连接产生的旧的连接请求报文段就会都从网络中消失。
4、保活计时器
假设连接建立后,其中一方突发故障,那么另一方就不可能白白等下去,因此需要一个保活计时器
- A收到B发来的数据后,重置保活计时器,通常是两个小时
- 若时间到了却没有收到B的数据,A就发送一个探测报文段,以后每隔75分钟发送一次
- 所一连发送10个探测报文段都没有B的回应,那么A就认为B发生了故障,关闭连接。