wireshark抓包为:(wireshark会将seq序号和ACK自动显示为相对值)
1)主机A发送标志syn=1,随机产生seq =1234567的数据包到服务器,主机B由syn=1知道,A要求创建链接; 此时状态A为SYN_SENT,B为LISTEN
2)主机B收到请求后要确认链接信息,向A发送ack =(主机A的seq+1),标志syn=1,ack=1,随机产生seq=7654321的包, 此时状态A为ESTABLISHED,B为SYN_RCVD
3)主机A收到后检查ack 是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack =(主机B的seq+1),标志ack=1,主机B收到后确认seq值与ack=1则链接创建成功。 此时A、B状态都变为ESTABLISHED
linux
断开链接过程与创建链接相似
1)主机A发送位码为FIN=1,用来关闭客户A到服务器B的数据传送。此时A的状态为FIN_WAIT_1
2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。此时A为FIN_WAIT_2,B为CLOSE_WAIT
3)服务器B关闭与客户端A的链接,发送一个FIN给客户端A。此时A为TIME_WAIT,B为LAST_ACK
4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。此时A、B都关闭了,状态变为CLOSED。
当(2)、(3)步中的ACK和FIN在一个包中发送时,A的状态会直接从FIN_WAIT_1变为TIME_WAIT
安全
由于每一个方向都须要一个FIN和ACK,当一端发送了FIN包以后,处于半关闭状态,此时仍然能够接收数据包。
在创建链接时,服务器能够把SYN和ACK放在一个包中发送。
可是在断开链接时,若是一端收到FIN包,但此时仍有数据未发送完,此时就须要先向对端回复FIN包的ACK。等到将剩下的数据都发送完以后,再向对端发送FIN,断开这个方向的链接。
所以不少时候FIN和ACK须要在两个数据包中发送,所以须要四次握手
服务器
持续时间未2MSL,一个数据包在网络中的最长生存时间为MSL。
假设最后客户端回复的ACK丢失,服务器端会在超时时间到来时,重传最后一个FIN包。
ACK和FIN在网络中的最长生存时间就为2MSL,这样就能够可靠的断开TCP的双向链接。
cookie
TCP首部选项字段多达40B,一些经常使用的字段有:
1)选项结束字段(EOP,0x00),占1B,一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处
2)无操做字段(NOP, 0x01),占1B,也用于填充,放在选项的开头
3)MSS(最大报文段长度),格式以下:种类(1B,值为2),长度(1B,值为4),数值(2B)
用于在链接开始时肯定MSS的大小,若是没有肯定,就用默认的(通常实现是536B)
4)窗口扩大因子,格式以下:种类(1B,值为3),长度(1B,值为3),数值(1B)
新窗口值 = 首部窗口值 * 2的(扩大因子)次方
当通讯双方认为首部的窗口值还不够大的时候,在链接开始时用这个来定义更大的窗口。仅在链接开始时有效。一经定义,通讯过程当中没法更改。
5)时间戳(应用测试RTT和防止序号绕回)
6)容许SACK和SACK选项
网络
linux内核中会维护两个队列:
1)未完成队列:接收到一个SYN创建链接请求,处于SYN_RCVD状态
2)已完成队列:已完成TCP三次握手过程,处于ESTABLISHED状态
当有一个SYN到来请求创建链接时,就在未完成队列中新建一项。当三次握手过程完成后,就将套接口从未完成队列移动到已完成队列。
backlog曾被定义为两个队列的总和的最大值,也曾将backlog的1.5倍做为未完成队列的最大长度
通常将backlog指定为5
tcp
accept会监听已完成队列是否非空,当队列为空时,accept就会阻塞。当队列非空时,就从已完成队列中取出一项并返回。
而已完成队列中的都是三次握手过程已经完成的,所以accept发生在三次握手以后。
测试
1)假装的IP向服务器发送一个SYN请求创建链接,而后服务器向该IP回复SYN和ACK,可是找不到该IP对应的主机,当超时时服务器收不到ACK会重复发送。当大量的攻击者请求创建链接时,服务器就会存在大量未完成三次握手的链接,服务器主机backlog被耗尽而不能响应其它链接。即SYN泛洪攻击
防范措施:
一、下降SYN timeout时间,使得主机尽快释放半链接的占用
二、采用SYN cookie设置,若是短期内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文
三、在网关处设置过滤,拒绝将一个源IP地址不属于其来源子网的包进行更远的路由
2)当一个主机向服务器发送SYN请求链接,服务器回复ACK和SYN后,攻击者截获ACK和SYN。而后假装成原始主机继续与服务器进行通讯。
spa