据我所知,当客户端发出连接请求时,会发生这样的情况:
connect()请求。accept()接受请求。一旦服务器接受客户端请求,内核将为服务器为进一步的send()和receive()分配一个随机端口号,因为服务器上的相同端口号不能用于发送和侦听,而且前面的端口仍在侦听新的连接。在所有这些情况下,服务器如何发现客户端正在接收哪个端口?我知道客户端将发送带有源端口和目的端口的TCP段,因此服务器将使用该段的源端口作为其目的端口,但是服务器调用什么功能来查找该端口呢?是accept()吗?
发布于 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上)。如果一台远程计算机进行多个连接,则每个远程计算机将使用不同的远程端口。因此,除了远程端口之外,一切都是一样的,但这很好--只有四个端口中的一个不同。
您可以使用,例如,线,以查看包,它将为您标记所有的数据。下面是突出显示的源端口(注意,它在解码的数据包中突出显示,以及底部的十六进制转储):

发布于 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。
发布于 2013-10-08 14:51:30
TCP套接字是面向流的套接字.两个套接字描述符(由您和您的对等方拥有)是可靠连接的。所以您不必担心客户端的端口--只需编写套接字描述符即可!
此外,如果您真的想知道这个(可能是为了日志记录),可以随意获取名称(2)。
https://unix.stackexchange.com/questions/75011
复制相似问题