TCP的SYN報文可以攜帶payload嗎?

2021-10-09 09:14:59 字數 1847 閱讀 7100

對於敲門服務,是不是厭倦了複雜繁瑣的服務端配置?

send tcp syn packet with payload?

眾所周知,tcp的syn報文是不能攜帶payload的,因為:

等等,等等…

煩透了!在過程中,我非常討厭去討論標準,討厭有人在耳旁叨叨類似「rfc規定…但沒有強制…」,「intel手冊***…但是…」,正如「c語言未初始化的變數到底是多少」這個問題一樣無趣。

實際動手試一下不就好了嗎?

請看客戶端為syn報文增加裸資料的**:

#include

#include

#include

#include

int port =22;

module_param

(port,

int,

0644);

char

*templ =

null

;module_param

(templ, charp,0)

;unsigned

intknock_out_hook

(void

*priv,

struct sk_buff *skb,

const

struct nf_hook_state *state)

return nf_accept;

}static

struct nf_hook_ops knock_out_ops =

;static

int __init knock_init

(void

)return0;

}static

void __exit knock_exit

(void

)module_init

(knock_init)

;module_exit

(knock_exit)

;module_license

("gpl"

);

ok,來來來,讓我們試一下。首先在客戶端載入上述**編譯成的模組:

insmod ./padding.ko port=22 templ=

"zhejiang_wenzhou_skinshoe_wet_rain_flooding_water_will_not_fat"

然後你會發現從這台客戶端發起的ssh連線是通的:

赫然的「浙江溫州皮鞋溼,下雨進水不會胖」被padding到了後面,哦,顯然這句話的英文是不對的,正確的翻譯應該是「zhejiang wenzhou skinshoe wet,down rain in water not can fat!」

同樣,找乙個win7系統作為服務端,去telnet它的5357埠,依然是通的:

所以,不管標準是怎樣的,可以猜測,在大多數情況下,這麼玩是ok的。

也許又有人懟了:

我不需要保證,我甚至不需要這些資料對tcp本身有用。但它還是有用的:

是不是每乙個純ack報文均可以攜帶這麼一段padding上去的資料呢?一方面這種資料不需要可靠按序到達,另一方面它確實可以作為帶外資料存在。答案顯然是肯定的。

不要為了捍衛標準而捍衛標準,那是學界的事,工程永遠都是實用主義優先。

浙江溫州皮鞋溼,下雨進水不會胖。

TCP的SYN佇列和Accept佇列

首先我們必須明白,處於 listening 狀態的tcp socket,有兩個獨立的佇列 這兩個術語有時也被稱為 reqsk queue ack backlog listen backlog 甚至 tcp backlog 但是這篇文章中我們使用上面兩個術語以免造成混淆。syn佇列儲存了收到syn包的...

TCP報文的首部格式

tcp 長度不一 tcp 協議是能夠實現資料的分段傳輸,流量控制,可靠傳輸,擁幫浦控制等功能,因此tcp報文的首部要比udp的報文首部欄位要多,並且首部長度不固定。2個位元組所能表達的數 65536 埠號範圍是0 65535.2 16 65536 tcp的分用功能是通過埠實現的。4 8 32.資料偏...

初步認識TCP協議 TCP的reset報文

當本次tcp接收到不正確的tcp報文 即埠號與ip位址為本機,但對方的ip位址本機不認識,或是對應埠上沒有tcp連線 時,會傳送reset報文通知對方放棄連線。tcp連線是通過socket對來標識連線的 即本機與對方的ip位址加埠號 傳送rst包關閉連線時,不必等緩衝區的包都發出去,直接就丟棄緩衝區...