up:: 5.8.1-TCP的运输连接管理—TCP的连接建立
学习视频
笔记
四报文挥手过程
数据传输结束后,tcp通信双方都可以释放连接,现在tcp客户进程和tcp服务器进程都处于连接已建立状态
假设是用tcp客户进程的应用进程,通知其主动关闭tcp连接,tcp客户进程会发送tcp连接释放报文段并进入终止等待1状态
该报文段首部中的中指位fin和确认位ack的值都被设置为1,表明这是一个tcp连接释放报文段
同时也对之前收到的报文段进行确认序号seq字段的值设置为u,它等于tcp客户进程之前已传送过的数据的最后一个字节的序号+1
**请注意tcp规定终止位fin等于1的报文段,**即使不携带数据,也要消耗掉一个序号确认号
ack字段的值设置为v,它等于tcp客户进程之前已收到的数据的最后一个字节的序号+1
tcp服务器进程收到tcp连接释放报文段后,会发送一个普通的tcp确认报文段,并进入关闭等待状态,该报文段首部中的确认为ack的值被设置为1,表明这是一个普通的tcp确认报文段
序号seq字段的值设置为v,它等于tcp服务器进程之前以传送过的数据的最后一个字节的序号+1,这也与之前收到的tcp连接释放报文段中的确认号匹配
确认号ack字段的值设置为u+1,这是对tcp连接释放报文段的确认
tcp服务器进程这时应通知高层应用进程,tcp客户进程要断开与自己的tcp连接,此时从tcp客户进程到tcp服务器进程这个方向的连接就释放了,这时的tcp连接属于半关闭状态
也就是tcp客户进程已经没有数据要发送了,但tcp服务器进程如果还有数据要发送,tcp客户进程仍要接收 也就是说从tcp服务器进程到tcp客户进程这个方向的连接并未关闭,这个状态可能会持续一段时间
tcp客户进程收到tcp确认报文段后就进入终止等待2状态,等待tcp服务器进程发出的tcp连接释放报文段
若使用tcp服务器进程的应用进程已经没有数据要发送了,应用进程就通知其tcp服务器进程释放连接
由于tcp连接释放,是由tcp客户进程主动发起的,因此tcp服务器进程对tcp连接的释放称为被动关闭连接
tcp服务器进程发送tcp连接释放报文段并进入最后确认状态,该报文段首部中的终止位fin和确认为ack的值都被设置为1.表明这是一个tcp连接释放报文段
同时也对之前收到的报文段进行确认,现在假定序号seq字段的值为w,这是因为在半关闭状态下,tcp服务器进程可能又发送了一些数据,确认好ack字段的值为u+1,这是对之前收到的tcp连接释放报文段的重复确认
tcp客户进程收到tcp连接释放报文段后,必须针对该报文段发送普通的tcp确认报文段,只好进入时间等待状态,该报文段首部中的确认为ack的值被设置为1,表明这是一个普通的tcp确认报文段,序号seq字段的值设置为u+1,这是因为tcp客户进程之前发送的tcp连接释放报文段虽然不携带数据但要消耗掉1个序号确认号
ack字段的值设置为w+1,这是对所收到的tcp连接释放报文段的确认
tcp服务器进程收到该报文段后就要进入关闭状态
而tcp客户进程还要经过两倍的msl后才能进入关闭状态,msl的意思是最长报文段寿命
rfc 793文档建议为两分钟,也就是说tcp客户进程进入时间等待状态后,还要经过四分钟才能进入关闭状态
这完全是从工程上来考虑的,对于现在的网络,msl取为两分钟可能太长了,因此tcp允许不同的实现,可根据具体情况使用更小的msl值
那么tcp客户进程,在发送完最后一个确认报文段后,为什么不直接进入关闭状态,而是要进入时间等待状态两倍,msl号才进入关闭状态,这是否有必要呢?
防止消耗资源:
tcp服务器进程发送tcp连接释放报文段后,进入最后确认状态
tcp客户进程收到该报文段后,发送普通的tcp确认报文段并进入关闭状态,而不是时间等待状态
然而该tcp确认报文段丢失了,这必然会造成tcp服务器进程,对之前所发送的tcp连接释放报文段的超时重传
并仍处于最后确认状态,重传的tcp连接释放报文段到达tcp客户进程,由于tcp客户进程属于关闭状态,因此不理睬该报文段
这必然会造成tcp服务器进程反复重传,tcp连接释放报文段并一直处于最后确认状态而无法进入关闭状态,因此时间等待状态 以及处于该状态两倍msl的时长可以确保tcp服务器进程可以收到最后一个tcp确认报文段而进入关闭状态
另外tcp客户进程在发送完最后一个tcp确认报文段后,再经过两倍msl时长,就可以使本次连接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的tcp连接中不会出现就连接中的报文段
以上就是tcp通过四报文挥手释放连接的过程
保活计时器
设想这样一种情况tcp双方已经建立了连接,后来tcp客户进程所在的主机,突然出现了故障。显然tcp服务器进程以后就不能再收到tcp客户进程发来的数据,因此应当有措施,使tcp服务器进程不要再白白等待下去。换句话说tcp服务器进程应该如何发现这种情况呢?
方法就是使用饱和计时器tcp服务器进程每收到一次tcp客户进程的数据,就重新设置并启动饱和计时器,若饱和计时器定时周期内未收到tcp客户进程发来的数据,则当保和计时器到时候tcp服务器进程就像tcp客户进程发送一个探测报文段以后,每隔75秒钟发送一次,若一连发送十个探测报文段后,仍无tcp客户进程的响应,tcp服务器进程就认为tcp客户进程所在主机出了故障。接着就要关闭这个链接