说起端口,对于网络编程的人来说已经很熟系了,我原来以为我也很熟悉,可是当我深入了解的时候,计算机系统中的端口不仅仅是一个入口,可能很多人会说端口是“计算机与外界交流的出口”,其实我很好奇为什么是“出口”,这个端口到底是做何用的?
下面是java中会用到端口的一段代码:
ServerSocket server = new ServerSocket(8000);
然后客户端发起连接请求socket:
Socket socket = new Socket(ip,8000);
Socket中的端口参数我最初的理解是:服务器端开启了一扇"门",然后客户端去请求这扇“门”,如果是开着的,那么我们“拉条线”,用这跟“线”进行通讯。可是我每次想关于这个“门”在计算机中是如何表示的,我们如何通过这根线进行通讯的时候我就不求甚解,觉得就是那样的一个“出口”。上完课回来翻了翻书(深入理解计算机系统),知道了为什么会有端口的说法:
cpu使用一种存储器映射的技术向io设备发送命令,每一个io外部设备在内存中都会有它自己的门牌映射,外部设备会监听该地址的值的变化,比如某一个磁盘控制器被映射到0&a0地址,当cpu发送命令到改地址时,改地址所存储的值变化导致存储器总线开始传递信号给磁盘控制器,该控制器将信号转换为特定的命令从而到达读写;
我们就知道了端口是外部设备与cpu通信的桥梁,当我们进行网络套接字连接请求的时候,外部设备(网络适配器)会有很多的映射(因为网络通信的协议规定了很多不同的端口),当网络适配器接收到了来自外部的命令请求如创建套接字,这样请求信号就会通过io总线传递到内存中的某一个地址(8000),如果该地址中存在等到连接请求的信号,那么就返回一个成功的应答请求从而建立连接。
端口是一个存放与外部通信相关命令,数据,标识的地址,存于内存中。