tcp三次握手简介
tcp握手需要用到标识位里面的两种标识:SYN和ACK,以及报文中的seq序列号和ack确认号;
上面的ack确认号和ACK标识位是不同两种数据,下面小写的ack代表ack确认号,大写的ACK代表ACK标识位;
简单流程如下:
1. client随机产生一个seq数字,发送SYN请求到server;
2. server收到SYN请求,将ack置为收到的seq+1,并且随机产生一个seq,响应SYN+ACK;
3. client收到SYN+ACK请求,验证收到的ack是否为发出去的seq序列号+1,将ack置为收到的seq+1,响应ACK;
握手完成,开始传输数据;
tcpdump报文分析
下面是一段通过tcpdump命令监控到的tcp三次握手的报文;
# tcpdump -i eth1 -XSnnvv host 111.111.111.111 and port 80
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
18:55:12.923498 IP (tos 0x14, ttl 53, id 31105, offset 0, flags [DF], proto TCP (6), length 64)
111.111.111.111.50217 > 222.222.222.222.80: Flags [S], cksum 0x80e2 (correct), seq 277050658, win 65535, options [mss 1440,nop,wscale 5,nop,nop,TS val 784552069 ecr 0,sackOK,eol], length 0
0x0000: 4514 0040 7981 4000 3506 df5b b781 a72c E..@y.@.5..[...,
0x0010: 7929 14f0 c429 0050 1083 7522 0000 0000 y)...).P..u"....
0x0020: b002 ffff 80e2 0000 0204 05a0 0103 0305 ................
0x0030: 0101 080a 2ec3 5085 0000 0000 0402 0000 ......P.........
18:55:12.923538 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
222.222.222.222.80 > 111.111.111.111.50217: Flags [S.], cksum 0x2a16 (correct), seq 1517913223, ack 277050659, win 14480, options [mss 1460,sackOK,TS val 1268712571 ecr 784552069,nop,wscale 6], length 0
0x0000: 4500 003c 0000 4000 4006 4df5 7929 14f0 E..<..@[email protected])..
0x0010: b781 a72c 0050 c429 5a79 8487 1083 7523 ...,.P.)Zy....u#
0x0020: a012 3890 2a16 0000 0204 05b4 0402 080a ..8.*...........
0x0030: 4b9f 047b 2ec3 5085 0103 0306 K..{..P.....
18:55:12.936229 IP (tos 0x14, ttl 53, id 57168, offset 0, flags [DF], proto TCP (6), length 52)
111.111.111.111.50217 > 222.222.222.222.80: Flags [.], cksum 0x815d (correct), seq 277050659, ack 1517913224, win 4105, options [nop,nop,TS val 784552080 ecr 1268712571], length 0
0x0000: 4514 0034 df50 4000 3506 7998 b781 a72c [email protected]....,
0x0010: 7929 14f0 c429 0050 1083 7523 5a79 8488 y)...).P..u#Zy..
0x0020: 8010 1009 815d 0000 0101 080a 2ec3 5090 .....]........P.
0x0030: 4b9f 047b K..{
......
SYN:
黄色:数据包来源ip端口和目标ip端口;
红色:标识位 [S] = SYN;
蓝色:seq序列号,以及seq在16进制数据包中的位置;0x 1083 7522 = 277050658;
SYN+ACK:
黄色:数据包来源ip端口和目标ip端口;
红色:标识位 [S.] = SYN+ACK;
蓝色:seq序列号,以及seq在16进制数据包中的位置;随机产生:1517913223;
绿色:ack确认号,以及ack在16进制数据包中的位置;为SYN请求的 seq+1 = 277050658 + 1 = 277050659;
ACK:
黄色:数据包来源ip端口和目标ip端口;
红色:标识位 [.] = ACK;
蓝色:seq序列号,以及seq在16进制数据包中的位置;为SYN+ACK中的 ack = 277050659;
绿色:ack确认号,以及ack在16进制数据包中的位置;为SYN+ACK中的 seq+1 = 1517913223 + 1 = 1517913224;
wireshark的报文更加详细,可以更方便分析检测;