三十二、传输层篇 您所在的位置:网站首页 端口已经存在 三十二、传输层篇

三十二、传输层篇

2023-02-21 01:28| 来源: 网络整理| 查看: 265

上篇文章说到,网络层的作用范围是主机到主机,而传输层的作用范围细分到了主机中的应用进程到应用进程。

一台主机上可能会同时运行多个应用进程,而传输层就是用端口号来区分同一个主机上不同的应用进程的,那么本篇文章来好好聊聊端口那些事儿~

三十二、传输层篇-端口那些事儿

一、端口的概述

在OSI第2层和第3层中,我们看到需要一个地址来标识与通信方式有关的必要元素。

MAC地址在第2层中标识网卡

IP地址在第3层中标识机器在网络中的地址。

那么,在第4层中,使用的地址是port,即端口。

三十二、传输层篇-端口那些事儿

在TCP的首部中用两个字节来表示端口,即一台主机最大允许 65536 个端口号的。下图为TCP首部格式,可以看到一开始就是2个字节的源端口号和2个字节的目标端口号,对应到之前学习的源MAC地址和目的MAC地址、源IP地址和目的IP地址。

三十二、传输层篇-端口那些事儿

如果将ip地址比作一间房子,端口就是出入这间房子的门。房子一般只有几个门,但是一台主机端口最多可以有65536个。

65536个端口,已经很多了,不是吗?因此,理论上我们在一台电脑上最多可以运行 65536个网络应用程序。

有了 IP 协议,数据包可以顺利的被传输到对应 IP 地址的主机,当主机收到一个数据包时,应该把这个数据包交给哪个应用程序进行处理呢?这台主机可能运行多个应用程序,比如处理HTTP请求的web服务器NginxRedis服务器, 读写MySQL服务器的客户端等。

传输层就是用端口号来区分同一个主机上不同的应用程序的。操作系统为有需要的进程分配端口号,当目标主机收到数据包以后,会根据数据报文首部的目标端口号将数据发送到对应端口的进程。

三十二、传输层篇-端口那些事儿

二、端口号分类-熟知端口号

我们先来看看平时经常碰到的一些端口号:

三十二、传输层篇-端口那些事儿

以上端口号五花八门,可用的范围也很大,达到了0~65535,实际上它被划分为了三种类型或三种范围,我们先说第一种:熟知端口号。

熟知端口也被称为保留端口,由专门的机构由IANA分配和控制,范围为0~1023。

为什么要设置熟知端口号呢,顾名思义,为了能让客户端能随时找到自己,服务端程序的端口必须要是固定的。

比如我们访问HTTP的网站时,比如访问百度http://www.baidu.com,实际上就是向百度的服务器上的80端口发起请求,由于是固定的,所以这里的80也就可用被简略不写了。我们可以执行curl -v http://www.baidu.com命令来看下访问百度地址的效果:

三十二、传输层篇-端口那些事儿

可以看到默认访问的是80端口号,再比如访问HTTPS网站,我们还以百度为例,执行curl -v https://www.baidu.com命令,可以验证默认是443端口号:

三十二、传输层篇-端口那些事儿

那么是否非80的HTTP网站就不行呢?不是的,你可以使用其他的端口来发布你的网站,比如你自己的个人网站是http://www.oursnail.cn:8888,此时就需要显式写出端口号了,而如果你使用的是80端口则不需要,只需要输入http://www.oursnail.cn即可,所以你会选择80还是8888作为你的门户网站访问的端口呢?

三十二、传输层篇-端口那些事儿

三、端口号分类-已登记端口号

已登记的端口不受 IANA 控制,不过由 IANA 登记并提供它们的使用情况清单。它的范围为 1024~49151。

为什么是 49151 这样一个魔数?其实是取的端口号最大值 65536 的 3/4 减 1 (49151 = 65536 * 0.75 – 1)。可以看到已登记的端口占用了大约 75% 端口号的范围。

已登记的端口常见的端口号有:

MySQL:3306

Redis:6379

MongoDB:27017

三十二、传输层篇-端口那些事儿

四、端口号分类-临时端口号

我们看到,我们熟知的端口都是用于服务器应用程序的,但是客户端应用程序呢?需要为它们分配端口吗?显然需要,只是端口号是操作系统随机分配给客户端的,范围至少是要大于1024的。

对于服务器应用程序,由于它一直在监听,比如常见的80或443端口,是大家比较熟知的,因此需要给服务器应用分配比较固定的熟知端口号或已登记端口号。

而客户端应用程序将仅在运行时监听。因此,只要操作系统知道哪个客户端应用程序位于哪个端口即可,所以客户端应用程序只需要使用临时端口号即可。

如果应用程序没有调用bind()函数将socket绑定到特定的端口上,也就是说没有像比如tomcat固定监听在8080端口上时,那么TCP和UDP会为该socket分配一个唯一的临时端口。

IANA 将 49152~65535 范围的端口称为临时端口(ephemeral port)或动态端口(dynamic port),也称为私有端口(private port),这些端口可供本地应用程序临时分配端口使用。

当然了,实际临时端口的范围是由不同操作系统来选择的,一般linux内核端口范围为 32768~60999,可以通过调整/proc/sys/net/ipv4/ip_local_port_range来实现变更,比如在需要主动发起大量连接的服务器上(比如网络爬虫、正向代理)可以调整ip_local_port_range的值,允许更多的可用端口。

三十二、传输层篇-端口那些事儿

五、查看端口被什么进程监听占用

我们已经知道,当机器上运行一个应用程序时,会占据一个端口号,我们如何查看端口号被什么进程监听占用呢?我们以centos操作系统为例。

我们执行netstat -antp命令查看:

三十二、传输层篇-端口那些事儿

可以看到,我在机器上运行了佷多的应用程序,他们目前处于LISTEN监听状态,如Redis占用的是默认的6379端口,mariadb数据库占用了3307和3306端口,还有ssh的22端口,nginx监听着80和443端口对外提供HTTP或HTTPS服务。

我也可以进行筛选,比如我只要展示前10行即可,可以输入netstat -antp | head -n 10:

三十二、传输层篇-端口那些事儿

也可以查询比如3306端口目前的占用情况,输入netstat -antp | grep :3306:

三十二、传输层篇-端口那些事儿

通过这个就可以看出来3306是被mariadb进程监听占用中。

此外,也可以通过lsof命令查看端口被哪个进程监听占用中,因为在linux中,一切皆文件,例如输入命令lsof -n -P -i:80查看80端口是被哪个进程监听的:

三十二、传输层篇-端口那些事儿

可以看到,80端口是被nginx所监听占用中。

三十二、传输层篇-端口那些事儿

六、检查对方端口是否可正常访问

在工作中,我们会经常需要查看对方端口是否打开,以确认网络是否可达,比如调试接口时,我们发现接口调用超时,这个时候我们如何手工验证对方端口是否打开或网络是否可达呢?

我们可以使用nc或telenet命令非常方便的查看到对方端口是否打开或者网络是否可达。

三十二、传输层篇-端口那些事儿

当对方网络未打开或网络不通时会返回”Connection refused” 错误或 “Connection timed out”等错误,此时就需要提供这样的截图告诉运维人员:呐,IP为XX主机到XX主机端口不通,应该有网络限制或路由不通,烦请检查!

原文始发于微信公众号(幕后哈土奇):三十二、传输层篇-端口那些事儿

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/113854.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有