我们经常看到说,TCP 是一对一的两点服务,UDP 支持一对一、一对多、多对多的交互通信。但是使用Tcp工具通讯时,一个Tcp服务端可以连接多个Tcp客户端。所以这里的一对一和一对多是不是冲突了?
并不是。一对一指的是Tcp连接,什么是Tcp连接,这里直接粘贴小林大神的解释。
这些控制信息的组合可以称为连接。那么一对一的意思就是一个控制信息的组合只能针对一个Tcp客户端。
那么Tcp工具是如何实现一对多的通讯的呢?
我这里使用工具建立了一个TCP服务端(5679)和两个TCP客户端(6159和6259)。
网上我看有人解释这个问题是,说是tcp服务端处理多个连接时,内部又创建了新的端口来处理。错!!!我们看下windows上tcp套接字信息就知道了
这里套接字指的是如通信对象的 IP 地址、端口号、通信操作的进行状态等信息。 图中一行相当于一个套接字。为什么需要套接字概念,讲到一对多的实现时就知道了。
可以看到tcp服务端的端口一直都是5679,并没有其他端口显示,所以tcp服务端一直只有一个端口!!!
那tcp服务端是如何处理多用户的连接的呢?
先说结论,服务端的Socket程序做了处理。所以TCP是一对一,Socket实现了一对多!
服务端的socket程序分成两个模块,即等待连接模块和负责与客户端通信的模块 。当服务器程序启动并读取配置文件完成初始化操作后,就会运行等待连接模块。这个模块会创建套接字,然后进入等待连接的暂停状态。接下来,当 客户端连发起连接时,这个模块会恢复运行并接受连接,然后启动客户端通信模块,并移交完成连接的套接字。接下来,客户端通信模块就会使用已连接的套接字与客户端进行通信,通信结束后,这个模块就退出了。
在复制出一个新的套接字之后,原来那个处于等待连 接状态的套接字会怎么样呢?其实它还会以等待连接的状态继续存在,当再次调用 accept,客户端连接包到 达时,它又可以再次执行接受连接操作。接受新的连接之后,和刚才一样,协议栈会为这个等待连接的套接 字复制一个新的副本,然后让客户端连接到这个新的副本套接字上。更详细的原理见下图
非常建议去看《网络是怎样连接的》。