Wetts's blog

Stay Hungry, Stay Foolish.

0%

TCP、UDP绑定同一端口通信的解释

转自:https://www.cnblogs.com/MY0213/p/8798926.html

TCP、UDP 可以绑定同一端口来进行通信:

网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。

按照 OSI 七层协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP 协议提出了协议端口(protocol port,简称端口)的概念,用于标识通信的进程。

端口是一种抽象的软件结构(包括一些数据结构和 I/O 缓冲区)。应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。在 TCP/IP 协议的实现中,端口操作类似于一般的 I/O 操作,进程获取一个端口,相当于获取本地唯一的 I/O 文件,可以用一般的读写原语访问之。

类似于文件描述符,每个端口都拥有一个叫端口号(port number)的整数型标识符,用于区别不同端口。由于 TCP/IP 传输层的两个协议 TCP 和 UDP 是完全独立的两个软件模块,因此各自的端口号也相互独立,如 TCP 有一个 255 号端口,UDP也可以有一个 255 号端口,二者并不冲突。

端口号的分配是一个重要问题。有两种基本分配方式:第一种叫全局分配,这是一种集中控制方式,由一个公认的中央机构根据用户需要进行统一分配,并将结果公布于众。第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号,进程再通过合适的系统调用将自己与该端口号联系起来(绑扎)。TCP/IP 端口号的分配中综合了上述两种方式。TCP/IP 将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口(即周知口,well-known port),即使在不同机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP 和 UDP 均规定,小于 256 的端口号才能作保留端口。

再讨论一下,一个服务器监控一个端口,比如 80 端口,它为什么可以建立上成千上万的连接?

首先, 一个 TCP 连接需要由四元组来形成,即(src_ip、src_port、dst_ip、dst_port)。当一个连接请求过来的时候,服务端调用 accept 函数,新生成一个 socket,这个 socket 所占用的本地端口依然是 80 端口。由四元组就很容易分析到了,同一个(src_ip、src_port),它所对应的(dst_ip、dst_port)可以无穷变化,这样就可以建立很多个客户端的请求了。