作者:车小胖
链接:https://www.zhihu.com/question/34400902/answer/191928024
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
TCP是一个有状态协议,A与B之间有一个TCP连接,C想搞破坏,于是想伪造A的IP给B发一个Reset,要分两种情景:情景一:C处于A与B之间流量的路径上C可以捕获到A、B的IP包,伪造是小菜一碟,比如大防火墙reset用户连接情景二:C不在A与B之间流量的路径上C可以在世界的任何角落,伪造一个合法TCP报文,最关键是TCP字段里的sequence number 、acknowledged number,只要这两项位于接收者滑动窗口内,就是合法的,对方可以接收并Reset A、B之间的TCP连接。而TCP握手采用随机序列号(不完全随机,而是随着时间流逝而线性增长,到了2^32尽头再回滚),为的就是让攻击者更难以猜测sequence number,因为伪造的sequence number不在合法范围内,而被接收方丢弃,增加安全性。至于加一,不知道你说的是SYN标志位占据sequence的一个序号,还是对方确认加一?如果是前者,那是因为SYN是建立连接的关键字段,而为了确保对方接收到,使用超时重传机制,TCP规定,只为有数据的TCP报文重传,SYN占据一个序号(可以认为只有一个字节数据的报文),所以TCP会重传SYN报文。如果是后者,对方接收到数据,比如sequence number = 1000,TCP Payload = 1000,数据第一个字节编号为1000,最后一个为1999对方会回应一个确认报文,确认号为2000,意味着编号2000前的字节接收完成,准备接收编号为2000及更多的数据。这里的加一表现为 1999 + 1 = 2000。
暂时还是没搞太清楚,以后再说。