端口号的定义

理解源端口号和目的端口号

PORT VS PID

端口号如何确定?

端口号于协议

认识TCP协议和UDP协议


端口号的定义

数据链路层的地址是MAC地址,用来识别同一链路中不同的计算机

网络层(IP)的地址是IP地址,用来识别TCP/IP网络中互连的主机和路由器

传输层中类似于地址的概念就是端口号

端口号用来识别同一台计算机中进行通信的不同应用程序

端口号也被称为程序地址

理解源端口号和目的端口号

首先我们需要明确的是,两台主机之间通信的目的不仅仅是为了将数据发送给对端主机,而是为了访问对端主机上的某个服务。比如我们在用百度搜索引擎进行搜索时,不仅仅是想将我们的请求发送给对端服务器,而是想访问对端服务器上部署的百度相关的搜索服务。

根据端口号识别应用

一台计算机上可以同时运行很多个程序

比如接受WWW服务的Web浏览器,电子邮件客户端,远程登录用的ssh客户端等等这些程序都可以同时运行,传输层的协议刚好是利用这些端口号识别主机中正在进行通信的应用程序,才可以达到准确的数据传输。

socket通信的本质

现在通过IP地址和MAC地址已经能够将数据发送到对端主机了,但实际我们是想将数据发送给对端主机上的某个服务进程,此外,数据的发送者也不是主机,而是主机上的某个进程,比如当我们用浏览器访问数据时,实际就是浏览器进程向对端服务进程发起的请求。

也就是说,socket通信本质上就是两个进程之间在进行通信,只不过这里是跨网络的进程间通信。比如逛淘宝和刷抖音的动作,实际就是手机上的淘宝进程和抖音进程在和对端服务器主机上的淘宝服务进程和抖音服务进程之间在进行通信。

因此进程间通信的方式除了管道、消息队列、信号量、共享内存等方式外,还有套接字,只不过前者是不跨网络的,而后者是跨网络的。

端口号

实际在两台主机上,可能会同时存在多个正在进行跨网络通信的进程,因此当数据到达对端主机后,必须要通过某种方法找到该主机上对应的服务进程,然后将数据交给该进程处理。而当该进程处理完数据后还要对发送端进行响应,因此对端主机也需要知道,是发送端上的哪一个进程向它发送的数据请求。

端口号(port)的作用实际就是标识一台主机上的一个进程。

  • 端口号是传输层协议的内容。
  • 端口号是一个2字节16位的整数。
  • 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理。
  • 一个端口号只能被一个进程占用。

由于IP地址能够唯一标识公网内的一台主机,而端口号能够唯一标识一台主机上的一个进程,因此用IP地址+端口号就能够唯一标识网络上的某一台主机的某一个进程。

当数据在传输层进行封装时,就会添加上对应源端口号和目的端口号的信息。这时通过源IP地址+源端口号就能够在网络上唯一标识发送数据的进程,通过目的IP地址+目的端口号就能够在网络上唯一标识接收数据的进程,此时就实现了跨网络的进程间通信。

注意: 因为端口号是隶属于某台主机的,所以端口号可以在两台不同的主机当中重复,但是在同一台主机上进行网络通信的进程的端口号不能重复。此外,一个进程可以绑定多个端口号,但是一个端口号不能被多个进程同时绑定。

PORT VS PID

端口号(port)的作用唯一标识一台主机上的某个进程,进程ID(PID)的作用也是唯一标识一台主机上的某个进程,那在进行网络通信时为什么不直接用PID来代替port呢?

进程ID(PID)是用来标识系统内所有进程的唯一性的,它是属于系统级的概念;而端口号(port)是用来标识需要对外进行网络数据请求的进程的唯一性的,它是属于网络的概念。

一台机器上可能会有大量的进程,但并不是所有的进程都要进行网络通信,可能有很大一部分的进程是不需要进行网络通信的本地进程,此时PID虽然也可以标识这些网络进程的唯一性,但在该场景下就不太合适了。

比如每个人都有自己的身份证号,身份证号已经可以标识我们的唯一性了,但是当我们到了学校还是会有学号,到了公司还是会有工号。这是为什么呢?为什么不直接用身份证号来代替学号和工号呢?

因为身份证号是国家用于行政管理时用的编号,而学号是学校用于管理学生时用的编号,工号是公司用于管理员工时用的编号。但并不是全中国人都在某所学校或某家公司,因此在学校或公司当中,没必要用身份证号来标识每个人的唯一性。此时就出现了学号和工号,在学号和工号当中还可以包含一些便于管理的信息,比如入学(入职)年份、性别等信息。

也就是说,在不同的场景下可能需要不同的编号来标识某种事物的唯一性,因为这些编号更适合用于该场景。

