TCP连接管理
2017-03-04 11:24:37   0  举报             
     
         
 AI智能生成
  TCP连接管理和保活机制
    作者其他创作
 大纲/内容
  TCP选项    
     MSS:最大段大小:TCP协议所允许的从对方接收到的最大报文段,只记录TCP数据的字节数而不包括头部,当连接建立的时候,双方都要在SYN报文段的MSS选项中说明自己允许的最大报文段大小,默认536字节    
     子主题  
     选择确认选项:SACK,SACK提供了这样的一种功能:能在报文段丢失或者遗漏时帮助发送端更好的进行重传的工作    
     SACK包含了接收方已经成功接收的数据块的序列号范围  
     时间戳选项和防回绕序列号:TSOPT,2个4字节的时间戳数值,可以被发送端用来估算TCP连接的往返时间    
     发送方将一个32位的数值填充到时间戳数值字段(TSV),接收端将收到报文时的时间戳数值填充到第二部分的时间(称为TSER)    
     也为接收方避免接收到旧报文与判断报文的正确性提供了方法,称为防回绕序列号    
     例如发送端正常传送了包A,B,C对应的时间戳分别是1,2,3。然后B没有收到确认信号,重传了B。接着服务器又收到了B。若B的时间戳小于最近的时间戳数值(也就是3),则表明该包是旧的报文,可以丢弃。  
     不要求2台主机时钟同步  
     估算TCP连接往返时间主要用于设置超时时间  
     用户超时选项(user_timeout)    
     TCP发送者在确认对方未能成功接收数据之前愿意等待该数据ACK确认的时间(未广泛使用)  
     认证选项    
     用户替代较早期的TCP-MD5加密机制,为针对TCP欺骗攻击提供抵御措施  
     1.一个tcp连接由一个4元组构成,分别是连接两端IP+端口  
     3次握手    
     1.客户端发送SYN报文段给服务端    
     客户端进入了 SYN_SENT状态  
     2.服务端接收到报文后,响应一个ack(=syn+1),以及自己的一个SYN,也就是发送ACK+SYN给客户端    
     服务器进入了 SYN_RCVD状态  
     3.客户端接收到服务器发来的SYN,响应一个ACK给服务器。这样就完成了3次握手    
     发送端发送该包之后进入了ESTABLISH阶段,接收端接收到该ack之后,也进入了established状态  
     4次挥手    
     1.客户端发送FIN报文段给服务器    
     客户端进入 FIN_WAIT_1(主动关闭) 状态  
     2.服务器返回ACK,表明收到关闭信号    
     接收到FIN信号后,服务器进入close_wait(被动关闭)状态,客户端接收到ACK后,进入FIN_WAIT_2状态  
     3.服务器发送FIN报文段给客户端    
     服务器由被动关闭转为主动关闭,进入last_ack状态。该过程主要是因为服务器收到客户端发过来的关闭请求后,通知上层应用。然后上层应用调用自己的关闭方法,服务器就由被动关闭转为主动关闭的一个状态  
     4.客户端收到FIN报文段后返回一个确认ACK信号,进入time_wait状态,然后过了2MSL后,进入closed状态关闭连接  
     time_wait状态    
     1.timewait状态持续2MSL(MSL代表报文段能在连接中存活的最长时间),这样避免了在一个新的连接中,由于旧连接包的延时到达影响了新连接  
     2.客户端发的最后一个ack包是可靠传输的,若丢失(即服务器在指定的时间内没收到该ACK,会重传FIN就会导致客户端重传ACK),会重传ACK。这样能够让客户端有时间重发ACK    
     子主题  
     TCP半关闭    
     半关闭大体上和4次挥手差不多,主要是在第2,3个步骤中间,接收到半关闭的一方(如服务器)可以继续发送任意数量的报文,直至传输完毕之后,服务器发送自己的FIN给客户端,表明自己完成了包的传输。最后客户端发送ACK给服务端  
     初始序列号    
     解决报文段在网络中传输存在延迟到达或者是顺序混乱的情况。所以在连接建立之前,通信双方会各自选择一个初始序列号。  
     初始序列号会随时间而改变,所以每一个连接的初始序列号都是不一样的,防止出现序列号重复的情况  
     TCP连接的脆弱性:如果选择一个合适的序列号,IP和端口,任何一个人都可以伪造出一个TCP报文段。    
     措施1.使序列号变得难以猜测  
     措施2.加密序列号  
     重置报文段的情景    
     1.针对不存在端口的连接请求(不存在是指没有进程在监听该端口)  
     2.终止一条连接    
     正常情况下,释放连接需要一方发送FIN报文,这样的释放称为有序释放。但是在任何时候,我们可以通过发送一个重置报文段来终止一条连接,称为终止释放  
     3.半开连接  
     4.时间等待错误:在一方进入time_wait状态时,收到了另一方的一些报文段,甚至是重置报文段的时候,这个状态就会被破坏,称为时间等待错误  
     进入连接队列    
     当服务器忙于其他更高优先级的进程或者正在创建新进程时,新进来的连接请求存放在连接队列。    
     1.首先检查系统范围的参数backlog,若处于SYN_RCVD状态的连接的数目大于该阈值,进入的连接会被拒绝  
     2.每一个处于监听状态的节点有一个固定长度的连接队列,其中的连接已经被TCP完全接受(完成了3次握手),但尚未被应用程序接收。如果该队列有空间,则TCP会应答连接SYN请求。如果队列中没有足够的空间分配,TCP会延迟对SYN做出响应。  
     若TCP始终无法抽出时间来接收那些已经被TCP接受却超出队列保存上限的连接,根据TCP正常机制,客户端的主动打开操作将会超时  
     长连接/短连接    
     短连接就是传输2端完成3次握手之后,发送完数据报即关闭了连接  
     长连接即在发送完数据之后,不关闭连接,而是可以用于接下来的报文传输。连接使用TCP的保活机制来维持  
     保活机制    
     默认参数    
     1.保活时间:2小时(每隔2小时发送一个检测报文)  
     2.保活探测间隔:75S    
     若2小时后发送报文报文(该报文丢失不会重传)时没有收到ACK,则间隔75S会再次发送。若9次之后都还没收到ACK,则服务器发起关闭请求  
     3.保活探测次数:9次  
     4种情况    
     1.若对方主机正常工作    
     发送保活报文的一端收到响应后,发送端知道对方工作正常,则会重置保活计时器(2小时),若在计时器超时前有收到报文,则在收到报文时也会重置计时器  
     2.对方主机已经崩溃    
     若对方无应答,则在过了保活探测间隔之后,会再次发送,直到过了探测次数后,发送端将认为对方主机已关闭,则连接断开  
     3.对方主机崩溃并重启    
     对方主机会响应一个重置报文,请求端会断开连接  
     4.主机仍在工作,但是网络传输不可达    
     TCP无法区分状态2和状态4,所以会关闭连接。也不用担心对方主机关闭重启。因为服务器关闭的时候,待关闭的进程会发送一个FIN报文给客户端。客户端收到后会向请求端进程报告文件结束  
     请求端的应用层对应上面的4种情况收到的TCP的差错报告
通常是请求端发起一个读请求,并且等待来自对方的数据
    通常是请求端发起一个读请求,并且等待来自对方的数据
 第一种情况下:对应用层是透明的  
     第2种情况:连接超时  
     第3种情况:连接被对方重置  
     第4种情况:可能是连接超时,也可能是其他信息  
    
 
 
 
 
  0 条评论
 下一页