作者:車小胖
鏈接:https://www.zhihu.com/question/34400902/answer/191928024
來源:知乎
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。
TCP是一個有狀態(tài)協(xié)議,A與B之間有一個TCP連接,C想搞破壞,于是想偽造A的IP給B發(fā)一個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標志位占據(jù)sequence的一個序號,還是對方確認加一?如果是前者,那是因為SYN是建立連接的關鍵字段,而為了確保對方接收到,使用超時重傳機制,TCP規(guī)定,只為有數(shù)據(jù)的TCP報文重傳,SYN占據(jù)一個序號(可以認為只有一個字節(jié)數(shù)據(jù)的報文),所以TCP會重傳SYN報文。如果是后者,對方接收到數(shù)據(jù),比如sequence number = 1000,TCP Payload = 1000,數(shù)據(jù)第一個字節(jié)編號為1000,最后一個為1999對方會回應一個確認報文,確認號為2000,意味著編號2000前的字節(jié)接收完成,準備接收編號為2000及更多的數(shù)據(jù)。這里的加一表現(xiàn)為 1999 + 1 = 2000。
暫時還是沒搞太清楚,以后再說。