底层如何通过port找到对应进程的?

实际底层采用哈希的方式建立了端口号和进程PID或PCB之间的映射关系,当底层拿到端口号时就可以直接执行对应的哈希算法,然后就能够找到该端口号对应的进程

端口号如何确定?

实际当中进行通信之前要先确定端口号

  • 标准既定的端口号,也叫做静态方法。每个应用程序都有指定的端口号,不是随意的使用任何一个端口号,每个端口号都有对应的使用目的,当然一个端口的作用可以不止一个,HTTP,TELNET等应用协议中所使用的端口号都是固定的,这些端口号也可以叫做知名端口号,一般由0-1023的数字分配的。其他端口号也被正式注册了,1024-49151之间的,这些端口号可以被用于任何通信用途
  • 时序分配法,动态分配法。服务端有必要确定监听端口号,但是客户端没有必要确定端口号,客户端应用程序可以完全不设置自己的端口号,交给操作系统进行分配,在之前的端口号基础上加上1,操作系统就可以动态的管理端口号了,动态分配端口号即使同一个客户端发起多个TCP连接,识别通信的5部分数据也不全部相同,不会冲突。动态分配端口号在46152-65535之间

端口号于协议

一个服务的端口号由其使用的传输层的协议决定,不同的传输层协议可以使用相同的端口号,比如TCP和UDP,但是使用的目的不一样,端口号上面进行的处理也是根据每个传输协议的不同而进行的。数据到达网络等之后(IP层),会先检查IP首部中的协议号,再传给相应协议的模块去处理,再由TCP或者UDP去进行端口处理,HTTP通信必须使用TCP,因为UDP的80端口并没有开启。53端口在TCP和UDP中都用于DNS服务,80端口在TCP和UDP中都用于HTTP服务。

认识TCP协议和UDP协议

网络协议栈是贯穿整个体系结构的,在应用层、操作系统层和驱动层各有一部分。当我们使用系统调用接口实现网络数据通信时,不得不面对的协议层就是传输层,而传输层最典型的两种协议就是TCP协议和UDP协议。

TCP协议

TCP协议叫做传输控制协议(Transmission Control Protocol),TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议

TCP协议是面向连接的,如果两台主机之间想要进行数据传输,那么必须要先建立连接,当连接建立成功后才能进行数据传输。其次,TCP协议是保证可靠的协议,数据在传输过程中如果出现了丢包、乱序等情况,TCP协议都有对应的解决方法。

UDP协议

UDP协议叫做用户数据报协议(User Datagram Protocol),UDP协议是一种无需建立连接的、不可靠的、面向数据报的传输层通信协议。

使用UDP协议进行通信时无需建立连接,如果两台主机之间想要进行数据传输,那么直接将数据发送给对端主机就行了,但这也就意味着UDP协议是不可靠的,数据在传输过程中如果出现了丢包、乱序等情况,UDP协议本身是不知道的。

既然UDP协议是不可靠的,那为什么还要有UDP协议的存在?

TCP协议是一种可靠的传输协议,使用TCP协议能够在一定程度上保证数据传输时的可靠性,而UDP协议是一种不可靠的传输协议,UDP协议的存在有什么意义?

首先,可靠是需要我们做更多的工作的,TCP协议虽然是一种可靠的传输协议,但这一定意味着TCP协议在底层需要做更多的工作,因此TCP协议底层的实现是比较复杂的,我们不能只看到TCP协议面向连接可靠这一个特点,我们也要能看到TCP协议对应的缺点。

同样的,UDP协议虽然是一种不可靠的传输协议,但这一定意味着UDP协议在底层不需要做过多的工作,因此UDP协议底层的实现一定比TCP协议要简单,UDP协议虽然不可靠,但是它能够快速的将数据发送给对方,虽然在数据在传输的过程中可能会出错。

编写网络通信代码时具体采用TCP协议还是UDP协议,完全取决于上层的应用场景。如果应用场景严格要求数据在传输过程中的可靠性,此时我们就必须采用TCP协议,如果应用场景允许数据在传输出现少量丢包,那么我们肯定优先选择UDP协议,因为UDP协议足够简单。

注意: 一些优秀的网站在设计网络通信算法时,会同时采用TCP协议和UDP协议,当网络流畅时就使用UDP协议进行数据传输,而当网速不好时就使用TCP协议进行数据传输,此时就可以动态的调整后台数据通信的算法。

