对于握手连接的处理,有两点,假设主动连接端为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 ......