http post请求发两个tcp包后续

离上次讨论http的post请求已经过去很久,貌似还有同学对于是不是会发送两个包感兴趣,所以这里补充一些内容。

上次已经说到,大多数http post请求,都是一个tcp包发出去的,也就是不存在所谓的先发一个头,然后发body的。

但是我没抓到不代表就没有,毕竟人家还因为ruby的http post请求发多个包导致了明显的延迟,所以到底有没有这样的事情呢?既然人家说了,ruby有,我就拿ruby来测试就好啦。

我们看下面的ruby代码:

require 'net/http'

uri = URI("http://127.0.0.1:8080")
req = Net::HTTP::Post.new(uri.to_s)
req.body = '{
    "method":<method>,
}'  # `to_json` can be used
req["content-type"] = "application/json"
Net::HTTP.start(uri.host, uri.port, :use_ssl => false) do |http|
  p response = http.request(req)
  end

很简单,就是连上本地的8080,然后发一个http请求。由于懒得写一个http服务器,我直接用nc弄了一个假的服务器(反正发请求包的时候,对面是不是能响应http请求也不是很重要)

➜  ~ ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]
➜  ~ nc -l 8080

然后wireshark抓个包。

哎哟,有意思了,看第12个包的内容,就是http的头,然后第14个包的内容,就是body的内容,而且两个包都没有达到tcp包的上限,所以也就不存在因为包太大需要分包的问题。

可见,确实有那么一些程序,会做先发http头再发body的蛋疼的事情。

但是为何这个结论让人感到奇怪呢?因为到底发多少个tcp包,不是http协议的事情,是操作系统tcp协议栈和框架代码里write调用的事情

反正http协议就是简单的文本请求,我非得header和body分两个write调用来发送, http服务器也不会说什么,毕竟tcp协议是流协议,不管你是几个包发过来的,上层都得按照流来处理。如果这个结论成立,那其实可以进一步推广,可能存在那么一种搓的不行的客户端,一个byte一个byte地发http请求,是不是我们以后就要说http的POST请求效率极低了?http POST请求:“怪我咯?”

结论

大多数框架都是尽量在一个tcp包里面把HTTP请求发出去的,但是也确实存在先发HTTP头,然后发body的框架。但是具体发多少个TCP包,这个是代码的问题,是tcp协议栈的问题,跟HTTP没关系。

猜你喜欢

转载自blog.csdn.net/zerooffdate/article/details/81513717