up:: 5.8.1-TCP的运输连接管理—TCP的连接建立

学习视频

5.8.2-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客户进程所在主机出了故障。接着就要关闭这个链接