這兩天還是再調tcp,網上的資料也不全,大多是關于tcp握手連接的東西,而且都說的是,所以只好摸索著來,首先,關于握手,各大資料都說是3次,握手,握手應答,應答,然后建立連接。對于握手連接的處理,有兩點,假設主動連接端為a端,被動連接端為b端,第一點是判斷這一幀的第48位,a端b主機發送0x02,b主機向a主機發送0x12,然后a主機在向b主機發送0x10,對于b端,首先要判斷來端是否為0x02如果是,則向a端的此位發送0x12,同時第二點就是序列號,將a的序列號加1以后,放在b端回應的應答號中去。回應的序列號中放入一個生成的序列號。序號的位置在38-41位,應答號的位置在42-45位。發送握手應答后,b只要在判斷其返回幀的第48位是否為0x10和應答號是否加一即可。若不對,丟包或者發送重傳即可。
當建立連接以后,就可以傳輸數據了,傳輸數據時,a向b傳輸應用數據的同時,在第48位發送的應該為0x12。然后加上序列號,在b端處理時需要注意兩個問題,1,每次發送數據都應該接收一個應答,2,收方的應答號,是發方的序列號加上數據個數。
我在調試的時候,就出現了問題,開始的時候,沒有做應答,結果上位機會連續發送多次數據。后來我添加了應答處理,序列號我是按照握手協議那么寫的,序列號只加1,結果發現上位機會一個一個的重傳。后來通過抓包軟件才發現,原來是b返回的應答號,應該是a的序列號,加上a所傳輸的數據。
解決了應答,剩下的就是數據提取了,提取應用數據首先要計算兩個相關數據,1,偏移,2,數據個數。偏移就是真實的應用數據在一幀的具體位置。只要知道了數據位置和個數,就可以獲取數據了。
應用數據偏移計算為 tcp源端口號的位置 + tcp頭長度
應用數據的長度計算為 ip總長度 - ip頭長度 - tcp頭長度
最后就是四次揮手,對此網上解釋也是亂七八糟的,也許是我的智力低下造成的不理解,但還是通過抓包軟件才看明白的。
首先是a端向b端發送0x11,然后b端發送應答返回0x10,發送應答后,繼續發送0x11。然后等待a端發送0x10這樣,即完成了揮手操作。
以下是抓包數據,可以給大家做個參考。
syn
a->b
0000 f0 7d 68 70 04 3c f0 7d 68 60 3b 42 08 00 45 00 .}hp.<.} h`;B..E.
0010 00 34 49 42 40 00 40 06 6d 64 c0 a8 01 69 c0 a8 .4IB@.@. md...i..
0020 01 64 08 89 ea 60 55 ff c5 b6 00 00 00 00 80 02 .d...`U. ........
0030 ff ff dc 5a 00 00 02 04 05 b4 01 03 03 00 01 01 ...Z.... ........
0040 04 02
syn ack
b->a
0000 f0 7d 68 60 3b 42 f0 7d 68 70 04 3c 08 00 45 00 .}h`;B.} hp.<..E.
0010 00 34 81 f7 40 00 40 06 34 af c0 a8 01 64 c0 a8 .4..@.@. 4....d..
0020 01 69 ea 60 08 89 a5 19 17 70 55 ff c5 b7 80 12 .i.`.... .pU.....
0030 44 70 db 4f 00 00 02 04 05 b4 01 03 03 00 01 01 Dp.O.... ........
0040 04 02
ack
a->b
0000 f0 7d 68 70 04 3c f0 7d 68 60 3b 42 08 00 45 00 .}hp.<.} h`;B..E.
0010 00 28 49 43 40 00 40 06 6d 6f c0 a8 01 69 c0 a8 .(IC@.@. mo...i..
0020 01 64 08 89 ea 60 55 ff c5 b7 a5 19 17 71 50 10 .d...`U. .....qP.
0030 ff ff 60 8b 00 00 ..`...
push ack(真實數據為 acsii的aa 55,可以注意一下第三行的 55 ff c5 b7)
a->b
0000 f0 7d 68 70 04 3c f0 7d 68 60 3b 42 08 00 45 00 .}hp.<.} h`;B..E.
0010 00 2c 49 45 40 00 40 06 6d 69 c0 a8 01 69 c0 a8 .,IE@.@. mi...i..
0020 01 64 08 89 ea 60 55 ff c5 b7 a5 19 17 71 50 18 .d...`U. .....qP.
0030 ff ff c9 e8 00 00 61 61 35 35 ......aa 55
ack (對于數據的應答,可以注意一下第三行的 55 ff c5 bb)
b->a
0000 f0 7d 68 60 3b 42 f0 7d 68 70 04 3c 08 00 45 00 .}h`;B.} hp.<..E.
0010 00 28 81 fa 40 00 40 06 34 b8 c0 a8 01 64 c0 a8 .(..@.@. 4....d..
0020 01 69 ea 60 08 89 a5 19 17 71 55 ff c5 bb 50 10 .i.`.... .qU...P.
0030 44 6c 1c 1b 00 00 Dl....
fin ack
a->b
0000 f0 7d 68 70 04 3c f0 7d 68 60 3b 42 08 00 45 00 .}hp.<.} h`;B..E.
0010 00 28 49 3f 40 00 40 06 6d 73 c0 a8 01 69 c0 a8 .(I?@.@. ms...i..
0020 01 64 08 88 ea 60 1d b0 ba ac 0f a9 ae ee 50 11 .d...`.. ......P.
0030 ff ff a1 d8 00 00 ......
ack
b->a
0000 f0 7d 68 60 3b 42 f0 7d 68 70 04 3c 08 00 45 00 .}h`;B.} hp.<..E.
0010 00 28 81 f4 40 00 40 06 34 be c0 a8 01 64 c0 a8 .(..@.@. 4....d..
0020 01 69 ea 60 08 88 0f a9 ae ee 1d b0 ba ad 50 10 .i.`.... ......P.
0030 44 70 5d 68 00 00 Dp]h..
fin ack
b->a
0000 f0 7d 68 60 3b 42 f0 7d 68 70 04 3c 08 00 45 00 .}h`;B.} hp.<..E.
0010 00 28 81 f5 40 00 40 06 34 bd c0 a8 01 64 c0 a8 .(..@.@. 4....d..
0020 01 69 ea 60 08 88 0f a9 ae ee 1d b0 ba ad 50 11 .i.`.... ......P.
0030 44 70 5d 67 00 00 Dp]g..
ack
a->b
0000 f0 7d 68 70 04 3c f0 7d 68 60 3b 42 08 00 45 00 .}hp.<.} h`;B..E.
0010 00 28 49 40 40 00 40 06 6d 72 c0 a8 01 69 c0 a8 .(I@@.@. mr...i..
0020 01 64 08 88 ea 60 1d b0 ba ad 0f a9 ae ef 50 10 .d...`.. ......P.
0030 ff ff a1 d7 00 00 ......