tcpdump知识
在深入tcpdump之前,先贴一张tcp header的格式图,
https://github.com/KristyToKristy/tcpheader/blob/master/tcpheader.png
TCP Flags(tcp header的第十四个字节)
flags位于tcpheader的第十四个字节,包含8个比特位。这8个比特位都有特点的功能用途,分别是:CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。
CWR,ECE:两个flag用来配合congestion control的,一般情况下和应用层的关系不大。发送包ECE为0时表示出现了congestion,接收方回的包里CWR为1表明收到congestion信息并做了处理。
URG 代表Urgent,表明包的优先级高,需要优先传送对方并处理。像我们平时使用terminal的时候经常ctrl+c来结束某个任务,这种命令产生的网络数据包就需要urgent。
ACK 也就是我们所熟悉的ack包,用来告诉对方上一个数据包已经成功收到。不过一般不会为了ack单独发送一个包,都是在下一个要发送的packet里设置ack位,这属于tcp的优化机制
PSH Push我们上面解释过,接收方接收到P位的flag包需要马上将包交给应用层处理,一般我们在http request的最后一个包里都能看到P位被设置
RST Reset位,表明packet的发送方马上就要断开当前连接了。在http请求结束的时候一般可以看到一个数据包设置了RST位
SYN SYN位在发送建立连接请求的时候会设置,我们所熟悉的tcp三次握手就是syn和ack位的配合:syn->syn+ack->ack。
SYN SYN位在发送建立连接请求的时候会设置,我们所熟悉的tcp三次握手就是syn和ack位的配合:syn->syn+ack->ack。
这8个flag首字母分别是:C E U A P R S F。初看难以记忆,我脑洞了下,把它们组合成 supr cafe,当然少了super少了个e,我可以将就下。我们在使用tcpdump的时候会经常看到这几个flag,[S],[P],[R],[F],[.]。其他几个都好理解,[.]特殊点,是个占位符,没有其他flag被设置的时候就显示这个占位符,一般表示ack。
用tcpdump分析http完整请求
知乎APP点赞之后发送的一个http请求tcpdump命令是:
sudo tcpdump -i rvi0 -AAl src 60.28.215.123 or dst 60.28.215.123
图中列出了前面的packet。
10.29.44.240是android的ip地址60.28.215.123是知乎server的ip地址红色方框内是android发出的packet,白色方框内是server发出的packet。packet1是android三次握手的第一个syn包,packet2是server ack+syn的包,packet3是android ack的包。这3个packet之后tcp的三次握手就完成了。packet4是android发出的http request。长度只有240个字节,所以一个packet就发过去了,当然还设置了flags的P位,request需要马上被应用层处理。包里面出现了spdy,点赞。packet5是server ack刚收到的包,长度位0,所以这仅仅是一个ack包。
packet6是server返回http的response了,1388个字节。packet5和packet6都ack了seq为241的包,当然是为了增加ack的成功率。
最后两个packet,android发送FIN+ACK的包就断开连接了,server直接发送RST包后也断开连接了。
原文地址:http://10798301.blog.51cto.com/10788301/1842859