icp备案系统网站,微信公众帐号平台官网,交流做病理切片的网站,手机网站建设的趋势【网络通信】传输层之UDP协议 传输层端对端通信实现端到端通信的关键技术 UDP协议再谈端口号端口号划分关于端口号的两个问题 UDP协议基本格式UDP通信的特点UDP的缓冲区UDP数据报的最大长度基于UDP的应用层协议如何封装UDP报文以及如何交付UDP报文进一步理解封装和解包 传输层 … 【网络通信】传输层之UDP协议 传输层端对端通信实现端到端通信的关键技术 UDP协议再谈端口号端口号划分关于端口号的两个问题 UDP协议基本格式UDP通信的特点UDP的缓冲区UDP数据报的最大长度基于UDP的应用层协议如何封装UDP报文以及如何交付UDP报文进一步理解封装和解包 传输层 传输层Transport Layer是计算机网络体系结构中的一个重要层次它主要负责端到端的通信确保数据能从一个终端节点传到另一个终端节点。它是OSI七层模型中的第四层也是TCP/IP协议中的重要层之一。它主要提供面向连接和无连接的服务。 端对端通信 端对端通信简单来说就是只关注两个终端之间的直接通信而忽略了底层网络的差异为用户提供简单的网络通信模型。端终端设备。 我们举个通俗点的例子来理解端对端的通信
假设此时你在给你的朋友写信信写完后会通过快递员运输虽然可能你的信件会经过很多地方但是这些地方都不会关注你的信件的具体内容它只有到你朋友这里才会被拆封最终信件到你朋友这里逻辑上就好像你们直接通信一样 端对端通信就像这样只不过是在网络中一条信息经过主机A发送给主机B中间可能经过很多的路由节点但是这些路由节点只负责传输数据并不关系具体内容最终消息会到主机B手中。逻辑上可以认为是这两个终端直接通信。
实现端到端通信的关键技术
传输层协议如前面提到的TCP和UDP。TCP提供了一种面向连接的服务保证了数据的可靠传输而UDP则是一种无连接的服务虽然不保证数据的可靠性但是具有较低的延迟适用于实时性要求较高的场景。路由选择利用IP地址和路由算法决定数据包的最佳路径。尽管路由器不知道所承载的应用层数据的具体意义但它们根据网络拓扑结构来决定如何最有效地转发数据包。防火墙与NAT穿越为了确保端到端的安全性和可访问性还需要解决诸如防火墙限制和网络地址转换(NAT)带来的挑战。这通常涉及到特定的技术如STUN、TURN和ICE等用于帮助建立P2P连接。
下面我们来介绍传输层的两大重要协议UDP与TCP协议。
UDP协议
再谈端口号
端口号是用来标识某个主机中提供网络服务的进程的它可以区分不同的提供网络服务的进程因为主机中可能有很多进程在同一时刻提供网络服务。 在TCP/IP协议中使用源IP、源端口号、目的IP、目的端口号、协议号这样一个五元组来标识一个通信我们可以使用指令netstat -n来查看 Proto协议Protocol。显示使用的网络协议这里为tcp表示使用的是TCP协议。Recv-Q接收队列Receive Queue。显示连接当前在本地等待上层应用处理的数据量大小。对于已建立的连接如果这个值不为0可能意味着数据没有被及时读取。在这个例子中它的值是0表明没有未处理的数据。Send-Q发送队列Send Queue。显示连接当前等待远端主机确认的数据量大小。通常在连接正常工作时这个值应该是0除非远端主机没有正确地确认接收到的数据包。此例中也为0。Local Address本地地址。显示本地计算机上的IP地址和端口号。这里的127.0.0.1:44636表示这是一个本地回环接口上的连接即连接发生在本机上端口号为44636。Foreign Address外部地址。显示远程计算机的IP地址和端口号。同样地这里的127.0.0.1:36731表示这也是一个本地回环接口上的连接端口号为36731。这意味着该连接实际上是在同一台机器上的两个进程之间进行的通信。State状态。表示TCP连接的状态。常见的状态包括LISTEN监听、ESTABLISHED已建立、TIME_WAIT等。这里的TIME_WAIT表示该连接已经完成了正常的关闭过程但为了确保网络上的所有数据包都被清除连接暂时保持在这个状态一段时间。
端口号划分
端口号的范围为0~65535,根据注册和用途大致可以分为以下三类 知名端口 范围:0~1023 描述:这些端口通常不会开放给开发者使用它们用作特殊的服务为常见的服务器保留。例如 80 HTTP超文本传输协议用于网页浏览。443 HTTPS安全的HTTP连接通过SSL/TLS加密。25 SMTP简单邮件传输协议用于发送电子邮件。22 SSH安全外壳协议用于安全地远程登录到另一台计算机。 注册端口 范围:1024~49151 描述:这些端口没有被像知名端口一样严格被定义它可以开放给开发者使用。尽管如此许多动态服务也会选择在这个范围内运行只要不与已知的服务冲突即可。 8080 常用作HTTP代理服务器或其他Web服务的备用端口。1433 Microsoft SQL Server 默认实例使用的端口。 动态/私有端口 范围:49152到65535 描述:这些端口主要用于客户端的临时通信。因为客户端一般进行网络服务时bind源端口号都是系统动态bind所bind的都是这里面的端口号由于这些端口是动态分配的因此不应该长期固定地分配给任何特定的服务。
关于端口号的两个问题
一个进程是否可以bind多个端口号。 同一个进程是可以bind多个端口号的如果你想提供不同的服务的话。但是同一个套接字不能bind多个端口号可以在同一个进程中创建不同的套接字同时给它们bind不同的套接字这两个套接字分别用于提供不同的服务。 同一个端口号是否可以被多个套接字bind。 一般情况下同一个端口号不能被多个套接字同时bind。每个套接字bind一个特定的IP地址和端口号组合如果将第二个套接字bind在已经被bind的套接字上就会bind失败。 存在特殊情况在bind前设置套接字模式为SO_REUSEADDR选项允许多个套接字绑定到相同的IP地址和端口组合但这通常仅适用于监听套接字并且主要用于实现高可用性的服务器架构其中多个实例可以接受客户端连接这种情况只是为了让服务器可以快速启动并不是这个端口被多个服务器bind了因为服务器在被ctrl C终止后连接会处于一个TIME_WAIT的状态所以需要等待一段时间但是这个只有TCP才会出现这种问题。
UDP协议基本格式 传输层在OS内核中就是结构体数据例如上面的UDP协议也是可以由结构体来描述其数据的像http协议一样
struct udphdr {__u16 source;//源端口号__u16 dest;//目的端口号__u16 len;//UDP长度__u16 check;//校验和
};相关字段介绍
16位源端口号填充本进程在网络通信中使用的端口号。
16位目的端口号填充通信方在网络通信中使用的端口号。
16位UDP长度填充UDP数据报的总长度包括头部8字节的数据。
16位UDP校验和虽然UDP是不可靠的但是还是提供了简单的数据校验的方法通常这个校验和的计算是有一个固定的方式的与此次通信的协议中的字段相关通过计算填充到这个字段中通过网络传输后再次计算如果两次结果不同就证明传输过程中出现了问题。
UDP通信的特点 无连接UDP通信不需要事先建立连接这一点相信很好理解如果你学习过UDP套接字通信编写过UDP网络通信的echo代码的话。 不可靠UDP协议简单并没有提供很多对数据检验的方法所以数据没有TCP可靠。 面向数据报这一点在网络编程中有体现在创建UDP的套接字时需要将其设置为SOCK_DGRAMDGRAM的中文翻译就是数据报。上述UDP的一个协议就构成一个数据报它是一个独立的实体每个数据报都有自己的头部和有效载荷。
应用层会把数据交付给传输层如果传输层使用的是UDP协议它既不会拆分也不会合并而是原样发送。 example假设此时调用sendto发送1000字节的数据给客户端客户端也必须调用recvform一次性接收1000字节而不能调用10次recvfrom循环接收因为数据包不会被拆分。 UDP的缓冲区 UDP没有发送缓冲区调用sendto后数据会被交给内核中的传输层通过不同的套接字交给不同的协议然后进行相应的封装添加数据头部之后由OS交给网络层。 UDP有接收缓冲区但是这个接收缓冲区不能保证发送的数据报的顺序是否和发送时一致同时当这个缓冲区满了之后数据报会被丢弃。
UDP是全双工的可以同时接收同时发送。
UDP数据报的最大长度
在IPv4中理论上最大的UDP数据报长度可以达到65,535字节因为UDP长度字段是16位能表示的最大值是65,535。如果超过了这个值需要使用者在应用层手动的进行分片。
基于UDP的应用层协议
基于UDP用户数据报协议的应用层协议有很多它们利用了UDP的低延迟、无连接特性适用于那些对实时性要求较高但可以容忍一定程度的数据丢失或乱序的应用场景。以下是一些常见的基于UDP的应用层协议 DNS (Domain Name System) 用途用于将域名转换为IP地址。为什么使用UDPDNS查询通常很小且需要快速响应UDP的低开销和低延迟使其成为理想选择。尽管有时也会使用TCP但大多数DNS查询是通过UDP进行的。 DHCP (Dynamic Host Configuration Protocol) 用途自动分配IP地址和其他网络配置参数给设备。为什么使用UDPDHCP消息较短且频繁使用UDP可以减少处理时间提高效率。 TFTP (Trivial File Transfer Protocol) 用途简单的文件传输协议主要用于启动无盘工作站或在网络设备间传输配置文件等。为什么使用UDPTFTP设计简单不提供复杂的错误恢复机制适合小规模文件传输。 NTP (Network Time Protocol) 用途同步计算机时钟到协调世界时UTC。为什么使用UDPNTP需要高精度的时间同步UDP的低延迟特性有助于实现这一目标。即使偶尔丢失数据包也不会严重影响整体同步精度。
如何封装UDP报文以及如何交付UDP报文 封装UDP报文 当我们从上层应用层拿到数据时直接在数据的前面添加UDP的报头即可。 交付UDP报文 当我们从网络层拿到了一个完整的UDP报文接下来如何将UDP报文的数据交付给上层应用呢我们结合UDP协议来画图分析只关心相关的层
进一步理解封装和解包
如果仅仅理解封装和解包到图的角度还是太肤浅了我们尝试在代码级理解封装和解包。
我们都知道传输层和网络层都属于OS的一部分OS中是可能存在很多报文的这些报文还没来得及处理可能在网络层也可能在传输层的缓冲区我们需要对这些报文做管理先描述后组织。
封装 解包
所以最终的解包和封装就转化成了指针的加减。
管理报文 对报文的管理就转化为了对链表的增删查改。