系统的TCP / IP堆栈如何区分连接到同一地址和端口的多个程序?

时间:2009-07-20 16:02:01

标签: tcp

假设有两个Web浏览器在同一台计算机上运行并且正在访问同一个网站(换句话说,在同一个端口上访问相同的IP地址)。

操作系统如何识别来自哪个程序的数据包?

每个程序在TCP标头中都有唯一的id字段吗?如果是这样,那个字段叫什么?

8 个答案:

答案 0 :(得分:36)

这两个程序实际上并没有访问“同一个端口”。出于TCP的目的,连接由元组定义(src_ip,src_port,dst_ip,dst_port)。

源端口通常是短暂的,这意味着它是由OS随机分配的。换句话说:

计划A将:

(my_ip,10000,your_ip,80)

计划B将:

(my_ip,10001,your_ip,80)

因此,操作系统可以看到它们是不同的“连接”,可以将数据包推送到正确的套接字对象。

答案 1 :(得分:4)

即使目标端口号相同,源端口号也会不同。内核会将源端口号与进程相关联。

答案 2 :(得分:3)

当客户端打开与目标端口80的连接时,它使用本地计算机上的任意未使用的端口,例如17824.然后,Web服务器响应该端口客户端通过向目的端口17824发送数据包。

第二个客户端将使用第二个未使用的端口号,例如17825,因此两个套接字的数据包不会混淆,因为它们将在客户端计算机上使用不同的端口号。

答案 3 :(得分:3)

克里斯托弗的回答是部分正确的。

程序A和B实际上具有存储在底层OS的套接字实现中的套接字描述符的句柄。数据包被传递到这个底层套接字,然后任何具有该套接字资源句柄的进程都可以读取或写入它。

例如,假设您在像Linux或Mac OSX这样的操作系统上编写一个简单的服务器。

您的服务器接受连接,此时连接由

组成
( src IP, src Port, dest IP, dest Port )

存在于底层OS套接字层中。然后分叉一个进程来处理连接 - 此时你现在有两个带有句柄句柄的进程,它们都可以读/写它。

通常(始终)原始服务器将关闭它对套接字的句柄并让分叉进程处理它。这有很多原因,但对于人们来说并不总是显而易见的原因是,当子进程完成它的工作并关闭套接字时,如果父进程仍然有一个打开的句柄,套接字将保持打开和连接。 / p>

答案 4 :(得分:2)

首先,“端口”只是一个数字。所有“与端口的连接”实际上代表的是一个在其“目标端口”头字段中指定了该数字的数据包。

现在,您的问题有两个答案,一个用于有状态协议,另一个用于无状态协议。

对于无状态协议(即UDP),没有问题,因为“连接”不存在 - 多个人可以将数据包发送到同一个端口,并且它们的数据包将以任何顺序到达。没有人处于“连通”状态。

对于有状态协议(如TCP),连接由4元组标识,包括源端口和目标端口以及源和目标IP地址。因此,如果两台不同的机器连接到第三台机器上的同一端口,则有两个不同的连接,因为源IP不同。如果同一台机器(或两台NAT后面或共享相同的IP地址)连接两次到一个远端,则连接由源端口(通常是随机的高编号端口)区分。

简单地说,如果我从客户端连接到同一个Web服务器两次,这两个连接将具有来自我的透视图的不同源端口和来自Web服务器的目标端口。因此,即使两个连接都具有相同的源和目标IP地址,也没有歧义。

端口是一种多路复用IP地址的方法,以便不同的应用程序可以侦听相同的IP地址/协议对。除非应用程序定义自己的更高级别协议,否则无法复用端口。如果使用相同协议的两个连接具有相同的源和目标IP以及相同的源和目标端口,则它们必须是相同的连接。

答案 5 :(得分:0)

port number

答案 6 :(得分:0)

IP地址用于识别计算机,端口用于识别计算机内的进程(应用程序)。当一个进程使用端口时,其他进程不能再使用它。因此,如果任何数据包被发送到该端口,则只有该端口的所有者才能处理该数据包。

答案 7 :(得分:0)

连接由一对端点标识。 - 端点表示(ip,端口)