端口号属于协议还是进程

  我们知道,在操作系统中,端口号用于标记本机中的一个进程。而在计算机网络中,运输层使用一种叫做协议端口号(protocol port number)的东西。问题是,协议端口号与进程的端口号是同一事物。那么,端口号究竟是与进程对应,还是与协议相对应呢?

  实际上,端口号是来标记一个进程的,端口号与协议本质上没有必然联系。在解释这个问题之前,让我们先回顾端口号的用途。无论是操作系统还是计算机网络中的端口号,都是用于解决进程之间通信的问题。端口号就好比手机号,它的好处在于可以以数字化的方式唯一标识一部手机。与对方通信时,输入对方的手机号总比输入对方的姓名、家庭地址等要可靠很多。因此,进程之间进行通信时,就把端口号看成是对方进程的代表,而无需获得其它更复杂、耦合性更强的信息,如进程中某数据的内存地址等等。应该说,IP 用于确定网络上的一台主机,端口号用于确定该主机上的一个进程。

  但是,这里有一个发明端口号这种方法自身无法解决的问题。如果必须知道端口号之后才能通信,然后端口号也通过通信的方式传递,那么这将是一个死循环,因为不能依靠打电话的方式来得知对方的电话号码。因此,对方的端口号必须提前得知,于是需要事先约定一些端口号。不过这是个问题,因为一个端口号只能被一个进程所使用,如果只规定一个端口号,多主机之间的互相通信将受到极大的限制。另外,通信过程中还涉及传输的数据类型,不同的数据类型,传输时的内部机制也需要不同,因此,通信过程中也需要有办法能够提前标识传输的数据类型。这可以通过规定协议来完成。如果规定传输时不同的数据类型由协议来决定,同时为每个协议规定一个默认端口号,这样一来,端口号、协议、传输的数据类型,这三者只需要知道其中一个,就可以推断出其它两个。因此,只需要对每个协议规定一个默认端口号,这就是熟知端口号(well-known port number)。

  不过,一方面,端口号是有很多个的。对于运输层 TCP,端口号为 16 位,一共可以有 65536 个(也有人认为是 65535 个,因为 0 号端口一般不使用)。为这么多端口号各自规定一个协议是不现实的。另一方面,运输层的报文中会给出端口号。因此,在传输过程中实际上不需要额外给出协议名。

  这么说的话,好像没有必要定义协议这种东西,实际的通信过程不是只用了端口号吗?其中的缘由解释起来很麻烦。首先,端口号这种东西在编程业界称为魔鬼数字,没有人喜欢背这些个无意义的数字(记协议名显然要容易很多)。另外,就通信的收发数据而言,确实是只需要端口号,但想要通信成功还要其它要素,其中一个必要条件就是提前知晓对方传输数据的数据类型。举个例子,一个人想要能听懂对方所的话,一个基本的条件就是,空气中能够传输声波。可是,光满足这个还不行,还需要双方使用同一种人类语言。计算机之间的通信也是类似的,光有端口号还不行,还要对传输数据进行编码与解码。为什么要这么做?原因有很多,其中一个就是计算机的通信链路最多只能直接传输两种数据:文本数据和二进制数据。所幸任何数据都可以用这两种数据来表示。如果想传输非文本数据,发送方必须对数据先进行编码(转化为二进制数据),再发送,然后接收方接收到数据之后,必须先解码再使用。解码的关键是知道需解码数据的数据类型。另外,数据还有格式的问题。发一篇文章,如何知道哪些是文本属于标题,哪些是段落?除此之外,通信还要很多要注意的问题。当接收方正在接收数据时,如何知道对方是否已经发完了本次要传输的数据,还是因网络问题而暂时中断传输?这些问题都可以且必须通过通信双方遵守某种协议来解决。因此协议本来就是需要存在的东西,只是通过熟知端口号来将协议与端口号之间关联了起来。

  但是,这又回到开始的问题,如何提前知道端口号?实际上,作为发送方,不需要接收方提前告知端口号,因为发送方会假设接收方使用这种端口号。这同样是提前约定的好处。前面有言,端口号与协议之间可以互相推导,然后如果发送方假设对方会接受哪种协议,那就不需要提前传递任何信息。发送方如何确定这种假设成立呢?这很简单,如果它发现使用这个与协议绑定的端口号进行通信时失败,就说明对方不同意使用这种协议,如果通信成功,就认为对方同意使用这种约定。因为这都可以事先约定,所以这不是什么碰运气的事情。

  因此,端口号是与进程相绑定的,同时它也有可能就是某个协议建议的默认值。如果使用 URL 进行通信,但是没在 URL 给出端口号,那就相当于给出的是 URL 中的协议的默认端口号。

  另外,只有进行进程间通信的进程才会拥有端口号。对于一个不进行网络连接的进程,操作系统是不会为其它分配端口号的。而且,一个进程可以占用多个端口号,但一个端口号只能被一个进程所使用。

