我正在学习套接字编程,一些问题浮现在我的脑海里。这些是一些初学者级别的疑问
对于特定应用程序,是否必须使用众所周知的端口?例如,如果我使用 SSL,我可以设计一个服务器来监听 1000 而不是 443 吗?
对于 http,我们从其他任意端口连接到端口 80。为什么没有端口 80 到端口 80 的通信。
服务器如何响应从不同端口到其端口 80 的连接。
一个特定的连接有多少个可能
答案1
- 不,这不是强制性的,但有些应用程序默认会期望这种行为(它使应用程序更加可用,因为您不需要明确指定端口)。例如,当您浏览网站 example.com 时,您不需要指定端口,因为默认端口是 80。如果您想连接到另一个端口上的 Web 服务器,则需要明确说明该端口。有时人们会故意更改端口,例如 SSH 端口 22,以减少互联网背景噪音的干扰。
- 您没有理由想要这样做,假设您在端口 80 上运行 Web 服务器并想要浏览网站,您将无法这样做,因为另一个服务正在使用该端口。正如我在 1 中所说,端口只是在那里,所以当您想要连接到服务时,您不需要指定它们,除非该服务在非默认端口上运行。
- 这取决于端口 80 上正在监听的内容,Web 服务器将使用 HTTP 协议进行响应。如果出于某种原因您在该端口上运行 SSH,它将使用 SSH 进行响应。
- 但是,特定端口没有限制。但并发连接数有限制,通常受内核支持的文件描述符数限制(例如 2048)。(堆栈溢出)
答案2
1 - 这只是关于“标准”。默认情况下,如果您指定 https,您的浏览器将到达端口 443,如果指定 http,则到达端口 80。您可以根据自己的具体用途做任何您想做的事情,但您需要像这样指定您的自定义端口:some.place.to.go:1000 您可以将“保留和众所周知的”端口 (0-1023) 用于相应的服务,但如果您需要/想要使用其他端口,则由您决定...请记住,您有超过 65k 个端口 :)
2- 因为端口 <1024 被保留,不能用于发起连接
3- 我们讨论的是 TCP 连接... 在特定机器上,端口号与机器的 IP 地址相结合称为套接字。客户端和服务器上的 IP 和端口组合称为四元组。这四元组唯一地标识一个连接。因此,服务器可以与许多客户端通信,因为每个客户端都与服务器建立了唯一的连接才能与其通信。
例如:客户端 (cli) 从客户端端口 (5432) 到服务器端口 (80) 连接到服务器 (srv) cli:5432 -> srv:80
服务器将在相同的客户端端口上响应客户端:srv:80 -> cli:5432 等等...
因此,对于问题 2): - 假设在客户端有一个 http 服务器正在运行,“本地”端口 80 已被使用。 - 假设路由器后面有多个客户端(只有 1 个 IP...),多少个客户端可以使用相同的原始端口?
如果连接是从端口 80 建立的而不是从任意端口建立的,则这两种情况都不会起作用。这就是为什么我们需要使用任意端口来发起请求!
4- 从一个 IP 到全世界,最大 65535(因为您只能绑定 65k 个套接字...因为您只有 65k 个端口)
如果你想进一步了解这一点,我鼓励你阅读这些内容:
http://en.wikipedia.org/wiki/Internet_protocol_suite(以及相关文章……)