服务器如何知道它收到的是UDP还是TCP数据段?

3
我对服务器如何知道接收到的分段是UDP还是TCP分段感到好奇,尤其是当监听端口可以同时监听UDP和TCP时。我知道客户端可以使用 SOCK_DGRAM 生成UDP分段,并使用 SOCK_STREAM 生成TCP分段,但是传输的分段仍然是一堆比特。服务器如何知道它应将这些比特解释为UDP分段还是TCP分段?如果这些比特是一个UDP分段,但意外地被解释为TCP分段,“太怪异”了该怎么办?

2
由于每个段落始终以标头开头? - Cyclonecode
我认为报头并不总是能够帮助区分类型。服务器很有可能将从第32位开始的TCP段内容解释为'长度'、'校验和'和有效载荷。除非客户端和服务器都同意,一个UDP段必须以100个零开头,否则就是一个TCP段。 - vincentvangaogh
@WanxinGao 这就是头部的作用之一,还有其他一些功能,比如端口号。客户端和服务器不需要在任何方面达成一致。数据通过UDP或TCP套接字发送,并以相同的方式接收。问题在于TCP/IP内核中的堆栈如何区分它们,以便知道是将其传递给TCP套接字还是UDP套接字。 - user207421
1个回答

3

首先它是一个IP 数据包,其中包含了IP头中的协议。在IP数据包内部有一个有效负载,其中包含TCP段或UDP 数据报。


1
哦,我明白了。根据维基百科,6代表TCP,17代表UDP。非常感谢! - vincentvangaogh

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