美文网首页编程实践指南禅与计算机程序设计艺术
【程序设计艺术】TCP和UDP为何可以共用同一端口

【程序设计艺术】TCP和UDP为何可以共用同一端口

作者: 光剑书架上的书 | 来源:发表于2020-11-04 19:33 被阅读0次

网络七层协议:

其中,传输层:

同一台机器的同一个端口只可以被一个进程使用,一般用于tcp,或者udp。那一个进程使用同一个端口同时监听tcp、udp请求,是否可以呢?

答案:可以。

端口可以形象地比喻成操作系统上的编号唯一的文件,应用程序和网络协议可以对其进行i/o操作。

但是既然唯一又为何tcp udp可以用相同的端口号呢?这样的话,程序在连接到端口时,怎么知道此时从该端口进来的数据是tcp的还是udp的呢?

是不是可以这样理解?端口的唯一性的标识不是端口号,而是端口号和协议名称的组合,应用程序和协议寻址时就是靠的这个组合?

使用netstat -an自己看看就知道了,IP数据包首部有个叫做协议的字段,指出了上层协议是TCP还是UDP还是其他P。
协议字段(报头检验和前面那个),其值为6,则为TCP;
其值为17,则为UDP。

[root@web ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:46997               0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0     64 10.0.0.7:22                 10.0.0.253:61752            ESTABLISHED 
tcp        0      0 :::3306                     :::*                        LISTEN      
tcp        0      0 :::111                      :::*                        LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 :::40566                    :::*                        LISTEN      
udp        0      0 127.0.0.1:967               0.0.0.0:*                               
udp        0      0 0.0.0.0:34398               0.0.0.0:*                               
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               
udp        0      0 0.0.0.0:944                 0.0.0.0:*                               
udp        0      0 :::111                      :::*                                    
udp        0      0 :::944                      :::*                                    
udp        0      0 :::19764                    :::*   

操作系统有能力根据接受的报文的IP字段里面的协议部分判断这个报文是什么报文。

就是说,系统读数据的时候还没有读到上层报文(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和端口也是可以绑定成功的。


Kotlin开发者社区 :

https://www.jianshu.com/c/498ebcfd27ad

相关文章

  • 【程序设计艺术】TCP和UDP为何可以共用同一端口

    网络七层协议: 其中,传输层: 同一台机器的同一个端口只可以被一个进程使用,一般用于tcp,或者udp。那一个进程...

  • TCP

    TCP和UDP端口可以重复 TCP/IP协议中端口,范围从0到65535 TCP和UDP的区别 TCP协议需要创建...

  • TCP 与 UDP

    TCP 与 UDP(主要说TCP)TCP/UDP端口号TCP/UDP端口号TCP连接的建立TCP连接的建立发送se...

  • TCP和UDP可以监听同一个端口

    同时监听的意思是同一时刻让tcp的某一端口和udp的同一数值的端口同时处于listening状态。有的网友说udp...

  • nginx负载均衡和http代理与tcp-udp代理

    nginx自1.9.0开始提供tcp/udp的反向代理功能 web负载和代理 tcp/udp端口代理

  • 【2019-08-13】linux常见的几种方法测试TCP/UD

    1.使用telnet工具可以测试TCP端口连通 2.使用nc工具测试TCP和UDP的连通性 3.nc测试是否可以开启端口

  • 趣谈网络协议听课笔记

    TCP/UDP处于运输层 UDP UDP报文比较简单:主要包含有源端口号和目的端口号。从而也看出UDP简单粗暴,只...

  • 传输层

    传输层的功能:传输层寻址和端口;无连接服务和面向连接服务 UDP协议:UDP数据报,UDP校验 TCP段:TCP连...

  • python面试题

    一、简述TCP和UDP的区别以及优缺点。 1、UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口...

  • nc:多功能网络工具

    nc:多功能网络工具 功能介绍 一个网络工具,可以建立TCP连接,发送UDP数据包。监听任意的TCP和UDP的端口...

网友评论

    本文标题:【程序设计艺术】TCP和UDP为何可以共用同一端口

    本文链接:https://www.haomeiwen.com/subject/gmxnvktx.html