如何在写函数中启用 TCP PSH
标志,以便发送消息时不填充缓冲区?
如何在写函数中启用 TCP PSH
标志,以便发送消息时不填充缓冲区?
你现在已经看不到没有设置PSH标志的数据包了吗?这里的一些实验表明,tcpdump中的以下数据包:
00:00:47.633884 IP 90.155.34.205.52092 > 216.58.222.100.80: Flags [P.], seq 1:16, ack 1, win 29, options [nop,nop,TS val 35956508 ecr 2650150746], length 15: HTTP: GET / HTTP/1.0
E..CD.@.@...Z."..:.d.|.P......QM...........
.$.....ZGET / HTTP/1.0
从strace'ing netcat中可以看出,使用了非常简单乏味的write()函数。
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
setsockopt(3, SOL_SOCKET, SO_REUSEPORT, [1], 4) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("216.58.222.100")}, 16) = 0
write(3, "GET / HTTP/1.0\n", 15) = 15
在我看来,如果例如我传输的数据超过了单个段的容量,则 PSH 标志仅在该情况下取消设置,此时只有最后一个段将具有 PSH,表示现在还有更多的数据即将到来。