TCP和UDP为何可以共用同一端口

TCP和UDP为何可以共用同一端口

  • 一:何为端口?
  • 二:如何绑定端口?

一:何为端口?

从网络层的角度来看,它是不知道端口这个概念的,tcp\udp都是包裹在ip协议内的,ip协议只需要知道ip对应的硬件地址就可以把远端的网络包发送到目的主机上。

端口这个概念是由操作系统划分的。因为内核不可能把所有网络数据都发送给所有的进程,所以为了区分哪些数据该划分给哪些进程,便在传输层的协议中定义了端口。而tcp和udp协议中的端口号占位都是16位,所以操作系统能绑定的端口也就只有65535个。这也解释了为什么linux里设置单个进程所能打开的最大文件描述符数量最好设置为65535。关于文件描述符和端口又有什么关系,下面会进行说明。

二:如何绑定端口?

这里需要用c语言的系统函数去解释:

	#include 
	
	int socket(int domain, int type, int protocol);

这个函数用来创建socket套接字描述符也就是文件描述符。
其中type参数:
SOCK_STREAM —— TCP协议
SOCK_DGRAM —— UDP协议
SOCK_SEQPACKET —— ipx/spx协议
而返回的int值就是一个非负的文件描述符fd。linux内核中维护了一份文件描述符表,如下图,来存储文件描述符fd。

TCP和UDP为何可以共用同一端口_第1张图片

	#include 

    int bind(int socket, const struct sockaddr *address,socklen_t address_len);

这个函数用来绑定端口,socket参数就是fd,而sockaddr则是一个套接字地址结构。
sockaddr结构如下:

	sa_family_t    sin_family    /*描述是文件还是套接字*/
	in_port_t      sin_port      /*端口*/
	struct in_addr sin_addr      /*ip*/
	unsigned char  sin_zero[8]   /*sizeof(struct sockaddr)*/

可以看到linux是以协议、ip、端口来绑定端口的,所以不同协议相同的ip和端口也是可以绑定成功的。

你可能感兴趣的:(netty)