tcp协议中所有定时器。超时一词在软件领域用途非常广泛,是解决的很多问题利器。TCP设计精髓在于他自我管理的状态机,而要想状态机正常运行,超时必不可少,如connect flood攻击。
建立连接定时器
开始
TCP属于可靠连接,需要经历三次握手。
如上图所示,主要分为以下过程:
- 第一步:服务器准备好接受外来的连接。通常通过调用socket、bind和listen三个函数来完成,称之为被动打开(passive open)
- 第二步:客户端通过connect发起主动连接(active open)。导致客户端TCP发送一个SYN同步分节。一般SYN分节不携带数据,其所在的IP数据报只包含一个IP首部、一个TCP首部以及TCP选项(最为常见的是MSS分节,在这里并没有画出)
- 第三步:服务器确认客户的SYN,同时自己也发送一个SYN分节。服务器在单个分节中发送SYN和对客户端SYN的ACK确认。此时客户端已经处于ESTABLISHED状态
- 第四步:客户端必须确认服务端的SYN分节。确认成功,此时服务端也进入ESTABLISHED状态。
思考:在握手过程中如果有一方因为网络抖动或者中间路由丢弃,导致不能及时给对方回复,此时怎么办呢?
下图为正常的tcp三次握手抓包图
其中No对应列表的序号.
环境查看
结果分析
在这里有可能会出现两种情况超时
- 第一种:当TCP客户端发出请求没有收到SYN分节响应时,则会返回ETIMEOUT。即,调用connect函数时,内核会发送一个SYN分节,若无响应则等待6s再发送一个,若仍无响应则等待24s再发送一个。若总共等待75s(4.4BSD规定75s)后仍未收到响应则返回本错误。注意,不同系统对时间值的设置不相同。
- 第二种:当客户发出的SYN在中间的某个路由器上引发“destination unreachable”(目的地不可达)的ICMP错误时,则认为是一种软错误,不会终止。客户主机内核会保存该消息,并按照上述第一种情况来间接性继续发送SYN。在某个规定的时间(4.4BSD规定75s)后仍未收到响应,则把保存的消息(即ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给进程。
实验验证
- 系统:centos6.5
- 命令
1
2
3
- 实验结果
总时间为63s,这个时间还是难以忍受的,想想如果一个食堂因为你一个人等了1分多钟,估计你会被打shi
- 抓包: tcpdump -i lo ‘tcp[tcpflags] = tcp-syn’