7. TCP可靠传输的实现( 四 )


(3)、TCP服务器端进程向TCP客户端进程发送TCP连接释放报文
当TCP服务器端的进程数据传输完毕后,TCP服务器端进程会向TCP客户端进程发送TCP连接释放报文(FIN = 1,ACK = 1,seq = w,ack = u + 1),且此时TCP服务器端进程进入最后确认状态 。
(4)、TCP客户端进程向TCP服务器端进程发送普通的TCP连接释放确认报文
TCP客户端进程收到TCP服务器端进程发送而来的TCP连接释放报文后,TCP客户端进程会向TCP服务器端进程发送一个普通的TCP连接释放确认报文 。且此时从TCP服务器端进程到TCP客户端进程的连接关闭 。TCP服务器端进程进入关闭状态,而TCP客户端进程进入时间等待状态 。经过2MSL后进入关闭状态 。
(5)、TCP客户端进程有必要进入时间等待状态吗?可以直接进入关闭状态吗?
答案是必须进入时间等待状态 。因为如果在TCP客户端进程发送完毕TCP连接释放确认报文后,该报文丢失,那么TCP服务器端进程就会一直重新发送相关的TCP连接释放报文,而如果是直接进入关闭状态的话,那么TCP无法进入关闭状态而导致资源的浪费 。
(6)、保活计时器
会出现的现象:TCP客户端出现故障,那么TCP服务器端该如何发现?
TCP服务器进程每收到一次TCP客户进程的数据,就重新设置并启动保活计时器 。如果保活计时器定时周期内未收到TCP客户端进程发来的数据,则当其到时后,TCP服务器进程就向TCP客户端进程发送一个探测报文段,以后每隔75秒钟发送一次 。如果一连发送10个探测报文仍无TCP客户端进程的响应,TCP服务器端进程就认为TCP客户端进程所在主机出现了故障,就关闭这个连接 。10. TCP首部格式
源端口: 占16比特,写入源端口号,用来 标识发送该TCP报文段的应用进程 。
目的端口: 占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程 。
序号: 占32比特,取值范围[0,2^32-1],序号增加到最后一个后,下一个序号就又回到0 。指出本TCP报文段数据载荷的第一个字节的序号 。
确认号: 占32比特,取值范围[0,2^32-1],确认号增加到最后一个后,下一个确认号就又回到0 。指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认 。若确认号=n,则表明到序号n-1为止的所有数据都已正确接收,期望接收序号为n的数据 。
确认标志位ACK: 取值为1时确认号字段才有效;取值为0时确认号字段无效 。TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1 。
数据偏移: 占4比特,并以4字节为单位 。用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远 。这个字段实际上是指出了TCP报文段的首部长度 。
窗口: 占16比特,以字节为单位 。指出发送本报文段的一方的接收窗 。
同步标志位SYN: 在TCP连接建立时用来同步序号 。终止标志位FIN: 用来释放TCP连接 。复位标志位RST: 用来复位TCP连接 。
推送标志位PSH: 接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付 。
校验和: 占16比特,检查范围包括TCP报文段的首部和数据载荷两部分 。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部 。
紧急指针: 占16比特,以字节为单位,用来指明紧急数据的长度 。
填充: 由于选项的长度可变,因此使用填充来 确保报文段首部能被4整除,(因为数据偏移字段,也就是首部长度字段,是以4字节为单位的) 。