网站开发初学,网站建设的原则有哪些方面,中国会展公司排名前十的公司,太原网络营销推广#x1f320; 作者#xff1a;阿亮joy. #x1f386;专栏#xff1a;《学会Linux》 #x1f387; 座右铭#xff1a;每个优秀的人都有一段沉默的时光#xff0c;那段时光是付出了很多努力却得不到结果的日子#xff0c;我们把它叫做扎根 目录 #x1f449;传输层 作者阿亮joy. 专栏《学会Linux》 座右铭每个优秀的人都有一段沉默的时光那段时光是付出了很多努力却得不到结果的日子我们把它叫做扎根 目录 传输层再谈端口号端口号范围划分认识知名端口号netstatpidof UDP协议UDP协议端格式UDP的特点UDP的缓冲区UDP使用注意事项基于UDP的应用层协议 总结 传输层
传输层在网络层提供的不可靠服务之上主要负责两台计算机之间的端到端的通信为应用层提供可靠的数据传输服务。
再谈端口号 端口号的作用 端口号Port标识了一个主机上进行网络通信的不同的应用程序当主机从网络中获取数据时数据需要自底向上进行交付而上层存在多个应用程序那么交付给哪一个应用程序就有端口号来决定。 五元组标识一个通信 在 TCP / IP 协议中, 用 “源IP”“源端口号”“目的IP”“目的端口号” 和 “协议号” 这样一个五元组来标识一个通信。其中 IP 地址和端口号标识网络中唯一的一个进程而协议号是一个整数用于标识传输层使用的协议类型。常见的传输层协议包括 TCP 协议、UDP 协议等。 五元组可以通过 netstat 命令来查看 -a显示所有网络连接包括正在监听的和建立的连接。-n以数值形式显示网络地址和端口号而不是域名和服务名。-p显示与连接相关的进程和程序名。-r显示当前系统的路由表信息。-s显示网络统计信息如 TCP 和 UDP 的错误、丢包等。-t显示所有 TCP 连接。-u显示所有 UDP 连接。-l显示处于监听状态的连接。
netstat -nltp #显示TCP连接
netstat -nlup #显示UDP连接端口号范围划分
0 - 1023知名端口号HTTPFTPSSH 等这些广为使用的应用层协议它们的端口号都是固定的。1024 - 65535操作系统动态分配的端口号。客户端程序的端口号就是由操作系统从这个范围分配的。
认识知名端口号
有些服务器是非常常用的为了使用方便人们约定一些常用的服务器都是用以下这些固定的端口号
ssh 服务器使用 22 端口ftp 服务器使用 21 端口telnet 服务器, 使用 23 端口http 服务器, 使用 80 端口https 服务器, 使用 443 端口
执行下面的命令可以看到知名端口号。
cat /etc/services
vim /etc/servicessshd 是 Secure Shell Daemon 的缩写它是 OpenSSH 服务器的守护进程其端口号是 22。 一个进程可以绑定多个端口号吗 一个进程可以绑定多个端口号。因为在计算机网络中一个进程可能需要提供不同的服务或处理不同类型的数据流因此需要监听不同的端口来处理来自网络的不同请求。
例如一个 Web 服务器进程可能需要同时监听 HTTP 和 HTTPS 协议的请求因此需要绑定80和443端口。 一个端口号可以被多个进程绑定吗 通常情况下一个端口号只能被一个进程绑定。这是因为端口号用于标识网络上的特定服务当客户端尝试连接到服务器的某个端口时操作系统需要知道哪个进程负责处理该连接请求。如果多个进程绑定到同一个端口号操作系统将无法确定应该将连接请求发送给哪个进程。因此当一个进程试图绑定到已经被另一个进程占用的端口时操作系统通常会返回错误。
但是如果采取的通信协议不同就可以绑定同一个端口号。例如一个进程可以使用 TCP 协议绑定到端口号 80而另一个进程可以使用 UDP 协议绑定到端口号 80。这是因为操作系统不仅根据端口号还根据通信协议来区分不同的服务。因此当客户端尝试连接到服务器的某个端口时操作系统会根据客户端使用的通信协议来确定应该将连接请求发送给哪个进程。 某个报文经过网络传输到达了指定的计算机它是如何交给指定的进程处理的呢 当进程调用 accept 函数获取到一个新连接后会返回一个文件描述符。那么一个连接相当于就是一个文件而接收到报文就相当于将数据放入到文件的接收缓冲区中此时进程就收到了这些数据了。那么现在的问题就转换成如何通过进程绑定的端口号来找到进程了。
当一个报文到达指定的计算机时它首先会被网络协议栈处理。网络协议栈会根据报文中的信息如目标 IP 地址和目标端口号来确定报文应该交给哪个进程处理。操作系统会维护一个端口号到进程的映射表当网络协议栈确定了报文应该交给哪个端口号时它会查询这张映射表找到对应的进程然后将报文传递给该进程进行处理。
netstat
netstat 是一个用来查看网络状态的重要工具。
语法 netstat [选项] 功能查看网络状态 常用选项
n 拒绝显示别名能显示数字的全部转化成数字l 仅列出有在 Listen (监听) 的服务状态p 显示建立相关链接的程序名ttcp仅显示 tcp 相关选项uudp仅显示 udp 相关选项aall显示所有选项默认不显示 LISTEN 相关 pidof
pidof 命令用于查找指定名称进程的进程 ID。 pidof HttpServer | xargs kill -9命令的作用是强制杀死名为 HttpServer 的进程。首先pidof HttpServer 命令会查找名为HttpServer 的进程的进程 ID。然后这些进程 ID 会通过管道传递给 xargs kill -9命令。xargs 命令会将接收到的进程 ID 作为参数传递给 kill -9 命令。最后kill -9 命令会向这些进程发送 SIGKILL 信号强制杀死这些进程。
xargs 命令是一个给命令传递参数的过滤器也是组合多个命令的一个工具。它可以将管道或标准输入stdin数据转换成命令行参数传递给后一个命令也能够从文件的输出中读取数据。xargs还可以将单行或多行文本输入转换为其他格式例如多行变单行单行变多行 将文件的时间更为最新时间 ls | xargs touch将当前目录下文件名中包含 “foo” 的所有文件删除 find . -name *foo* | xargs rm -rfUDP协议
UDP协议端格式 UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长2字节字段组成分别说明该报文的源端口、目的端口、报文长度和校验值。
源端口这个字段占据 UDP 报文头的前 16 位通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。目的端口接收端计算机上 UDP 软件使用的端口占据 16位。长度该字段占据 16 位表示 UDP 数据报长度包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节所以这个值最小为 8。校验值该字段占据 16 位可以检验数据在传输过程中是否被损坏。如果数据报未被损坏网络协议栈会将其传递给上层应用程序进行处理。但是如果数据报在传输过程中丢失或损坏UDP 协议并不会对其进行重传。 UDP 是如何将报头和有效载荷进行分离或如何对有效载荷进行封装以及如何将有效载荷交给上层呢 由于 UDP 报头中包含了源端口、目的端口、报文长度和校验值等信息网络协议栈可以通过这些信息来分离报头和有效载荷。具体来说网络协议栈会根据报文长度字段的值来确定 UDP 报文头和有效载荷的边界。
在分离出有效载荷后网络协议栈会将其传递给上层应用程序进行处理。操作系统会维护一个端口号到进程的映射表当网络协议栈确定了数据报应该交给哪个端口号时它会查询这张映射表找到对应的进程然后将有效载荷传递给该进程进行处理。 为什么应用层使用的端口号类型是 uint16_t 呢 应用层使用的端口号类型是 uint16_t 是因为在 UDP 和 TCP 报文头中源端口和目的端口字段都是 16 位长。这意味着端口号的取值范围是 0 到 65535。uint16_t 类型正好可以表示这个范围内的所有整数因此它被用作应用层端口号的类型。 理解 UDP 报文本身 UDP的特点
UDP 协议是一种无连接的、不可靠、面向数据报的传输协议。
无连接知道对端的 IP 和端口号就直接进行传输不需要建立连接。不可靠没有确认机制没有重传机制。如果因为网络故障该段无法发到对方UDP 协议层也不会给应用层返回任何错误信息。面向数据报不能够灵活的控制读写数据的次数和数量。 为什么说 UDP 协议是面向数据报的呢 UDP 协议是面向数据报的这意味着它将应用层传递给它的数据作为一个独立的数据报来处理。每个数据报都包含了足够的信息使得接收端能够将其独立地传递给上层应用程序。
在 UDP 协议中应用层交给 UDP 多长的报文UDP 原样发送既不会拆分也不会合并。这意味着如果发送端调用一次 sendto 发送 100 个字节那么接收端也必须调用一次 recvfrom 接收 100 个字节而不能循环接收 10 次每次接收 10 个字节。
由于 UDP 协议简单、高效它仍然被广泛用于实时应用、多播和广播等场景。
UDP的缓冲区 sendto、recvfrom、send、recv、write 和 read 等 IO 类接口都是用于在应用程序和操作系统内核之间传输数据的系统调用。它们的本质是在用户空间和内核空间之间拷贝数据。
例如当应用程序调用 sendto 函数发送数据时它会将数据从用户空间拷贝到内核空间然后由内核将数据发送到网络。同样当应用程序调用 recvfrom 函数接收数据时内核会将接收到的数据从内核空间拷贝到用户空间供应用程序使用。
除了拷贝数据之外这些 IO 类接口还会执行其他操作如检查套接字状态、设置套接字选项、处理错误等。因此它们不仅仅是简单的拷贝函数。 UDP的缓冲区 UDP 没有真正意义上的发送缓冲区调用 sendto 会直接交给内核由内核将数据传给网络层协议进行后续的传输动作。UDP 具有接收缓冲区但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致。如果缓冲区满了再到达的 UDP 数据就会被丢弃。 UDP的全双工 UDP 协议支持全双工通信这意味着它可以同时进行发送和接收操作。也就是说应用程序可以在不等待接收完成的情况下发送数据反之亦然。这种全双工的工作方式提高了通信效率使得 UDP 协议能够更好地满足实时应用的需求。
UDP使用注意事项
UDP 协议首部中有一个 16 位的最大长度也就是说一个 UDP 能传输的数据最大长度是 64K包含 UDP 首部。然而 在当今的互联网环境下64 K 是一个非常小的数字如果我们需要传输的数据超过 64K就需要在应用层手动的分包多次发送并在接收端手动拼装。
基于UDP的应用层协议
NFS、TFTP、DHCP、BOOTP 和 DNS 都是基于 UDP 的应用层协议。 NFS 是网络文件系统它允许客户端访问服务器上的文件。 TFTP 是简单文件传输协议它用于在客户端和服务器之间传输文件。DHCP 是动态主机配置协议它用于自动分配 IP 地址和其他网络配置信息。BOOTP 是启动协议它用于无盘设备启动。DNS 是域名解析协议它用于将域名解析为 IP 地址。
当然也包括你自己写 UDP 程序时自定义的应用层协议。
总结 本篇博客主要讲解了端口号划分、知名端口号、nestat 和 pidof 指令、UDP 协议端格式、UDP 的特点、UDP 协议的使用注意事项以及基于 UDP 的应用层协议等等。那么以上就是本篇博客的全部内容了如果大家觉得有收获的话可以点个三连支持一下谢谢大家❣️