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

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

一:何为端口?

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

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

二:如何绑定端口?

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

	#include <sys/socket.h>
	
	int socket(int domain, int type, int protocol);

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

在这里插入图片描述

	#include <sys/socket.h>

    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和端口也是可以绑定成功的。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值