缘起:
使用php的file_get_contents(…) 函数从广州发送一个http请求到北京,该请求的请求头和响应头如下:
1 2 3 4 5 6 7 8 9 10 |
GET / HTTP/1.1 Host: phpor.net HTTP/1.1 200 OK Date: Fri, 11 Jan 2013 11:11:19 GMT Server: Apache Content-Length: 5 Connection: close hello |
现在,从广州到北京的一次数据的往返时间(就是ping的时间)为34ms,请求的执行时间为6ms; 因为请求头和相应头都非常小,分别一次tcp数据包就够,这样的话,一次http请求时间为: 34 + 34 + 6 = 74ms , 而实际却稳定在108ms左右,还有大约34ms不知去向
分析
根据这个丢失的时间长度来看,大概是多了一次数据的发送和接收; 通过tcpdump抓包发现如下现象:
file_get_contents(…)中实现的http请求,首先把请求行发送出去,收到请求行数据包的ack包后继续发送后续的请求头; 这样的话就凭空多出一次网络时间,其各种原因,有时间再看看PHP源码中为何如此实现吧。
测试了一下curl,没有这个问题。