前文介绍了TCP Fast Open的原理和使用,这次用tcpdump工具将TCP消息抓一下,看看是具体怎样实现的。
首先要了解一下IP报头和TCP报头的格式,这样才能根据协议对应报头内容:
接下来我们看一下第一次连接的时候的抓包内容:
抓包命令:
tcpdump -i lo tcp port 5555 -Xnn
SYN+空Cookie:
16:38:18.614264 IP 127.0.0.1.52868 > 127.0.0.1.5555: Flags [S], seq 2089549908, win 43690, options [mss 65495,sackOK,TS val 49428115 ecr 0,nop,wscale 7,tfo cookiereq,nop,nop], length 0
0x0000: 4500 0040 4:版本 | 5:IP报文长度,5*32=5*4字节=5*2个4位16进制=10个4位16进制 | 00服务类型 | 0040:总长度64个字节=32个4位16进制
36c7 4000 36c7:标识,IP报头的序列号 | 010:0未使用,1允许分段,0没有更多分段在传输 | 后面的0表示偏移,这里偏移是0
4006 05ef 40:生存时间 | 06:TCP协议 | 05ef:报头校验和
7f00 0001 7f00 0001:源IP地址7f.00.00.01=127.0.0.1
0x0010: 7f00 0001 7f00 0001:目的IP地址7f.00.00.01=127.0.0.1 | ***因为IP报头长度是10个4位16进制,所以到此,IP报头结束,下面是TCP报头
-------------------------------------------------------------------------------------------------------------------------------------------------------
ce84 15b3 ce84:源端口52868 | 15b3:目的端口5555
7c8c 0054 7c8c 0054:请求端序列号
0000 0000 0000 0000:请求端确认号0
0x0020: b002 aaaa b:数据偏移,TCP头部长度,10*32字节=10*2个4位16进制=20个4位16进制,刚好到结束,也就是该消息没有数据 | 保留6位0 |
000010:URG(0),ACK(0),PSH(0),RST(0),SYN(1),FIN(0) | aaaa:窗口43690
fe34 0000 fe34:校验和 | 0000:紧急指针
0204 ffd7 02:TCP选项,kind=2 最大报文段长度(MSS)选项 | 04:length=4 | ffd7:最大报文段长度65495(mss)
0402 080a 04:TCP选项,kind=4 选择性确认(Selective Acknowledgment,SACK)选项 | 02:length=2 |
08:TCP选项,kind=8 时间戳选项 | 0a:length=10 也就是后面8个字节都是属于这个选项的
0x0