首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器如何找到要发送到哪个客户端端口?

问服务器如何找到要发送到哪个客户端端口?
EN

Unix & Linux用户
提问于 2013-05-07 16:51:00
回答 4查看 86.2K关注 0票数 29

据我所知,当客户端发出连接请求时,会发生这样的情况:

  1. 服务器将绑定到特定的端口号。端口号总是绑定到侦听进程。因为只有服务器在监听传入的连接,所以我们不需要在客户端绑定
  2. 服务器将继续监听该端口号。
  3. 客户端将发送一个connect()请求。
  4. 服务器将使用accept()接受请求。一旦服务器接受客户端请求,内核将为服务器为进一步的send()和receive()分配一个随机端口号,因为服务器上的相同端口号不能用于发送和侦听,而且前面的端口仍在侦听新的连接。

在所有这些情况下,服务器如何发现客户端正在接收哪个端口?我知道客户端将发送带有源端口和目的端口的TCP段,因此服务器将使用该段的源端口作为其目的端口,但是服务器调用什么功能来查找该端口呢?是accept()吗?

EN

回答 4

Unix & Linux用户

回答已采纳

发布于 2013-05-07 17:06:16

它是TCP (或UDP等)的一部分。头,在包里。所以服务器会发现,因为客户端告诉它。这类似于它如何查找客户端的IP地址(这是IP报头的一部分)。

例如,每个TCP数据包都包括一个IP报头(至少包含源IP、目标IP和协议TCP )。然后有一个TCP报头(有源端口和目标端口,再加上更多)。

当内核接收到远程IP为10.11.12.13 (在IP报头中)和远程端口为12345 (在TCP报头中)的SYN数据包( TCP连接的启动)时,它就知道远程IP和端口。它发回一个SYN\ACK。如果它得到一个ACK,listen调用将返回一个新的套接字,为该连接设置。

TCP套接字由四个值(远程IP、本地IP、远程端口、本地端口)唯一标识。您可以有多个连接/套接字,只要其中至少有一个不同。

通常,本地端口和本地IP对于服务器进程的所有连接都是相同的(例如,到sshd的所有连接都在本地-ip:22上)。如果一台远程计算机进行多个连接,则每个远程计算机将使用不同的远程端口。因此,除了远程端口之外,一切都是一样的,但这很好--只有四个端口中的一个不同。

您可以使用,例如,线,以查看包,它将为您标记所有的数据。下面是突出显示的源端口(注意,它在解码的数据包中突出显示,以及底部的十六进制转储):

票数 35
EN

Unix & Linux用户

发布于 2013-05-07 17:06:07

"connect请求(客户端程序的connect()系统调用,通常是)导致一个三通握手。第一个包的3路握手(从客户端到服务器)有SYN标志集,并包括客户端程序的内核分配给它的TCP端口号。

您可以在关于Nmap与天然SYN数据包的文章中看到这一点。Nmap SYN数据包解码的短语为“phrase e.60058> dest.22”。“合法的SYN数据包”解码中包含短语“SYN e.35970> dest.80”。这两个SYN数据包告诉远程内核,数据包分别来自TCP端口60058和端口35970。

票数 2
EN

Unix & Linux用户

发布于 2013-10-08 14:51:30

TCP套接字是面向流的套接字.两个套接字描述符(由您和您的对等方拥有)是可靠连接的。所以您不必担心客户端的端口--只需编写套接字描述符即可!

此外,如果您真的想知道这个(可能是为了日志记录),可以随意获取名称(2)。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/75011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档