TCP的运输连接管理
TCP的连接建立
TCP是面向连接的协议,它基于运输连接来传送TCP报文段。
TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。
TCP运输连接有以下三个阶段:
-
建立TCP连接
-
数据传送
-
释放TCP连接
TCP的运输连接管理就是使运输连接的建立和释放都能正常地进行。
TCP的连接建立要解决以下三个问题:
-
使TCP双方能够确知对方的存在;
-
使TCP双方能够协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等);
-
使TCP双方能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。
TCP连接请求报文段首部中的同步位SYN被设置为1,表明这是一个TCP请求报文段。
序号字段seq被设置了一个初始值x,作为TCP客户进程方选择的初始序号。
请准意:TGP规定SYN被设置为1的报文段不能携带数据,但要消耗掉一个序号。
针对TCP连接请求的确认报文段首部中的同步位SYN和确认位ACK都设置为1,表明这是一个TCP连接请求确认报文段。序号字段seq被设置了─个初始值y,作为TCP服务器进程诚选择的初始序号。确认号字段adk的值被设置成了x+1,这是对TP客户进程所选择的初始序号的确认。
请注意:这个报文段也不能携带数据,因为它是SYN被设置为1的报文段,但同样要消耗掉一个序号。
针对TCP连接请求的确认的确认报文段首部中的确认位ACK被设置为1,表明这是一个普通的TCP确认报文段。序号字段seq被设置为x+1,这是因为MGP客户进程发送的第一个TCP报文段的序号为X,并且不携带数据,因此第二个报文段的序号为x+1。
请注意:TCP规定普通的TCP确认报文段可以携带数据,但如果不携带数据,则不消耗序号。在这种情况下,所发送的下一个数据报文段的序号仍是x+1。
确认号字段ack被设置为y+1,这是对TCP服务器进程所选择的初始序号的确认。TCP服务器递程收到该确认报文段后也进入连接已建立状态。
为什么最后要发针对TCP连接请求的确认的确认报文段?
这是为了防止已失效的连接请求报文段突然又传送到了TCP服务器,因而导致错误。
例题:主机甲向主机乙发送一个(SYN=1,seq=11220)的TCP段,期望与主机乙建立TCP连接,若主机乙接受该连接请求,则主机乙向主机甲发送的正确的TCP段可能是
A.(SYN=0,ACK=0, seq=11221, ack=11221) B.(SYN=1,ACK=1, seq=11220, ack=11220)
C.(SYN=1,ACK=1, seq=11221, ack=11221) D.(SYN=0,ACK=0, seq=11220,ack=11220)
解析:见上文,选C。
TCP的连接释放
TCP通过“四报文挥手”来释放连接
该报文段首部中的终止位FIN和确认位ACK的值都被设置为1,表明这是一个TCP接释放报文段,同时世对之前收到的报文段进行确认。序号seq字段的值设置为u,它等于TCP客户进程之前已传送过的、数据的最后一个字节的序号加1。
请注意:TCP规定终止位FN等于1的报文段即使不携带数据,也要消耗掉一个序号。
确认号ack字段的值设置为v,它等于TCP客户进程之前已收到的、数据的最局一个字节的序号加1。
TCP服务器进程收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段养进入关闭等待状态。
该报文段首部中的确认位ACK的值被设置为1,表明这是一个普通的TCP确认报文段。序号seq字段的值设置为v,它等于TCP服务器进程之前已传送过的数据的最后一个字节的序号加1。确认号adk字段的值设置为u+1,这是对TCP连接释放报文段的确认。TCP服务器进程这时应通知高层应用进程:TCP客户进程要断开与自己的TCP连接。此时,从TGP客户进程到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连接释放报文段虽然不携带数据,但要消耗掉一个序号。确认号ack字段的值设置为w+1,这是对所接受到的TCP连接释放报文段的确认。TCP服务器进程收到该报文段后就进入关闭状态。而TCP客户进程还要经过2MSL后才能进入关闭状态。
MSL(Maximum Segment Lifetime)意思是最长报文段寿命,RFC793建议为2分种。
为什么不直接进入关闭状态而是还要等待2MSL?
TCP服务器进程每收到一次TCP客户进程的数据,就重新设置并启动保活计时器(2小时定时)。
若保活计时器定时周期内未收到TCP客户进程发来的数据,则当保活计时器到时后,TCP服务器进程就向TCP客户进程发送一个探测报文段,以后则每隔75秒钟发送一次。若一连发送10个探测报文段后仍无TCP客户进程的响应,TCP服务器进程就认为TCP客户进程所在主机出了故障接着就关闭这个连接。