`
nigelzeng
  • 浏览: 600198 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

昨日突然讨论起TCP与UDP是否可以在同一端口进行绑定,通信。

在印象当中我记得是可以的,今日google了相关资料,

确定以及肯定的:

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)可以无穷变化,这样就可以建立很多个客户端的请求了。

分享到:
评论

相关推荐

    python tcp udp server 绑定同一个端口

    tcp和udp可以绑定同一个端口。并且独立接收以及处理消息。rar包括3个文件,server端(通过threadpool启动tcp server和udp server),以及tcp client端、udp client端。

    TCP/UDP/IP/IPv6 异步通信调试工具

    集成IPv4和IPv6下的TCP/UDP通信调试工具 可绑定本地端口,全部由对应套接字编写,采用异步通信方式,有想学习套接字通信或者异步通信的童鞋来说应该有很大帮助

    TCP和UDP端口详解

    也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。 例如:许多系统处理动态端口从1024左右开始。 (3)动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上, 不应为...

    虚拟串口转TCP/UDP软件

    虚拟串口转TCP/UDP工具,可以在电脑上创建一个虚拟串口绑定一个TCP/UDP端口,然后使用串口调试工具和远端网络设备通信

    基于QT实现TCP,UDP测试工具

    用qt写的简单的用于tcp/udp测试的小工具: 1.可用于UDP发送和接受,可绑定本地发送端口 2.可用于TCP发送和接受,实时显示当前连接信息

    TCP/IP网络端口详解(包含各种常用端口)

    也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。 (3)动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务...

    基于Qt5的UDP局域网通信软件(简单).zip

    使用QT中的UDP协议封装,设计的简单的局域网通信软件,通过绑定同一个ip地址下的不同端口号的客户端,实现通信连接,对理解UDP协议在Qt中的使用,有一定的帮助(注意,此为项目源文件,可直接使用QT进行编译)。

    tcp udp.rar_C++_socket_tcp_udp 流程

    1. 创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1) 创建套接字(socket) 2) 将套接字绑定到一个本地地址和端口上(bind) 3) 将套接字设定为监听模式,准备接受客户端

    端口基础常识大全+常用端口对照

    TCP,UDP端口基础常识大全+常用端口对照,端口基础常识大全 端口可分为3大类: 1) 公认端口(Well Known Ports):从0到1023,它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口...

    src.zip_Listen!_ReceiveFrom_socket绑定端口

    确定本机的IP和端口,socket只有与某一IP和端口绑定,才能发挥其功能。 b.确定通讯协议:TCP 或 UDP。 编程步骤: a.建立一个套接字 b.绑定本机的IP和端口 c.如果是TCP,因为是面向连接的,要利用Listen()方法来监听...

    TCP_UDP对结构体加密数据传输

    TCP,UDP混合传输过程中绑定不同的端口,server和client相当与采用异步方式对结构体数据进行传输,两个简单的混合加密只采用了其中之一,给出两个大数的指数幂函数与取模函数。对于server端的同步方式应可采用SOCK...

    6种查看Linux进程占用端口号的方法详解

    对于 Linux 系统管理员来说,清楚某个服务是否正确地绑定或监听某个端口,是至关重要的。...套接字是和 IP 地址、软件端口和协议结合起来使用的,而端口号对传输控制协议(TCP)和用户数据报协议(UDP)协议都适用,TCP

    UDP单播 、组播、广播,使用Qt实现,工程文件包,下载解压缩直接导入工程即可

    UDP是轻量的、不可靠的、面向数据报、无连接的协议,它可以用于对可靠性要求不高的场合,和TCP通信不同,两个程序之间进行UDP通信无需预先建立持久的socket连接,UDP每次发送数据报都需要指定目标地址和端口。...

    UDP/TCP网络助手调试工具

    捕获网络信息,如UDP或TCP发来的消息,调试便捷。可绑定IP和端口。在安卓端使用最为便利。省去大量时间去写捕获log

    portfree:查找免费的 TCP 或 UDP 端口号-开源

    portfree (pf) 通过尝试在 IPv4 地址 0.0.0.0 或给定的 IPv4 地址处打开和绑定具有该端口号的套接字来查找空闲的 TCP 或 UDP 端口号。 ~~~非常感谢 Ingo Schaefer 和 Sascha Rommelfangen!~~~

    计算机网络 python socket通信

    它基于套接字(socket)API,通过TCP或UDP协议在网络上建立连接并传输数据。 以下是使用Python的socket库进行通信的一般步骤和描述: 创建套接字(socket):使用socket库的socket()函数创建一个套接字对象,并...

    端口转发工具

    该功能可以实现将绑定IP地址特定端口侦听到的数据转发到指定的IP和端口。可以用于拥有双网卡机算机中内外网连接打通,路由的功能。支持TCP, UDP协议。

    chatRoom.rar

    然后服务器进行监听,收到广播后,首先进行解析头部信息是否符合预期,如果符合则进行回送数据,回送服务器端的将要进行的TCP连接(服务器已经绑定了基本的信息)的信息(服务器端TCP绑定的端口)以及客户端要验证的...

    IPOP软件是一个IP工具的集合,最原始的功能是IP地址动态绑定

    IP地址动态绑定功能;路由信息查询和配置功能; MAC地址查看、MAC地址更改;MAC地址与厂家对应表;MAC、主机信息扫描; 本地网络报文统计;...TCP、UDP、Telnet、FTP、TFTP、WEB、群组通信等服务器功能。

    在Python下进行UDP网络编程的教程

    TCP是建立可靠连接,并且通信双方都可以以流的...和TCP类似,使用UDP的通信双方也分为客户端和服务器。服务器首先需要绑定端口: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定端口: s.bind(('127.

Global site tag (gtag.js) - Google Analytics