【发布时间】:2015-05-11 06:59:44
【问题描述】:
我只是好奇服务器如何知道接收到的段是 UDP 还是 TCP 段,尤其是当侦听端口可以同时侦听 UDP 和 TCP 时。
我知道客户端可以使用SOCK_DGRAM生成UDP段,使用SOCK_STREAM生成TCP段,但是传输的段仍然是一堆比特。服务器如何知道它应该将这些位解释为 UDP 段还是 TCP 段?如果这些位是 UDP 段,但如果它们被解释为 TCP 段,却意外地表示“太奇怪”了怎么办?
【问题讨论】:
-
因为每个段总是以标题开头?
-
我不认为标题总是可以帮助区分类型。服务器很有可能将从第 32 位开始的 TCP 段的内容解释为“长度”、“校验和”和有效负载。除非客户端和服务器都同意 UDP 段必须以 100 个零开头,否则为 TCP 段。
-
@WanxinGao 这就是标头 的用途, 以及诸如端口号之类的其他内容。客户端和服务器不必就任何事情达成一致。数据由 UDP 或 TCP 套接字发送,并以相同的方式接收。问题是 kernel 中的 TCP/IP stack 是如何区分的,因此它知道是将其提供给 TCP 套接字还是 UDP 套接字。
标签: networking tcp udp