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/应用层如何识别目的端口号?的主要内容,如果未能解决你的问题,请参考以下文章

UDP协议

TCP和UDP 三次握手,四次挥手

TCP/UDP端口号常见的

网络编程TCP/UDP协议(传输层特性)

TCP三次握手四次挥手

TCP报头解释