TCP握手和端口号

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

嗨,我正在学习由道格拉斯·科默(Douglas Comer)撰写的“TCP / IPnetworking互联”一书中的TCP / IP。 在TCP章节中,它提到TCP将“端点”定义为一对(IP地址,端口号),并且连接由两个端点定义。

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

现在,在课堂上,我被告知,当一个人连接到一个监听端口时,双方都同意在一个不同的端口上使用,所以通信可以发生,而监听者sockets仍然是空闲的。 读这本书之前,这也是我的信念。

现在我觉得我应该明显地相信这本书(它是Comer!),但是对于其他的解释是否有任何事实?

谢谢

不,对方的说法是没有道理的。 你可能误以为是活跃的FTP。

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

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

在服务器端,build立了一个连接,看到来自srcip和srcport的绑定给dstport和dstip。 这个条目(再次 – 一些4元组)被保存在主机的连接表中,这将允许传入数据包与适当的连接相关联。

TCP握手是TCP堆栈在各方协商序列号,窗口大小等参数的过程。 到此为止,端口号已经确定。

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

在某些情况下,使用中的应用程序(如FTP,RPC)可能指定其他端口号,但在所有情况下,这需要build立一个单独的套接字,而不是现有的重新编号。 在FTP情况下,这将对应于来自主机 – >服务器的端口21(控制)上的初始连接,然后是端口20(数据)上的后续连接 – 取决于所使用的模式,可以在任一方向。 虽然我不能强调这是两个分开的sockets。 回到OSI堆栈,这将是一个第5层问题。

一个本地TCP端口可以同时连接多个连接

是的 – 为了让客户端find一个服务,那么它总是运行在服务器上的特定端口上–80为HTTP,25为SMTP,22为ssh …一个web服务器将有大量的客户端连接到它的端口80。

现在,在课堂上,我被告知,当一个人连接到一个聆听港时,双方都同意使用一个不同的港口

无论你还是你的老师都不明白发生了什么事情。 有一些协议,客户端和服务器会协商一个不同的套接字 – FTP数据连接,Oracle的sql * net的早期版本的rpc和(IIRC)的某些forms以这种方式工作 – 但是这是非常罕见的。

你的老师就是那个为了解问题而回答你的问题的人 – 我build议你回到他/她那里。

这绝对是服务器故障的主题,但你有一个可怕的误解,要求更正:-)

首先,你可能想把他们的Comer书放在一边,拿起一本TCP / IP Illustrated (Stevens) – 这主要是个人喜好,但是我认识的每个人都喜欢Stevens的书。

现在到你的问题的肉:

TCP将“端点”定义为一对(IP地址,端口号),连接由两个端点定义。

这在概念上是正确的。 实际上在协议层上发生的事情有点不同,但是TCP连接的概念是客户端(你的networking浏览器)打开一个本地套接字(10.0.0.1端口30000)并连接到服务器(10.10.10.10端口80)。
连接是这两个端点之间的通道。

现在,在课堂上,我被告知,当一个人连接到一个监听端口时,双方都同意在一个不同的端口上使用,所以可以进行通信,并且监听端口仍然是空闲的。

这是半正确的 – 这听起来像你试图描述的是在服务器上侦听的rendezvous socket行为的混淆版本。
正如你猜测的那样,如果我们只通过集合套接字进行通信,那么只有一台机器可以连接到一个给定的监听器(这是有用的),所以实际发生的是服务器accept() TCP连接在服务器端交付一个新的实际对话发生的连接套接字。
所有的血淋淋的细节,请参阅史蒂文斯的书,一个简短的描述尝试这个StackOverflow的问题 。


如果你想要一个小小的历史课, 这个video可能对你很有意思(这个链接的书签时间是在TCP开始讨论的地方,但是整个video或者三部分的系列,正在学习操作系统devise和/或networking的计算机科学应该留意)。