TCP数据流与窗口管理
2017-02-19 22:06:04   0  举报             
     
         
 AI智能生成
  tcp数据流与窗口管理
    作者其他创作
 大纲/内容
  1.以SSH为例    
     1.在ssh中,一个输入字符会有4个TCP数据段    
     1.客户端的输入  
     2服务器的确认  
     3.服务器的回显  
     4.客户端会服务器回显的确认  
     PSH置位:表示在发送完该报文之后,发送端无再其他数据包要发送  
     延时确认    
     TCP不会对每个数据包都返回ack,而是会积累ack,用于批量数据传输。但是又不能任意时间的延长,因为可能会导致发送端以为数据包丢失而引起不必要的重传,    
     实际中延时确认时间最大200ms  
     Linux采用一种动态调节算法,可以在每个数据包都返回ack和传统的延时ack中相互切换  
     在小数据包传输中,采用另外的算法与延时ack相结合,即Nagle算法  
     2.Nagle算法    
     1.算法:在一个TCP连接中,如果还有没有收到确认ACK的在传数据(还有数据在信道中传输),那么发送端长度小于SMSS的报文段就不能被发送,直到收到全部的ACK。且在收到ACK之后,发送端需要将这些小数据报整合在一起拼成一个数据报进行发送。该方法迫使TCP实现停等(stop and wati),且它实现了自时钟控制:ACK返回越快,数据传输也就越快  
     在相对高延迟的广域网传输中,更需要减少小包的数量,该算法使得单位时间内发送的报文段数量更少,即RTT控制着发包的速率  
     根据实例抓包,可以发现,发送端每次发送数据包的时间呈一定的规律性    
     原因:每次发包大致上都是已经没有数据包在网络上传输了,然后再发送,再等待,那么间隔就是RTT时间  
     延时ACK和Nagle算法相结合    
     存在的问题:    
     若客户端采用Nagle算法,而服务器采用延时ACK,可能会导致死锁。因为客户端需要服务器返回ack,表明网络中无在传数据,才能继续发送数据包,而服务器的延时ack又在等待客户端接下来的数据包,然后累积返回ack。此时双方都在等待对方,就导致了死锁。  
     滑动窗口实现流量控制    
     每个tcp报文段中包含报文段序列号,ack号和窗口大小,窗口大小表示发送方为接下来的数据传输预留了多大的存储空间    
     如果TCP应用程序空闲,就会处理这些数据,窗口大小就可以保持不变  
     如果程序繁忙或者是处理不过来,就会导致这些数据需要排队等待处理,然后窗口就会缩小。  
     若程序一直不处理,则tcp会采取策略,使得发送端完全停止发送新数据,因为可能没有新的空间用来存储数据,此时窗口大小就可以为0  
     TCP两端以字节为单位,各维护一个发送窗口和接收窗口    
     1.关闭:左窗口右移,当数据得到ACK确认时,窗口会减小  
     2.打开:右窗口右移,当接收端中的已确认数据得到处理,可用缓存增大,窗口也就随之增大  
     3.收缩:右窗口左移,主机需求RFC并不支持该做法,但TCP必须能处理这一问题  
     左窗口坐边界不能左移,因为它代表的是已确认的ACK的号,具有累积性,不能返回  
     当左右边界相等的时候,称为0窗口,此时发送端不能再发送数据,发送端将开始探测对方端口  
     零窗口与TCP持续计时器    
     接收端在恢复可用空间时,会向发送端发送一个窗口更新(window update,不包含数据),但是该ack不保证可靠传输,可能会丢失。所以发送端会维护一个持续计时器。当超时时,会向服务端查询是否有可用空间,计时器会触发窗口探测的传输,强制要求服务器返回ACK  
     窗口仅包含一个字节的数据,采用TCP可靠传输(丢失重传),持续计时器采用指数退避时间来计算超时  
     糊涂窗口综合征(Silly Window Syndrome-SWS)    
     出现该问题时,交换的数据段大小不是全长的,而是一些较小的数据段。比如,在某一个时刻,服务端可用存储空间为0。发送端暂停发送数据。过了一会,服务端有了十几的空间,此时发送端探测之后发现有十几的空间,就会立即发送长度十几的报文段过来,又占满了空间。如此循环,极大的降低了传输效率    
     解决办法    
     客户端    
     1.不发送小报文段,且需要有Nagle算法来控制何时发送    
     1.全长的报文段可以发送(Mss)  
     2.数据段长度>=接收端通告过的最大窗口值的一半  
     3.满足以下任一一个条件即可    
     1.某一ACK不是自己期盼的(没有未经确认的在传数据)  
     2.该连接禁用Nagle算法  
     服务器端    
     1.不应通告小的窗口值。在窗口增至MSS或者接收端最大可用缓存的一半(取2者较小值)之前,不应该通告比这小的窗口值  
     大容量缓存与自动优化    
     TCP协议上层应用不能指定tcp接收端缓存大小,由操作系统来指定一个较大的固定值或者是动态变化的计算值  
     与窗口管理相关的攻击    
     主要形式为资源耗尽    
     通告窗口较小会使得TCP传输减慢,因此会更长时间的占用连接资源  
    
 
 
 
 
  0 条评论
 下一页