2关于tcp delayedack实践(二)http
使用netty(五)http服务中的服务代码
tcpdump -i eth0 tcp and port 8990 -s 0 -w traffic.pcap
三次握手+http+四次挥手,应证了——[专项]tcp状态机,为什么3次握手(很好)(done)
可以看到,断开连接时,本例中ack与fin放在一起了
问题一:为啥本例的server ack立即返回了?
根据关于tcp delayedack实践,在连接初始建立的时候,按照上面描述会进入quick ACK模式,所以http短链接不会deleyed ack
我们用一个连接多次http请求试试看,使用safari(curl会切断连接,每次都新开一个tcp连接)
可以看到:
1)从第三次请求12开始,触发deleyed ack,跟在返回报文中了
2)客户端mac环境从第一次开始就有delayed ack. 40ms
3)这个多次http的例子可以看到完整的四次挥手,被动关闭方对fin先发一个ack,再发一个fin
问题二:ack能否被禁用nagle强制发送?
禁用nagle算法强制发送不适用于tcp层面自行发送的ack,仅适用于自己write的包
附件:
短链接1次请求-http.pcap.zip
长连接4次请求-n_http.pcap.zip
总结:
1 本文通过抓包,应证了http请求的三次握手4次挥手——[专项]tcp状态机,为什么3次握手(很好)(done)
2 验证了http短链接由于quickack而不会delayed ack
3 对于http长连接,几次请求后,服务端开启delayed ack,不再单独秒回ack,而是等待10ms与response一起返回