TCP 握手和端口号

Gui*_*ido 4 networking tcp

(我有一个关于 TCP 握手以及如何分配端口号的问题,如果这不属于这里,请告诉我。)

您好,我正在 Douglas Comer 所著的“Internetworking with TCP/IP”一书中学习 TCP/IP。在 TCP 章节中提到 TCP 将“端点”定义为一对(IP 地址、端口号),并且连接由两个端点定义。

这有一些含义,例如,本地 TCP 端口可以同时处于多个连接中,只要没有两个来自同一 IP 和同一远程端口。这也意味着建立的连接数量几乎是无限的(每个 IPv4 地址 2^16。总共 2^48)。

现在,在课堂上,我被告知当一个连接到侦听端口时,双方同意使用不同的端口,因此可以进行通信并且侦听器套接字保持空闲。这也是我看书之前的信念。

现在我觉得我显然应该相信这本书(它是 Comer!),但是其他解释有什么道理吗?

谢谢

joe*_*rty 5

不,另一个说法是不真实的。您可能误认为这是活动的 FTP。

http://slacksite.com/other/ftp.html


rnx*_*xrx 5

首先,基础知识 - 套接字是 (srcip, srcport, dstip, dstport) 的 4 元组。如果这些值中的任何一个发生变化,则是不同的套接字。当给定的主机打开一个 TCP(或 UDP,就此而言)套接字时,它的源 IP 是已知的,源端口是从临时范围(大于 1023 或 1024 - 忘记哪个)和目标 IP 和端口中随机选择的由调用进程提供给堆栈。

在服务器端,一个连接被建立并看到来自给定并绑定到 dstport 和 dstip 的 srcip 和 srcport。该条目(同样是一些 4 元组)保存在主机的连接表中,然后允许传入的数据包与适当的连接相关联。

TCP 握手是各个端的 TCP 堆栈协商序列号、窗口大小等参数的过程。到发生这种情况时,端口号已经确定。

再次 - 如果这些元组中的任何值在初始连接后发生变化,那么根据定义,数据包不再与原始套接字相关联。

在某些情况下,正在使用的应用程序(即 FTP、RPC)可能会指定其他端口号,但在所有情况下,这都需要建立一个单独的套接字,而不是对现有套接字重新编号。在 FTP 情况下,这将对应于来自主机 -> 服务器的端口 21(控制)上的初始连接,然后是端口 20(数据)上的后续连接 - 根据使用的模式,可以在任一方向设置. 不过,我再怎么强调也不为过,这构成了两个独立的套接字。回顾 OSI 堆栈,这在很大程度上是第 5 层问题。