端口号属于协议还是进程相关推荐

  1. 常见的端口号以及协议

    常见的端口号以及协议 从平常最小的渗透测试到我们熟知的大型红蓝对抗.攻防演练还有HVV,最重要同样也是最可能被忽略的一部分就是对常见端口以及协议的信息收集,我们对一些常见的端口号都能快速讲出来,而对于 ...

  2. liux常用命令(查看及其开放防火墙端口号+查看及其杀死进程)

    liux常用命令 一.Linux防火墙开启关闭.开放端口命令 注意:端口号开放后要记得重启防火墙 1.查看防火墙状态: systemctl status firewalld 2.开启防火墙: syst ...

  3. android 端口进程号,Android中如何根据端口号寻找对应的进程

    1. Android的netstat netstat代码如下所示: int netstat_main(int argc, char *argv[]) { printf("Proto Recv ...

  4. 各路由协议的协议号_协议号和端口号大全

    协议号和端口号大全 协议号和端口号大全协议号是存在于 IP 数据报的首部的 20 字节 的固定部分,占有 8bit. 该字段是指出此数据报所携带的是数据是使 用何种协议,以便目的主机的 IP 层知道将 ...

  5. Linux查看进程端口号的几种方法

    1.lsof 命令 lsof 是 linux 下的一个非常实用的系统级的监控.诊断工具.它的意思是 List Open Files,它可以用来列出被各种进程打开的文件信息,linux 下 " ...

  6. 常用端口与udp协议

    文章目录 1.再谈端口 1.1五元组 1.2端口号范围划分 1.3两个指令 1.3.1netstat 1.3.2pidof 2.UDP协议 2.1协议整体格式 2.2udp特点 2.3udp缓冲区 1 ...

  7. 【网络篇】第三篇——源端口号和目的端口号

    端口号的定义 理解源端口号和目的端口号 PORT VS PID 端口号如何确定? 端口号于协议 认识TCP协议和UDP协议 端口号的定义 数据链路层的地址是MAC地址,用来识别同一链路中不同的计算机 ...

  8. 网络编程-IP地址、端口号、网络字节序

    IP地址.端口号.网络字节序 本文中部分名词可见: 协议.TCP/IP模型.数据包封装与分用 一.IP地址 1. 简单认识 IP协议有两个版本:IPv4和IPv6. (1)IP地址在IP协议中,用来标 ...

  9. IP地址、端口号、网络字节序

    本文中部分名词可见: 协议.TCP/IP模型.数据包封装与分用 一.IP地址 1. 简单认识 IP协议有两个版本:IPv4和IPv6. (1)IP地址在IP协议中,用来标识网络中不同主机的地址. (2 ...

最新文章

  1. BCH半月热点事件回顾
  2. zabbix 进阶(二)
  3. Git提交项目到GitHub
  4. 业务基础平台产品的现状和发展
  5. BugKuCTF WEB 域名解析
  6. [Abp 源码分析]后台作业与后台工作者
  7. Java中如何实现线程的超时中断
  8. rem、px、em之间的区别以及网页响应式设计写法
  9. ssm框架重定向_精选 SSM 框架面试题整理
  10. jmeter web监听结果_监听器-聚合报告监听性能测试结果
  11. 阿里巴巴Java开发 之 MySQL规约
  12. vc有关 directx组态,和dxsdk_extras(directshow)
  13. TensorFlow是什么
  14. 在Linux环境下select函数的初体验
  15. Android系统分辨率修改方法,Android:系统分辨率的修改
  16. xml网站地图在线生成制作工具
  17. 软件推荐,强力卸载软件geek uninstaller
  18. 小葵花妈妈课堂开课了:《AsyncTask源码分析》
  19. 空军资深战略研究员:房地产支撑不起大国崛起
  20. CSS设置表格行列,给bootstrap table设置行列单元格样式

热门文章

  1. 区块链行业级应用服务商识数信科获千万元天使轮融资...
  2. AJAX(Asynchronous JavaScript And XML)
  3. Android中垃圾回收日志信息
  4. Ubuntu14.04 kylin 安装配置Tomcat7服务器
  5. 豆瓣评论9.5的《Effective Python》,帮你解决80%难题!
  6. 前端三大技术 HTML、CSS、JavaScript 快速入门手册
  7. 11个提升编程能力的小方法
  8. linux centos删除安装的包,CentOS yum认为已删除的软件包仍在安装中
  9. mysql utf8跟utf8mb4_MySQL utf8 和 utf8mb4 的区别
  10. ppt android sdk,《0.AndroidSDK概述.ppt