TCP连接如何处理客户端总负载大小?握手是否协商数据总大小?
TCP握手阶段是否协商用户数据总大小?
TCP握手(三次握手)阶段不会协商用户数据的总大小。
TCP是面向流的传输层协议,它的设计逻辑里没有要求在连接建立阶段提前告知后续要传输的全部数据量。三次握手的核心作用只有三个:确认通信双方的收发能力正常、同步双方的初始序列号、协商滑动窗口大小——这里的窗口是用于流量控制的动态值,指的是当前接收方一次能处理的字节数,和整个请求/响应的总数据量完全无关。
回到你用Go写的HTTP服务器场景:你实现的负载大小限制逻辑,本质是在**应用层(HTTP)**做的判断。客户端只有在TCP连接建立完成后,才会通过HTTP请求头里的Content-Length字段告知请求体总大小,或者用Transfer-Encoding: chunked的分块方式发送请求。你的服务器也是在接收到这些HTTP层面的信息后,才能判断请求负载是否超过阈值并执行拒绝逻辑。
如果客户端恶意不发送Content-Length也不用分块编码,你只能通过设置读取超时或者累计读取字节数的方式来限制,这同样是在TCP连接建立后的数据流处理阶段完成的,和握手阶段无关。
内容的提问来源于stack exchange,提问作者hani
相关产品推荐
相关产品推荐

