nginx 有支持http1.0 和http 1.1。
http1.0 协议是短连接,一般的服务器。一次通信后,连接会close。http 头的域 Connection:close
http1.1 协议对1.0作了扩展。 为了更好利用连接,http1.1 不会立马关闭连接,而是复用连接。
http 头的域 Content-length: 的作用是指定body 的大小。 但Content-length 并不是必须能的。
有两种方案可以解决读取body的问题
1. 对于http1.0 短连接,接写完http data 就close. 这样接受端就可以不用指定content-length。很多服务器回包的时候都这样,不用点http content-length域。
2.使用对于http1.1 有个更优的方案,使用域 Transfer-Encoding: chunked。 这种方式是将数据分段发送。
第二种方式对于大的数据发送,就非常好的。 chunked的模式有自己的格式。需要客户端或浏览器的支持。
上面两个方案偏向2个方面,各有优缺点。
短连接的方式非常明显,就是短连接本身。
chunked的理念先进,但是如果是你自己基于tcp解析http的话,解析chunked 的包会比较复杂。另外一个问题,假如在内网使用http 协议,我知道这个包的数据不会量不会很大。
我不需要chunked来发送。一个包就最很好。当然,这样的场景是你明白的你业务需求。而使用chunked模式的话,很有可能,这个包分head和body 两个包。
这时候,就需要一个折中的办法,既需要简单的解析http和一次性发包。
配合content-length的方法,nginx 提供了一个办法,出于性能的考虑,nginx会尽量使用长连接。
使用http1.0 协议版本,connnection:keep-alive 的方式发送请求,nginx 会以http1.1的方式回包,同时会hold住这个链接,connection:keep-alive
这非常适合自己写tcp 解析http协议的场景。简单又高效。