TCP/应用层如何识别目的端口号?
Posted
技术标签:
【中文标题】TCP/应用层如何识别目的端口号?【英文标题】:How does TCP/Application layer identifies the destination port number? 【发布时间】:2013-06-30 02:08:47 【问题描述】:当应用层将数据发送到传输层传递给服务器时,它如何知道与哪个端口号通信?
确切地说,TCP报文段包含了目的端口号作为头部,它是如何确定的?
【问题讨论】:
【参考方案1】:必须告知应用程序。该端口是 etc/services 中列出的标准端口,在这种情况下 getaddrinfo()
API 会告诉您,或者它是通过应用程序的配置提供的, 或者硬连线到源代码中。
【讨论】:
【参考方案2】:应用程序在创建到服务器的套接字连接时建立端口号。套接字知道它绑定到哪个本地 IP/端口,以及它连接到哪个远程 IP/端口。只要使用该套接字发送数据,就会使用这些值。传输层知道将哪些值放入 IP 和 TCP 标头中。
【讨论】:
这正是我的问题。套接字如何知道它绑定到哪个远程端口? 是socket的一个属性。一旦套接字在本地绑定(bind()
或 accept()
),就可以随时使用getsockname()
检索本地 IP/端口。一旦建立连接(connect()
或accept()
),就可以随时使用getpeername()
检索远程IP/端口。只需将套接字视为包含各种行为字段的结构,可以通过各种套接字 API 函数对其进行访问/分配。该信息的实际存储是操作系统的实现细节。
再次,它将继续挖掘。确实,socket API 可以将目的端口号返回给应用程序,但是 API 究竟是如何获取的呢?是否像@EJP 提到的那样硬编码?
为了让套接字获得初始值,应用程序必须通过我前面提到的 API 函数告诉套接字它们是什么。然后套接字会记住它们并在与传输层交互时使用它们。
别误会我的话。我没有说端口号被硬编码到套接字 API 中。我说它可能被硬编码到 应用程序中, 作为几种替代方法之一。以上是关于TCP/应用层如何识别目的端口号?的主要内容,如果未能解决你的问题,请参考以下文章