TCP连接管理

1、tcp连接的建立与关闭

i、三次握手、四次挥手(见图,太过熟悉,不作过多解释)

ii、server与client同时建立连接

通信双方在接收到来自对方的SYN之前必须先发送一个SYN。两个SYN必须经过网络送达对方。具体交互见下图。

iii、server与client同时关闭连接

通信双方在接收到来自对方的FIN之前必须先发送一个FIN。最后双方都进入TIME_WAIT状态。

iv、tcp支持半开启连接(引入半连接队列及全连接队列) 

对于被动建立连接的一方(一般假设为server),在建立连接的过程中,一般需要维护两个连接队列——半连接队列及全连接队列。同理,在拆除连接时,server也是要维护一个半关闭连接队列(用来处理server发送的fin,却没有收到ack的情况)。

半连接队列:server每收到一个syn报文后,会将此次连接push到半连接队列中,同时发送一个syn+ack报文。直至收到相应的ack报文后,再从半连接队列中pop出刚才相应的连接。(该队列每存储一个半连接,会启动相对应计时器,及重传的次数。如果server迟迟收不到ack报文,则重传直至所设置的次数,最后主动丢弃此次连接。)

全连接队列:当server收到ack报文后,建立连接,此时只是在传输层建立连接,还未告知应用层。相当于listen侦听到了,但还未将连接传递给accept。这种情况下,就需要全连接队列存储这种特殊(还未告知应用层已建立的连接)的连接。具体见下图分析。

v、tcp支持半关闭连接

tcp之所以支持半关闭连接,是因为当发启方主动关闭连接时,需要告知对端想要关闭连接操作。可是由于对端还可以进行写入传输数据,此时只回复一个ACK,告知发启方可以关闭写操作。但由于还需要发启方接收信息,故发启方的读操作仍需保持。当发启方收到ACK后,便处于半关闭连接状态。等待一段时间后再关闭被动方的写操作。如下图所示。

2、tcp状态转换图

 

3、有关time_wait讲解

TIME_WAIT状态也称为2MSL等待状态。在该状态中,tcp将会等待两倍于最大段生存期(Maximum Segment Lifetime,MSL)的时间,也被称作加倍等待。每个实现都必须为最大段生存期选择一个数值。该数值代表任何报文段在被丢弃前在网络中被允许存在的最长时间。该时间是有限制的,因为tcp报文段是以ip数据报的形式传输的,ip数据报拥有ttl字段和跳数限制字段。此两字段限制了ip数据报的有效生存时间。在linux系统中,2MSL可以在/proc/sys/net/ipv4/tcp_fin_timeout中设置及查看。

设置TIME_WAIT作用:

i、重传ACK以避免出现丢失情况,即确保发启端主动关闭并发送最终的ACK报文能到达对端(只要出现丢失,对端肯定会再次发送FIN报文请求,于是再继续发ACK报文。事实上,tcp总是重传FIN报文,直至它收到一个最终的ACK报文)。

ii、当tcp处于TIME_WAIT时,通信双方将该连接(四元组:客户端IP地址、客户端端口号、服务器IP地址、服务器端口号)定义为不可重新使用。这样可以确保新老连接分开来,避免混淆。(当一个连接处于2MSL等待状态时,任何延迟到达的报文段都将被丢弃。)

实际事况中,客户端通常主动关闭连接进入TIME_WAIT状态,服务器通常执行被动关闭操作并且不会直接进入TIME_WAIT状态。于是当终止一个客户端后立刻重新启动同一客户端时,新的客户端也不能重新使用相同的本地端口号,此时由操作系统分配临时端口号。服务器端通常使用一些知名的端口。如果其主动关闭连接,又立即尝试重新启动它。这时服务器该端号还处于TIME_WAIT状态,不能为该程序的通信端分配对应的端口号(服务器将会收到一个“地址已占用”的绑定错误)。

4、重置报文段(RST报文)

一般而言,当发现一个到达的报文端对于相关连接而言是不正确的时,tcp就发送一个重置报文段。重置报文段通常会导致tcp连接的快速拆卸。

以下是发送RST报文段的应用场景举例:

i、针对不存在端口的连接请求

UDP协议规定,当一个数据报到达一个不能使用的目的端口时就会生成一个ICMP目的地不可达(端口不可达)的消息。

TCP协议则规定,使用重置报文段来代替完成相关工作。

ii、终止一条连接

正常终止连接的方法是通过发FIN报文,也称有序释放。因为FIN是在之前所有排队数据都已发送后才被发送出去,通常不会出现丢失数据的情况。

然而任何时刻,都可以通过发送一个重置报文段替代FIN来终止一条连接,也称为终止释放。其有两大特性:一、任何排队的数据都将被抛弃,一个重置报文段会被立即发送出去;二、重置报文段的接收方会解释为通信另一端采用了终止的方式而不是一次正常关闭。

iii、半开连接(此处的半开连接是指不正常的关闭一端,对端不知情哈)

所谓半开连接:另一端B关闭或终止连接,却未告知本端A的连接状态。

这种连接下,A端发送请求报文至B端时,B端由于不认识A端发来的请求报文而会回复RST报文给A端。而A端收到RST报文时,便清楚B端已将此次连接断开,从而A端也释放该半连接。

iv、时间等待错误

当客户端处于TIME_WAIT状态时,收到了上次连接中极度延迟的报文,或是更加特殊的RST报文段。见下图。

5、与tcp连接管理相关的攻击

i、SYN泛洪:一个或多个恶意的客户端产生一系列tcp连接尝试,并将它们发送给一台服务器,它们通常采用“伪造”的源IP地址。服务器会为每一条连接分配一定数量的连接资源。由于连接尚未完全建立,服务器为了维护大量的半打开连接会在耗尽自身内存后拒绝为后续的合法连接请求服务。

ii、与路径最大传输单元发现过程相关。攻击者伪造一个ICMP PTB(packet too big)消息。该消息包含了一个非常小的MTU值。这样就迫使受害tcp尝试采用非常小的数据包来填充数据,从而大大降低了它的性能。

iii、此类攻击及破坏现有的TCP连接,甚至可能将其劫持。此类攻击通常包含的第一步是使两个之前正在通信的tcp节点“失去同步”。这样它们将使用不正确的序列号。

iv、欺骗攻击,所涉及的tcp报文段是由攻击者精心定制的,目的在于破坏或改变现有tcp连接的行为。攻击者可以生成一个伪造的RST报文段并将其发送给一个tcp通信节点。假定与连接相关的4元组以及校验和都是正确的,序列号也处在正确的范围。这样就会造成连接的任意一端失败。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值