tcpdump知识android
在深刻tcpdump以前,先贴一张tcp header的格式图,git
https://github.com/KristyToKristy/tcpheader/blob/master/tcpheader.png
github
TCP Flags(tcp header的第十四个字节)网络
flags位于tcpheader的第十四个字节,包含8个比特位。这8个比特位都有特色的功能用途,分别是:CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。tcp
CWR,ECE:两个flag用来配合congestion control的,通常状况下和应用层的关系不大。发送包ECE为0时表示出现了congestion,接收方回的包里CWR为1代表收到congestion信息并作了处理。ide
URG 表明Urgent,代表包的优先级高,须要优先传送对方并处理。像咱们平时使用terminal的时候常常ctrl+c来结束某个任务,这种命令产生的网络数据包就须要urgent。优化
ACK 也就是咱们所熟悉的ack包,用来告诉对方上一个数据包已经成功收到。不过通常不会为了ack单独发送一个包,都是在下一个要发送的packet里设置ack位,这属于tcp的优化机制spa
PSH Push咱们上面解释过,接收方接收到P位的flag包须要立刻将包交给应用层处理,通常咱们在http request的最后一个包里都能看到P位被设置server
RST Reset位,代表packet的发送方立刻就要断开当前链接了。在http请求结束的时候通常能够看到一个数据包设置了RST位blog
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包后也断开链接了。