如何在TCP/IP协议栈中启用TCP PSH标志?

3

如何在写函数中启用 TCP PSH 标志,以便发送消息时不填充缓冲区?


你用什么编程语言?你可以在问题中添加一个标签,将使用的编程语言写上去,这样人们就能更容易地找到你的问题了。 - ByteWelder
谢谢。我正在学习C语言。 - G.Balamurugan
请查看此线程:https://dev59.com/sHRA5IYBdhLWcg3wtwSe - Oleksandr Kravchuk
有时候,使用UDP是很好的选择。它非常简单,但是你可以在应用层协议中获得更多的控制权(也需要更多的工作)。当然,这可能对你目前的工作来说不切实际。这里有一篇有趣的文章:https://1024monkeys.wordpress.com/2014/04/01/game-servers-udp-vs-tcp/ - Erik Alapää
另外需要注意的是,检查TCP ACK的方式因系统而异(例如,在Linux中读取TCP_INFO),但这只告诉您远程服务器已接收数据包,而不是用户应用程序已读取相应字节流中的所有内容。 - Erik Alapää
设置PSH标志是浪费时间。在接收端没有任何区别。 - user207421
1个回答

0

你现在已经看不到没有设置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,表示现在还有更多的数据即将到来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接