【网络篇】第三篇——源端口号和目的端口号相关推荐

  1. 由 TCP 报文格式谈 TCP — 源端口号、目的端口号、报文段序号(一)

    博主曾经学 Linux 的时候,觉得知识点很多很难很困惑,遂问一前辈,怎么才能学通学精达到融会贯通,前辈意味深长地丢给博主三个字:写博客.博主于是屁颠屁颠儿地跑过来写博客了,本人大三网络工程专业,最近 ...

  2. CMD专业 :taskkill :::强制结束各种进程---查询端口号及占用端口号等

    Window 中杀死指定端口 cmd 命令行 taskkill 前言: 对于经常会遇到电脑卡死啊,进程结束不了啊,界面卡死之类的,什么谷歌的无响应啊之类的,有关比不了,特别烦的就可以用以下方法解决啦, ...

  3. 查看mysql 默认端口号和修改端口号

    1. 登录mysql mysql -u root -p //输入密码 2. 使用命令show global variables like 'port';查看端口号 mysql> show glo ...

  4. jenkins查看端口号 修改默认端口号

    在linux下修改jenkins端口号: 修改/etc/sysconfig/jenkins文件 修改里面的JENKINS PORT, 改为你要的端口. 然后重启jenkins vim /etc/sys ...

  5. mac系统上查看mysql数据库端口号及解决端口号为0问题

    首先终端输入 mysql 回车, 则会在末尾出现 然后再输入 show global variables like 'port'; 回车, 查看端口号,会看到如下信息: 3306则是我电脑上的端口号, ...

  6. 串口发送tcp数据 源端口号_三分钟基础知识:用动画给面试官解释 TCP 三次握手过程...

    作者 |  小鹿 来源 |  小鹿动画学编程 写在前边 TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐. 对于这部分掌握以及 TC ...

  7. 我们身边的计算机网络作文,关于网络的作文三篇

    关于网络的作文三篇 网络是现如今最热门的科技,它丰富这我们的生活,为我们的生活带来便利,但也为我们带来不安.下面小编为大家收集整理了关于网络的作文,欢迎阅读与借鉴! 关于网络的作文篇一: 是新一代信息 ...

  8. 【网络初识】IP地址,端口号的概念;TCP/IP五层模型;封装和分用

    文章目录 1. 局域网LAN 2. 广域网WAN 3. 网络通信基础 3.1 IP地址 3.2 端口号 4. 认识协议 5. 五元组 6. 协议分层 6.1 OSI七层模型 6.2 TCP/IP五层模 ...

  9. 【Java 18】网络编程 - 概述、网络编程要素、IP和端口号、网络协议、TCP、UDP、URL

    网络编程 - 概述.网络编程要素.IP和端口号.网络协议.TCP.UDP.URL 网络编程 1 网络编程概述 2 网络通信要素概述 3 通信要素1:IP和端口号 3.1 内容 3.2 InetAddr ...

最新文章

  1. Bootstrap4+MySQL前后端综合实训-Day02-PM【新闻管理后台(登录页面、首页)、#left>a:nth-child(4) {}】
  2. 2的32次方减1用python,第二章python入门
  3. JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser
  4. 闭包---在函数内部再定义一个函数
  5. 软件设计开发笔记1:基于状态机的程序设计
  6. mysql要将语句反复执行15次_MySQL多表查询疑问
  7. 我一个普通程序员,光靠GitHub打赏就年入70万,其实你也可以
  8. html5控制gif图的播放和暂停,使用JS和canvas实现gif动图的停止和播放代码
  9. 谷歌地图离线包-尝试
  10. latex中Winedt和Sumatra PDF互联设置及失效解决
  11. 内与外的困惑:找出System进程占用100%CPU的元凶
  12. css实现简单几何图形
  13. 计算机显示应用程序错误窗口,电脑出现应用程序错误窗口怎么办
  14. 几何畸变的类型_几何畸变分为()和()。
  15. 解密X-Change2的脚本
  16. 2022CTFSHOW菜狗杯部分MISC(一)
  17. c语言编程TLC2543AD采集,基于C语言的89C51与TLC2543AD转换器的驱动程序的设计 实训报告...
  18. 110配线架打法图解_110配线架的打线方法图例
  19. app抓包工具_抓包助手app下载安装_抓包助手软件最新版免费下载
  20. Android App Dark Theme(暗黑模式)适配指南

热门文章

  1. GRE Issue 分类题库及翻译
  2. 手把手教你音乐服务器搭建
  3. 周志华《机器学习》西瓜书新出算法推导视频!(超级详细)
  4. win10彻底关闭自动更新方法步骤:
  5. 科学史十五讲(江晓原)
  6. 【融职培训】Web前端学习 第10章 小程序开发4 小程序开发
  7. springboot集成阿里云短信验证码
  8. shell语法 函数
  9. 直播预告 | NeurIPS 专场八
  10. APP稀有资源及19种无需编程的App创建工具