TinyWebServer icon indicating copy to clipboard operation
TinyWebServer copied to clipboard

一个腾讯面试问题--粘包怎么处理?

Open notdog1998 opened this issue 2 years ago • 5 comments

直接被问懵 下来之后看代码,所有从socekt中read的数据都是一个完整HTTP请求,在处理完请求体之后就process_write()了。 假设read时socket缓冲里存在>=2个http请求,那第二个http请求不就没法处理了?是不是这个项目就没法处理粘包情况?

notdog1998 avatar May 12 '22 08:05 notdog1998

这个项目是http协议不存在粘包,粘包是指tcp协议的上层应用层协议,没有分包操作,如果是tcp的开发的话,可以考虑自定义协议也可以直接成熟的pb,或者json

这个项目是http协议不存在粘包,粘包是指tcp协议的上层应用层协议,没有分包操作,如果是tcp的开发的话,可以考虑自定义协议也可以直接成熟的pb,或者json

一个缓冲区里的两个HTTP报文,这两个报文的确是不会粘一起(可以根据\r\n和content-length分成两个报文)。 但是如果按楼主说的,把第一个报文解析完,然后直接写响应报文,第二个没有处理,这个问题还是没解决。

loook98 avatar Jun 28 '22 11:06 loook98

这个项目是http协议不存在粘包,粘包是指tcp协议的上层应用层协议,没有分包操作,如果是tcp的开发的话,可以考虑自定义协议也可以直接成熟的pb,或者json

一个缓冲区里的两个HTTP报文,这两个报文的确是不会粘一起(可以根据\r\n和content-length分成两个报文)。 但是如果按楼主说的,把第一个报文解析完,然后直接写响应报文,第二个没有处理,这个问题还是没解决。

是不是因为HTTP/1.1不开管道网络传输的话,还是「请求-应答」式的,也就是说缓冲区里不会同时有2个请求报文?

loook98 avatar Jun 28 '22 11:06 loook98

我在知乎上看到一些答案说是HTTP协议根本不会有粘包现象,那是传输层的事吧。 链接

Monkey-D-Luffy-star avatar Jul 11 '22 13:07 Monkey-D-Luffy-star

更新一下,这里的“粘包”描述应该是错的。 面试官并没有说过“粘包”这个名词,是我自己错误地以为这就是传说中“粘包”(八股背魔怔了哈哈)。但是描述是没有错的,就是“HTTP[解析器]一次读socket操作获得的数据可能并不直接对应一个HTTP message”这种现象。 至于回答,大家可以移步楼上老哥贴出来的知乎链接,那个帖子的讨论应该是我看过最好的。 问题就不edit了,留着这错误提醒自己,也提醒大家不要混淆“粘包”这个名词。

notdog1998 avatar Jul 12 '22 02:07 notdog1998